0x01 背景介绍
CodeQLpy是一款半自动化的代码审计工具,能有效提高代码审计的效率,目前项目仍处于测试阶段。项目地址https://github.com/webraybtl/CodeQLpy,在github主页有对应的安装和使用介绍,如图1.1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/ba91754d1919fef30919b708b957b153.png)
-t: 指定待扫描的源码路径。支持文件夹,jar包和war包,如果是文件夹,则必须是网站跟目录。
-d: 指定待扫描的CodeQL数据库。
-c: 指定待扫描的源码是编译前源码还是编译后源码。
-s: 指定是否跳过环境检查,本项目运行依赖于codeql和java环境,首次运行建议不跳过。
-v: 指定待测试源码的jdk版本,目前支持6,7,8,11。默认为8。
这里以某通用WEB应用为例,通过指纹body="changeAccount(\"varAccount\")" || body="KoronCom.TrustedSites"可以在资产测绘平台上找到近3000个资产。
![](https://i-blog.csdnimg.cn/blog_migrate/2ef742e87322da6a9dd8c71ed3ebd43d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1a3c52493acc4d49c61c1ed1aa02d852.png)
0x02 工具使用
该系统的源码是主要由jsp文件和class文件组成,其中部分源码经过混淆,如图2.1所示。其中类名称和字段名称的可读性很差,不方便阅读,而且该系统的代码量较大,大约有4600个文件。如果通过传统的方式来进行代码审计,对审计人员的要求将会非常高。
![](https://i-blog.csdnimg.cn/blog_migrate/8c6df7715530a3c9a66fd8dbf3b936bb.png)
图2.1 经过混淆的源码
使用CodeQLpy可以方便的帮助审计人员从大量源码中发现可能存在的安全隐患,使用步骤如下。
Step1:生成数据库初始化
python3 main.py -t /Users/xxx/Downloads/OAapp/ -c
![](https://i-blog.csdnimg.cn/blog_migrate/c56919695d4506af0152ce21f5759649.png)
图2.2 数据库初始化
最终运行成功之后会相应下一步进行数据库创建的命令。
Step2:生成数据库
这一步直接使用上一步命令最终返回的生成数据库的命令在cmd/bash环境中运行即可
mac命令如下
arch -x86_64 codeql database create out/database/OAapp --language=java --command='/bin/bash -c /Users/xxx/CodeQLpy/out/decode/run.sh' --overwrite
windows命令如下
codeql database create out/database/OAapp --language=java --command='run.cmd' --overwrite
生成的过程中会报很多错误,可以忽略,如图2.3所示。因为这一步创建的数据库是用上一步反编译的源码进行编译,反编译的源码不能保证完全正确,所以会有错。但是有错的源码仍然可以创建数据库,不影响我们进行代码审计。
![](https://i-blog.csdnimg.cn/blog_migrate/a46acbfcb4306f7c2f109e8bcc91c149.png)
图2.3 创建数据库
Step3:代码审计
这一步需要使用上一步命令最终相应的生成数据库的路径,如图2.4所示。
python3 main.py -d /Users/xxx/CodeQLpy/out/database/OAapp/
![](https://i-blog.csdnimg.cn/blog_migrate/6ce75df42a19be9900b62cd7565e25a2.png)
图2.4 使用ql插件分析可能存在的漏洞
最终得到的结果是csv文件,保存路径在out/result/目录,打开对应的文件,如图2.5所示。
![](https://i-blog.csdnimg.cn/blog_migrate/40d19ed08084f1d864b24c292def6aab.png)
图2.5 扫描结果内容
0x03 结果验证
扫描出来的结果很多,我们挑选几个有代表性的进行验证。
1)BeanShell远程命令执行漏洞
相关存在漏洞的文件在com/menyi/web/util/UtilServlet.class,如图3.1所示。从图中可以看出用户可控的输入value,传入了Interpreter类的eval方法,导致BeanShell任意代码执行。
![](https://i-blog.csdnimg.cn/blog_migrate/c96968ae4f07f51fffe0c00487a51c4c.png)
图3.1 BeanShell远程命令执行漏洞
在测试平台上利用此漏洞,如图3.2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/300f22ce61afd7e45e06dbaee6f0eadb.png)
图3.2 BeanShell远程命令执行漏洞exp
2)FilePathInjection任意文件读取漏洞
相关存在漏洞的代码在com.menyi.web.util.ReportServlet.class。如图3.3所示。
![](https://i-blog.csdnimg.cn/blog_migrate/3e8409c9f83085672af8cad7794127ef.png)
图3.3 任意文件读取漏洞
在测试平台上利用此漏洞,如图3.4所示。
![](https://i-blog.csdnimg.cn/blog_migrate/2918f0d0b270aa29376e866e31dcbfd1.png)
图3.4 任意文件读取漏洞Exp
3)SQL注入漏洞
漏洞文件是在com.koron.oa.workflow.OAMyWorkFlowAction.class。如图3.5所示。
![](https://i-blog.csdnimg.cn/blog_migrate/ac3034644934cffcdd59e15f9f962f8d.png)
图3.5 用户可控输入tablename
继续跟进getOAMyWorkFlowInfo,如图3.6所示。
![](https://i-blog.csdnimg.cn/blog_migrate/a44f4f82bff4ac5e9f914e4a5f01b144.png)
图3.6 tableName参数传递到SQL语句