Audit-宽字节注入形成原理及防护机制

  1. 形成原理
  2. 防护机制
  3. 实例
  • 环境:phpstudy PHP5.4n
  • 原理:通过输入转码函数不兼容的特殊字符,可以导致输出的字符编程有害的数据(set character_set_client=gbk)
  • 代码审计关键词:
    • SET NAMES
    • character_set_client = gbk
    • mysql_set_charset(‘gbk’)

      形成原理

      宽字节注入一般出现需要两个条件:
      1、服务器端设置了防注入的addslashes()函数进行过滤;
      2、服务器连接Mysql时设置了编码gbk

测试代码:

1
2
3
4
5
6
7
8
9
10
11
<?php
$conn = mysql_connect("localhost",'root','root');
mysql_select_db("test",$conn);
mysql_query("SET NAMES 'gbk'",$conn);
$uid = addslashes($_GET['id']);
$sql = "SELECT * FROM tdb_admin where id = '$uid'";
$result = mysql_query($sql,$conn);
print_r("SQL:".$sql."<br />result:");
print_r(mysql_fetch_row($result));
mysql_close();
?>

我们来玩一下:
1
2
加了一个单引号,发现被转义成\’,多了一个\,这里就可以宽字节注入啦!
添加一个%df,%23注释后面的语句
这里不一定是%df,因为gbk编码认为两个字节是一个汉字,而只要第一个字节的ascii码大于128就行。
3
是不是可以注入啦:
user

防护机制

1、SET NAMES,character_set_client=binary
设置character_set_client的值为binary,替换到测试代码中之后你就会发现注入失败了

2、使用mysql_set_charset(‘gbk’)设置编码,然后使用mysql_real_escape_string()函数进行转义

3、使用PDO连接数据库,这里网上有很多教程就不贴了

实例

https://www.waitalone.cn/php-code-audit-5.html
http://www.programmersought.com/article/2971113634/


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:Audit-宽字节注入形成原理及防护机制

本文作者:sher10ck

发布时间:2019-01-15, 16:12:51

最后更新:2020-01-13, 12:54:34

原始链接:http://sherlocz.github.io/2019/01/15/wide-byte-injection/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录