【22】WEB安全学习----MySQL注入-7(绕过限制)

注释符:-- 、#、/**/绕过

只能闭合后面的语句,使其成为正确的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组成汉字【運】,后面的单引号限制就被绕过了

此时,就可以按照正常的流程进行注入了。

猜你喜欢

转载自blog.csdn.net/a15803617402/article/details/82789477