目录
代码审计-学前须知
Bluecms-CNVD-1Day-常规注入审计分析
emlog-CNVD-1Day-常规注入审计分析
emlog-CNVD-1Day-2次注入审计分析
知识点:1、PHP审计-原生态开发-SQL注入&语句监控
2、PHP审计-原生态开发-SQL注入&正则搜索
3、PHP审计-原生态开发-SQL注入&功能追踪
原生态开发的项目一般不安全,经常会爆出常见的漏洞,如:SQL注入,文件上传等
代码审计-学前须知
挖 0day 需要技术积淀+运气,但挖 1Day 则是单纯的学技术。
- 代码审计必备知识点:环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。
- 代码审计开始前准备:审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等。
- 代码审计挖掘漏洞根本:可控变量及特定函数,不存在过滤或过滤不严谨存在绕过导致的安全漏洞。
- 代码审计教学计划:审计项目漏洞原理->审计思路->完整源码->应用框架->验证并利用漏洞。
- 代码审计教学内容:PHP,Java,NET,JS,Python等网站应用,引入框架类源码,相关审计工具插件使用。
审计思路
审计出发点
1、正则搜索函数名或者敏感词
2、通过网站功能点确定访问文件,审计功能点的代码
挖掘技巧
- 语句监控-数据库SQL监控排查可利用语句定向分析
- 功能追踪-功能点文件SQL执行代码函数调用链追踪
- 正则搜索-(update|select|insert|delete|).*?where.*=
如何快速的在多个文件代码里面找脆弱点
- 看文件路径
- 看代码里面的变量(可控)
- 看变量前后的过滤
Bluecms-CNVD-1Day-常规注入审计分析
审计流程:(update|select|insert|delete|).*?where.*=\正则-ad_js.php->getone()->无过滤->有输出payload注入
Poc:
ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()
搭建参考:https://wiki.bafangwy.com/doc/379/
项目环境搭建,PHPStudy 搭建,使用 Apache + MySQL 搭建环境
PHPStorm 打开项目源代码,使用正则表达式搜索代码
(update|select|insert|delete|).*?where.*=
这个正则表达式可以匹配包含特定数据库操作和where子句的字符串。具体解释如下:
- (update|select|insert|delete|):这是一个捕获组,使用|表示“或”的关系。它匹配update、select、insert、delete中的任何一个词。这个捕获组是用来匹配数据库操作的关键字。
- .*?:这部分使用了非贪婪模式(由?指定),匹配任意数量的任意字符(由.指定),但尽可能少地匹配字符。这意味着正则表达式会寻找最短的满足整个表达式的匹配。
- where:这部分直接匹配字符串"where"。
- .*=:这部分匹配任意数量的任意字符(由.指定),直到遇到等号=。这意味着它会匹配where之后的任何内容,直到出现一个等号。
综合以上部分,这个正则表达式可以匹配以update、select、insert、delete之一开始,之后是任意字符(但尽量少),接着是where关键字,最后是任意字符直到等号的字符串。这种模式经常用于匹配包含特定数据库操作和where子句的语句,例如SQL查询语句中的条件部分。
在正则表达式中,.*是一个常见的模式,表示匹配任意数量的任意字符(除了换行符)。具体解释如下:
- .表示匹配任意一个字符(除了换行符)。
- *表示匹配前面的元素零次或多次,也就是指定前面的元素可以出现任意次数(包括零次)。
因此,.*表示匹配任意长度的任意字符序列,包括空序列。它是一个非常灵活的模式,可以用来匹配任意文本内容。在正则表达式中,.*通常用于表示不关心具体字符内容的部分,只关心匹配的长度和位置。
需要注意的是,.*使用贪婪模式,即它会尽可能多地匹配字符。如果需要非贪婪匹配,可以使用.*?来指定非贪婪模式,尽可能少地匹配字符。
正则的结果:
脆弱性验证
思路:快速找到最脆弱的位置
- 看文件路径
- 看代码里面的变量(可控)
- 看变量前后的过滤
1、结合代码所在文件夹/文件名判断
要知道常见的目录的作用,通过代码所在的目录大致会知道代码所扮演的角色。一段SQL语句在HTML里怎么可能会有漏洞。
代码所在文件是在后台的界面里
2、要有基本的开发知识辅助判断
.intval() 转为数字类型,就不会产生漏洞
3、看变量(用户可控的)是否有过滤
这里有对变量进行绕过
但也可以尝试绕过
找到脆弱点进行分析
红框部分是:(1):验证是否有值 (2):过滤空格
getone() 函数应该是开发者自定义,看看它的实现,声明。
声明:函数的定义的定法,函数的逻辑;实现:函数在哪里被使用
可能函数的实现位置有多个,可以结合包含的文件进行判断
getone()函数逻辑:
- 调用query()函数,应该是开发者自定义的
- 接下来是原生的代码
进入到query()函数进行分析
可以看到没有过滤,可以判断存在SQL注入漏洞
还要再看看有没有数据输出:没有输出的话,就只能盲注了
开始测试漏洞
可以输出SQL语句辅助分析
构造Payload
emlog-CNVD-1Day-常规注入审计分析
https://www.cnvd.org.cn/flaw/show/CNVD-2018-26200审计流程:
comment.php->delCommentByIp($ip)->无过滤->构造触发
Poc:
/admin/comment.php?action=delbyip&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20user()),0x7e)))%20--+&token=11f3f9cb7e78e3f88e39ea5678939b7d
环境搭建
初步判断漏洞在这个文件里
未对参数 ip 进行过滤
首先对cookie进行验证
然后会通过Cookie里的值验证是否是 admin 用户
通过 Get 方式接收参数 ip 值
然后查询数据并删除数据,最后重定向网页
总的来说,就是 admin 用户后台存在SQL注入漏洞,没有回显,需要盲注
构造payload并测试
网页重定向
盲注
emlog-CNVD-1Day-2次注入审计分析
https://www.cnvd.org.cn/flaw/show/CNVD-2023-65138审计流程:
数据库监控->user.php无可控->nickname->添加不可控->data.php可控->导出修改导入->触发二次注入
/admin/data.php
导入文件时执行SQL文件中语句,带入Payload
INSERT INTO emlog_user VALUES('110','','$P$BnTaZnToynOoAVP6T/MiTsZc9ZAQNg.',(select version()),'writer','n','','123@qq.com ' , '','','0','1687261845','1687261845');
/admin/user.php
select查询nickname条件数据,访问触发二次注入
搭建环境
数据库监控,文件放到网站的根目录
访问地址
输入数据库账号密码并连接
这个工具的意义在于可以监控数据库执行的SQL语句,从中分析SQL注入漏洞
通过CNVD的漏洞提示,登录 admin 账户,SQL注入漏洞是在后台中
访问对应的话后天页面,对比数据库执行监控
使用正则表达式在项目中搜索
经验:一般情况下,"emlog_" 往往是拼接的方式,需要重新构造正则表达式
通过数据库监控的可能存在漏洞SQL语句,匹配到
这个SQL语句中,user 是登录的账号,带入数据进行查询。思路:二次注入,如果可以把SQL语句写入到 user 中,那么就可以SQL注入漏洞执行
对这个函数转到->声明或实例
定位有漏洞的文件
filter_var 是过滤器,可能用来过滤一些脏字等
调用 getUser() 函数时,参数 condition 不可控,其值是 and nickname like '%%'
是一个空的模式字符串,表示匹配任意长度的任意字符序列。会匹配所有的用户名,即登录的账号
调用 getUserNum() 函数时,参数 condition 不可控
思路:二次注入,如果可以把SQL语句写入到 user 中,那么就可以SQL注入漏洞执行
注意到
导入备份,执行SQL语句,建立一个新的用户,用户名是SQL语句
再次查询
备份的数据,SQL文件会被数据执行写入,在访问用户管理界面就会被显示出来。恶意的SQL语句被执行写入到数据库,再被查出来。
另外:报错,时间盲注都不行,因为备份操作时没有数据包回显的,无法判断。
而且直接创建用户也是不可以的,因为直接创建的用户名是随机的。