在进行php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致一个编码转换的注入问题,也就是熟悉的宽字节注入
当存在宽字节注入时,%df%27 可把程序中过滤的\ (%5c)吃掉。
例如:/1.php?id=1存在宽字节注入时,则: /1.php?id=-1'and 1=1%23 单引号会被转义成 \'
但是提交:/1.php?id=-1%df’and 1=1%23 时,%df和\ 反斜杠(%5c) 组合 %df%5c 编码后是一个汉字,这时候单引号依然存在,则会闭合成功,形成注入漏洞。
形成原因:由于设置Mysql 服务器客户端数据编码是GBK ,set character_set_client=gbk执行语句时进行GBK 转码时形成攻击,通常都设置方法是:SET NAMES ‘gbk’,等同于:
SET
character_set_connection=’gbk’,
character_set_results=’gbk’,
character_set_client=’gbk’
[节选自尹毅的代码审计《企业级web代码安全架构》]
在线上靶子上试一下
https://www.xss.tv/payload/sql/sql-wide.php?id=5%20and%201=2%df%27%20and%201=2%23
我们提交的语句是
and 1=2 %df'and 1=1%23
原理
%df%27= >(addslashes)>%df%5c%27>(GBK)>運’ 用户输入=>过滤函数=>代码层的$sql>mysql处理请求==>mysql中的sql
默认编码character_set_client>根据character_set_connection转码>更新数据库时转化成字段 所对应的编码
宽字节注入修复
使用mysql_set_charset(GBK)指定字符集
使用mysql_real_escape_string进行转义
代码审计
全局搜索关键词
SET NAMES
mysql_query("SET NAMES gbk");
character_set_client=gbk
mysql_set_charset('gbk')
二阶注入**
一阶注入:
二阶注入:
<?php
$a=addslashes($GET['id']);
$b=urldecode($a);
echo '$a='.$a;
echo '<br/>';
echo '$b='.$b;
?>
addslashes函数,将单引号等字符 转义变成\’。
数据存进数据库后,数据又被还原,在这种情况下,如果发现一个新的注入同 时引用了被插入的数据库数据,就可以实现闭合新发现的注入漏洞引发二次注入
https://www.xss.tv/payload/sql/sql-two.php?id=9%27and1=1
select * from article where id = 9'and1=1
在线靶子练习,也可以使用上述代码进行练习
代码审计中也是通过搜索urldecode和rawurldecode挖掘二次注入