CodeQLpy是作者利用python3实现的基于CodeQL的java代码审计工具,github地址https://github.com/webraybtl/CodeQLpy。
通过CodeQLpy可以赞助代码审计职员快速定位代码中的问题,目前支持对SprintBoot的jar包,SpringMVC的war包,直接下载的源码文件夹,maven项目源码等办法进行自动化代码审计,详细利用办法参考github。
本文旨在阐述CodeQLpy在代码审计中的浸染,文章后续所有漏洞均以提交CNVD,以此漏洞从事任何攻击行为均属于违法行为,与本文作者无关。
0x02 案例
用友GRP-U8是一款常见的WEB运用,常常参加比赛的小伙伴一定不会对这个产品陌生,在高校和政府有不错的利用量。如图2.1所示。
图2.1 GRP-U8产品界面
利用CodeQLpy可以直接从目标源码中找到上百个高危的漏洞,包括但不限于反序列化,任意文件上传,任意文件删除,SQL注入,SSRF,XSS等,如图2.2所示。
图2.2 利用CodeQLpy之后的部分结果
总计结果数靠近1000个,个中有效漏洞超过100个。找了几个有代表性的漏洞来演示。
1) 任意文件删除漏洞
POST ViewExcel?djlxid=902&url=logs/info.log.1
漏洞对应的代码在com.ufgov.midas.yy.servlet.ViewExcelServlet,个顶用户可控的source参数是url。
连续跟踪readExcelContent方法,内部处理逻辑很多,可以只关注我们关心的部分。
连续跟踪deleteFile方法,这里可以很清晰的看的文件删除的操作。
2)SQL注入漏洞
/listSelectDialogServlet?slType=slFZX&slCdtn=1=2;waitfor%20delay%20'0:0:3'
漏洞代码在com.ufgov.midas.yy.servlet.ListSelectDialogServlet
连续跟踪getProjectLevel方法,这里可以很清晰的看到进行了SQL语句拼接的操作。
3)任意文件上传漏洞
上传之后会在WEB跟目录天生文件2222.jsp
漏洞代码在com.mobile.action.U8AppProxy
连续跟踪doGet方法
跟进doPost方法,当id=saveheder时会进行文件上传操作
跟进uploadBytes方法,这里便是标准的文件写入的操作
0x03 技巧
由于项目终极保存的结果时csv文件,不利于数据流追踪,可以结合Visual Studio Code(后续简称VS)查看完全的流。
利用CodeQLpy天生的数据库,结合CSV文件中保存的有结果的插件名称,可以在VS中复现漏洞查找过程。
1) 从项目的plugins/java或者plugins/java_ext目录中找到漏洞扫描插件,并复制到VS中。
2) 要查看流,必须利用下面的写法,如图3.1所示。个中下面方框中的注释必须要有,并且终极的查询结果有四列,最好按照图3.1的写法。
图3.1 查看流的ql脚本写法
3) 查当作果中的flow流,可以看到完全的数据流,如图3.2所示。
图3.2 查询ql完全的flow流
0x04 总结
类似的漏洞还有几百个,把创造漏洞交给工具,把验证漏洞留给自己。目前工具仍处于前期测试阶段,如果有任何bug请在github的issue中提出。
玩转CodeQLpy之用友GRP-U8漏洞挖掘