前言
oasys 这个项目适合新手代审入门,尝试了下 codeql + 人工
的审计的思路,最后效果还是不错的。
项目地址: https://github.com/misstt123/oasys
环境搭建
调试环境
标准maven项目,README.md有教程,不多赘述。
codeql环境
标准 mvn 项目,一行命令搞定。
1 | codeql database create oasys-database --language=java --command="mvn clean package -Dmaven.test.skip=true" --source-root ./ --ram=32000 --threads=4 --overwrite |
直接使用自带的分析脚本, codeql analyse 一键分析:
1 | # 直接指定查询脚本根目录,codeql会自动递归查找 |
注意:如果不特别指定查询脚本,而默认使用 java-code-scanning.qls
效果差,得用java-security-experimental.qls
可以看到,查出来了 SQL注入、log注入、文件名注入、CSRF等等,codeql当作漏扫还是挺好用的哈哈 XD
组件漏洞
README.md 里写了使用到的组件, 可以看到常见的漏洞组件有:freemaker、fastjson、mybatis
fastjson
漏洞函数:
- parse
- parseObject
parse
和parseObject
,这边我用 codeql 搜索、全局搜索都是没有写对应逻辑的,遂放弃。title:"查找 fastjson 漏洞函数" 1
2
3
4
5
6
7
8
9import java
class Sink extends Method {
Sink() {
this.getName() = "parseObject"
or this.getName() = "parse"
}
}
from Sink sink
select sink,sink.getQualifiedName(),sink.getFile().getAbsolutePath()
freemarker
freemarker 低版本情况下,需要能够上传恶意模板文件,或者修改原有模板文件实现 RCE 或者任意文件读取,但整个项目并没有发现模板修改或者文件上传点,故放弃。
log4j
查看 pom 依赖发现并没有 log4j2-core 这个jar包,项目使用的是 slf4j,虽然log参数可控,但是无法利用。
基础漏洞
informListPaging - SQLI
全局搜索 ${
,notice-mapper.xml
里发现了 like 语句的动态拼接,显然是漏洞点
回溯代码逻辑,参数是否用户可控,最终找到cn.gson.oasys.controller.inform.InformController#informListPaging
,basKey 可控且为字符串类型,显然可控。
构造 payload 实现 like SQL注入
防御思路:like 后的参数改为使用 concat("%",#{xxx},"%")
的形式,不要使用 ${}
动态拼接用户参数。
outaddresspaging - SQLI
和上面的思路一样,全局搜索后在 address-mapper.xml
发现在 like 后面存在滥用 ${}
的情况
根据Mybatis映射规则找到对应路由cn.gson.oasys.controller.address.AddrController#outAddress
,发现参数可控:
然后就是尝试构造payload利用,payload如下:
1 | alph=Jasper' OR '1' like '1 |
Jasper 的叨叨念:在大型项目里(当然不是说这个),有时很难通过代码完整地反推到路由和传参来进行利用,这时可以先找功能点,然后从用户的角度去到处点点 Fuzz 接口,再到yakit里搜索对应路由关键字找到路由
修复方案:like 后的参数改为使用 concat("%",#{xxx},"%")
的形式,不要使用 ${}
动态拼接用户参数。
讨论区 - 存储XSS
普通用户和管理员均可发表讨论,插入任意js代码实现存储xss。
任意用户在讨论区点击查看时触发
防御方式:
- 对用户的输入的特殊字符做实体编码
- 引入 CSP
CSRF
这个是 codeql 找到的,CSRF 逻辑洞我就没去测了,感兴趣的师傅可以试试。
小结
这种个人作者开发的小项目漏洞还是比较明显的,人工审计很快就能找到漏洞点,同时使用 codeql 的自带的 suites 也具备一定的漏洞检出能力。
思考:对于这种小项目,codeql 的优势似乎没有体现出来,另外,我这里把它当作一个静态漏扫工具去使用了,这显然不是它的全部实力