2020/1/27 代码审计学习-宽字节注入与二次注入

0x00 宽字节注入

当我们看到的变量有时会被addslashes函数过滤
单引号会被转义为 ’

我们在前面加上%df
变成id=%df’
转义之后是%df  '编码为%df%5c%27
%df%57会被认为是一个中文“運”
这样单引号之前的转义符号“”就被吃调了,变成了“運’”转义失败,mysql在解读时会无视新字节,使得我们的单引号(‘)生效。

sqlmap中宽字节注入:

python2 sqlmap.py -u "http://117.51.147.2/Ze02pQYLf5gGNyMn/query_aIeMu0FUoVrW0NWPHbN6z4xh.php?id=1" --tamper unmagicquotes --dbs --hex

使用unmagicquotes
hex则是因为过滤了单引号使用16进制绕过

2:直接进行跑:

%df直接可以用sqlmap进行注入,
python sqlmap.py -u"http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'"

0x01宽字节注入修复方案

1:使用mysql_set_charset(GBK)指定字符集
2:使用mysql_real_escape_strings进行转义

0x02二次注入原理

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

二次注入,可以概括为以下两步:

第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

第二步:引用恶意数据

开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

0x03二次注入思路

先将注入语句插入到数据库,注册,留言板等功能都具有insert数据库的操作,然后在使用updata的地方触发插入到数据库的注入语句。

猜你喜欢

转载自www.cnblogs.com/wangtanzhi/p/12236247.html