Audit-宽字节注入形成原理及防护机制
- 环境:phpstudy PHP5.4n
- 原理:通过输入转码函数不兼容的特殊字符,可以导致输出的字符编程有害的数据(set character_set_client=gbk)
- 代码审计关键词:
测试代码:1
2
3
4
5
6
7
8
9
10
11
$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();
我们来玩一下:
加了一个单引号,发现被转义成\’,多了一个\,这里就可以宽字节注入啦!
添加一个%df,%23注释后面的语句
这里不一定是%df,因为gbk编码认为两个字节是一个汉字,而只要第一个字节的ascii码大于128就行。
是不是可以注入啦:
防护机制
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" 转载请保留原文链接及作者。