免责声明
本文仅供学习与参考,严禁使用本文中提供的技术信息或代码工具进行任何非法测试或违法行为。若使用者因此造成任何直接或间接损失,后果由使用者自行承担。本文内容仅限学习用途,任何不良后果与文章作者无关。使用者应遵守相关法律法规,尊重他人合法权益。
前言
在一个“阳光明媚”的晚上,看着群里的大佬们挖到几个高危漏洞,心里那个酸,简直想给自己找个洞钻。躺在床上准备睡觉,结果梦到自己在挖某家SRC,GitHub上一搜,泄露的源码就冒出来了。审计一看,卧槽,高危漏洞1500!正准备美滋滋提现的时候,一声二踢脚给我炸回了现实.......差点就提现了!想起昨晚大佬挖到漏洞的场景,我很是羡慕,于是我打开我的大头电脑, 开启了我的“SRC,收获赏金1.3w”之旅……
信息收集
打开某SRC的目标网站,经过一番确认,确定了这是一个值得深入挖掘的项目。有了梦里的经验,我果断开始转向 GitHub,利用语法搜索找到了疑似该网站的源码。点进去一看,果然是对应的 Web 项目!这也太巧了吧?趁着网站还没关闭,我果断开始了一波代码审计。
任意文件上传
直接全局搜索Upload,发现这里有个onlineTalkFileUpload方法,这部分代码做了一个路径拼接判断目录是否存在,并没有任何过滤。
通过 getFileInput()
获取上传的文件,然后利用时间戳生成文件名。这里没有进行任何后缀过滤操作,直接就把文件内容拼接路径后写入到了本地 。
如果代码基础比较薄弱怎么办?直接找姓“G”的给审计一波顺便再让他给构造数据包 。
拼接路径后访问,成功上传。
远程加载文件上传
第二个上传是在download方法下面,通过 URL
获取远程资源内容。
开发居然没做后缀名校验?直接写入到本地。这么贴心的吗?
为了搞个高危漏洞,忍痛花了30块巨款租了台服务器,在Web根目录丢了个测试文本文件,内容用JSP输出个HelloWorld(主机名太骚气,还是不给你们看了)。
CV大法上传漏洞
审第二个上传漏洞的时候,我就想,代码逻辑差不多,找找相似的地方,搜一下关键字,肯定能找到同样的漏洞。结果证明我猜对了,果然有个代码逻辑一模一样的,只不过换了个名字的方法。
这下数据包都不用重新构造了,直接把调用方法一改,非常滴银性化!我爱开发❤️
谁说这上传不行的?这上传可太棒了!
直接搜索大法,找到一个 upload
方法,进来就看到鉴权步骤。别慌,秉着“求知(其实是求财)”的心态,我们接着往下看。
接着看代码。这段代码中获取了 picFolderName
参数值,用来指定文件存放的目录。
imgFile
存储的是上传的文件内容。跟之前的代码一样,根本没对上传的文件做任何过滤,直接写到本地。又让我掏着了,可惜是个后台的。
搞肾透秉承的就是一颗“求知”的心,虽然是后台的漏洞,但我也要拼尽全力复现它,于是……
嘿嘿开个玩笑的了人家肯定不会给我啊,所以直接使用弱口令大法成功登录了一个普通用户后台,构造请求包发送,嘿,您猜怎么着,那叫一个地道~
未授权下载 X 3
在配置文件看路由的时候,发现有个叫 ListToExcel
的方法,啥玩意儿?英文不好,赶紧翻译看看。
阿~~原来如此,我看看怎么个事儿。
跟进 exportPeCustomerListToExcel
方法,发现它拿了一堆参数。接着,这些参数被用来构造一个 PeCustomerInfo
对象,然后作为查询条件传给 peCustomerListDao.getPeCustomerList(queryBean)
,从数据库里捞相关客户信息。
最后,从数据库搜的数据被存成一个 XLSX 文件,直接返回给用户下载。代码里一点鉴权都没有,所以这明显是个未授权下载接口,还是那句话:我爱开发。
构造URL进行请求。
同样的道理,相信看到这里的各位彭于晏都发现了规律——这项目的开发喜欢 CV 啊。那么,是不是这个功能点也跟上面的文件上传一样呢?
直接在路由文件里搜关键字,发现还有两个一样的功能,代码完全一模一样,就是调用方法不同。诶~不愧是当年清华的落榜生,我真是太聪明了。
自信回头,不看代码,直接去复现,OK三个未授权漏洞到手!
任意密码重置
上面咱们说过,拿到了普通用户的账号密码,顺利登录进后台。然后决定黑盒测一下,开个盲盒,第一步就盯上了修改密码的功能点,看这界面挺不安全的,实际上他确实不安全...
一通乱写,抓个包,发现里面有个 userid
,随便改一下发包,结果居然能修改其他用户的账号密码!被改密码的怨种第二天登录后台,发现:诶?我账号咋进不去了?
SQL注入
接着在后台漫游,发现一个搜索框,遇到框框就想注入一下,手痒痒的。
打个单引号,发现返回 SQL 报错了!我丢,居然让我掏着了?
直接发送到测试器,构造 Payload:"userName":"'||1/if(length(database())=6,exp(999),1)||'"
,成功探测到数据库名长度,喜提 SQL 注入一个。
后记
牛皮吹得差不多了,随着闹钟一响,我睡眼惺忪地从床上爬起来,戴上钢盔,又开始了工地搬砖的日子。