在进行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')
二阶注入**
一阶注入:
- 一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻击是立即执行的
- .攻击者在http请求中提交非法输入
- 应用程序处理非法输入,使用非法输入构造SQL语句
- 在攻击过程中向攻击者返回结果
二阶注入:
- 攻击者在http请求中提交恶意输入
- 恶意输入保存在数据库中
- 攻击者提交第二次http请求
- 为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句
- 如果攻击成功,在第二次请求响应中返回结果
<?php $a=addslashes($GET['id']); $b=urldecode($a); echo '$a='.$a; echo '
'; 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挖掘二次注入
欢迎关注作者微信公众渗透云笔记
![98ec1d06c0df6798ebed1dcc931a399a.png](https://i-blog.csdnimg.cn/blog_migrate/bd6f0739c4a10582869a748e81915e39.jpeg)
![1a8c9832dd2d668851ee4cdff0f36f02.png](https://i-blog.csdnimg.cn/blog_migrate/e8e4921debfa098bcfa591a2ed47d6b3.jpeg)