你不必成为一个无所不能的英雄人物。
免责声明:
本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关。
注意:
本免责声明旨在明确指出,本文仅为技术交流、学习和研究之用,不得将文章中的技术用于任何非法目的或破坏行为。发表本文章的作者对于任何非法使用技术或对他人或系统造成的损害概不负责。
阅读和参考本文章时,您必须明确并承诺,不会利用文章中提供的技术来实施非法活动、侵犯他人的权益或对系统进行攻击。任何使用本文中的技术所导致的任何意外、损失或损害,包括但不限于数据损失、财产损失、法律责任等问题,都与发表本文章的作者无关。
本文提供的技术信息仅供学习和参考之用,不构成任何形式的担保或保证。发表本文章的作者不对技术的准确性、有效性或适用性做任何声明或保证。
一般对于一线红队成员而言,不管是免杀,还是代码审计,都是一项非常重要的技能,前者可以逢山开路,后者可以无中生有,就像一支利箭准确的命中目标,快速打开内网的口子。
但是由于代码审计需要扎实的代码功底,以及安全攻防经验,这就需要一些半自动化或者全自动化的工具进行审计,从成千上万行代码中命中漏洞点,这一点不论是代码审计初学者还是领域大牛都需要的一件利器。
而CodeQLpy是一款半自动化的JAVA代码审计工具,能有效提高代码审计的效率。
项目地址:
https://github.com/webraybtl/CodeQLpy
CodeQLpy使用非常简单,三段式的审计方式。
1.三段式审计
java项目(一般需要mvn项目,jar包,WAR包等等),首先需要编译代码:
py -3 main.py -t E:codeqlCodenovel-3.3.0.RELEASE -c
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
生成QL数据库
codeql database create out/database/novel-3.3.0.RELEASE --language=java --source-root="E:codeqlCodenovel-3.3.0.RELEASE" --command="E:codeqlCodeQLpyoutdecode/run.cmd" --overwrite
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
执行规则审计(以一条规则为例)
py -3 main.py -d E:codeqlCodeQLpyoutdatabasenovel-crawl
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
审计结果如下:
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
以上表格就是生成的审计结果,包含了漏洞的触发点参数,请求,触发点所在的包的路径,以及漏洞类型,根据这些定位到代码构造数据包复现即可。
2.单条规则审计
单一规则可以使用codeql指定
cd E:codeqlCodeQLpyoutdatabasenovel-crawl
### E:codeqlCodeQLpyoutdatabasenovel-crawl目录为生成的codeql数据库
codeql database analyze . ql/security/CWE/CWE-020/UntrustedDataToExternalAPI.ql --format=csv --output=result.csv
指定UntrustedDataToExternalAPI这条ql规则对生成的QL数据库进行扫描
3.对某管控代码进行审计
这个CMS的代码是由几个WAR包组成的,任选一个丢进去扫描。结果如下:![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
jar包的结构上遵循了MVC架构,关于MVC架构,放个图自行百度学习
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
这个架构的特点呢,一般就是会包含controller , *Controller.java
数据流的一个走向则是 :前端 =》 控制层(Controller) =》 服务层(Service) =》 持久层(Dao)
所以一般优先看Controller层,对于MVC架构。
可以看到漏洞点位于com.xxx.appserver包下,简单的检索一下,有个Appserver.jar,使用反编译工具打开jar包(IDEA也可以)
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
可以看到这里有个@RequestMapping注解
RequestMapping的主要作用其实就是定义Controller中对应方法的请求路径,也就是用户用什么请求路径来访问系统的时候,用这个方法来执行业务。
这里指向/iosxxx目录下,继续往下看:
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
在/iosxxxxxxxx目录下又包含了第二级的注解指向路径为/query,继续跟踪,可以看到调用的query方法,传参为id =》uid,uid赋值给filename,最后用readNameFile方法直接读取文件内容,并且会将回显显示到页面。
因此我们可以判断这里是一个很明显的文件读取,简单的构造一下请求
/iosxxxxxxxx/query?id=../../../../../../opt/xxxx/xxxx/config/global.properties
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
读取一手配置文件,嗯,算是成功。
![JAVA代码审计篇(一) JAVA代码审计篇(一)]()
初学者不必急于求成,可以慢慢根据工具的扫描结果逐渐理解和快速构建poc以及exp,中后期可以再根据补丁审计Nday漏洞,以及后期的挖掘一手Getshell,前台无条件命令执行这类快速拿权限的漏洞。
CodeQLpy使用非常简单,三段式的审计方式。
1.三段式审计
java项目(一般需要mvn项目,jar包,WAR包等等),首先需要编译代码:
py -3 main.py -t E:codeqlCodenovel-3.3.0.RELEASE -c
生成QL数据库
codeql database create out/database/novel-3.3.0.RELEASE --language=java --source-root="E:codeqlCodenovel-3.3.0.RELEASE" --command="E:codeqlCodeQLpyoutdecode/run.cmd" --overwrite
执行规则审计(以一条规则为例)
py -3 main.py -d E:codeqlCodeQLpyoutdatabasenovel-crawl
审计结果如下:
以上表格就是生成的审计结果,包含了漏洞的触发点参数,请求,触发点所在的包的路径,以及漏洞类型,根据这些定位到代码构造数据包复现即可。
2.单条规则审计
单一规则可以使用codeql指定
cd E:codeqlCodeQLpyoutdatabasenovel-crawl
### E:codeqlCodeQLpyoutdatabasenovel-crawl目录为生成的codeql数据库
codeql database analyze . ql/security/CWE/CWE-020/UntrustedDataToExternalAPI.ql --format=csv --output=result.csv
指定UntrustedDataToExternalAPI这条ql规则对生成的QL数据库进行扫描
3.对某管控代码进行审计
这个CMS的代码是由几个WAR包组成的,任选一个丢进去扫描。结果如下:
jar包的结构上遵循了MVC架构,关于MVC架构,放个图自行百度学习
这个架构的特点呢,一般就是会包含controller , *Controller.java
数据流的一个走向则是 :前端 =》 控制层(Controller) =》 服务层(Service) =》 持久层(Dao)
所以一般优先看Controller层,对于MVC架构。
可以看到漏洞点位于com.xxx.appserver包下,简单的检索一下,有个Appserver.jar,使用反编译工具打开jar包(IDEA也可以)
可以看到这里有个@RequestMapping注解
RequestMapping的主要作用其实就是定义Controller中对应方法的请求路径,也就是用户用什么请求路径来访问系统的时候,用这个方法来执行业务。
这里指向/iosxxx目录下,继续往下看:
在/iosxxxxxxxx目录下又包含了第二级的注解指向路径为/query,继续跟踪,可以看到调用的query方法,传参为id =》uid,uid赋值给filename,最后用readNameFile方法直接读取文件内容,并且会将回显显示到页面。
因此我们可以判断这里是一个很明显的文件读取,简单的构造一下请求
/iosxxxxxxxx/query?id=../../../../../../opt/xxxx/xxxx/config/global.properties
读取一手配置文件,嗯,算是成功。
以上为JAVA自动化代码审计的第一篇,主要是讲讲工具的使用,后续会逐渐深入聊聊审计的一些姿势技巧。
原文始发于微信公众号(JC的安全之路):JAVA代码审计篇(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论