sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)

一)宽字节注入(1)
1)宽字节注入基础
2)宽字节注入代码分析
3)宽字节SQL注入演示(less-33)
4)sqlmap安全检测

二)宽字节注入(2)
1)宽字节注入基础
2)宽字节注入代码分析
3)宽字节SQL注入演示(less32)
4)sqlmap安全检测

——————————————————————————————————————————————————————


一)宽字节注入

1)宽字节注入基础

GBK编码是占用两个字节,ASCII编码是占用一个字节。在PHP中的编码方式为GBK,在函数执行添加的是ASCII编码,在mysql中国默认字符集是GBK等宽字节字符集(GBK属于宽字符集中的一种),而mysql中使用的默认的GBK编码方式是导致宽字节注入的根源。

产生的原因是:%DF' 会被PHP中的 addslashes函数 转义为 %DF\' ,而 \ 其实就是URL中的 %5c ,因此最终 %DF' 会被转义为 %DF%5c%27 ,此时网站如果设置了GBK编码方式那么就会将 %DF%5c 认定为一个宽字符,也就是中文“”,此时 %DF%5c%27 就变成了 縗%27 ,也就是 縗' ,此时 縗' 的单引号就和前面id的单引号成功进行了和闭合。

2)宽字节注入代码分析
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第1张图片

根据以上代码得出结论:如果要能成功利用宽字符注入,就要满足两个条件:
    1)采用了addslashes函数进行了转义;
    2)网站采用的是GBK编码方式。


3)宽字节SQL注入演示

当我们输入 \ 会发现 \ 也被进行了转义:
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第2张图片
输入 ' 会发现 ' 也被进行了转义:
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第3张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第4张图片
输入 1%df'sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第5张图片
发现报错信息中提示多了一个单引号,这是没有进行单引号闭合,所以我们使用 --+ 进行单引号闭合:
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第6张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第7张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第8张图片


4)sqlmap安全检测
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第9张图片

二)宽字节注入(2)


[1)宽字节注入基础

前面我们已将讲解过宽字节注入的原理,其实就是mysql使用了GDK编码方式,结合 %df'==>%df%5c%27 ==>縗',但是利用%df只是其中的一个在宽字节注入中最长使用的而已,其实并不是只有这一个字符可以利用,只要第一个ascii码大于128就可以利用,例如:ascii码为129的0x81,加上十六进制%就变成了%81。所以总而言之就是GBK首字节在0x81~0xFE范围内、尾字节在 0x40~0xFE(除了0x7F外) 都可以利用。


2)宽字节注入代码分析
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第10张图片

解析:

在check_addslashes函数中通过三个preg_replace()函数分别将所有的 /、'、" 都进
行\/、\'、\"方式的过滤。此时我们通过源码中利用\进行转义的过滤机制,很容易就会想到利用
宽字节注入,所以我们接着往下查看源码中mysql是否使用GDK编码方式,发现
mysql_query("set NAMES gbk"),此时利用宽字节注入的必须满足的两个条件:采用了
addslashes函数进行了转义;网站采用的是GBK编码方式 都有了,那么就可以利用宽字节注入了。

mysql_real_escape_string()addslashes() 其实是等效的,所以如果没有使
用addslashes()而是使用了mysql_real_escape_string()那么也是可以的。


3)宽字节SQL注入演示(less32)
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第11张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第12张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第13张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第14张图片

4)sqlmap安全检测

利用宽字节注入我们可以使用sqlmap中的一个脚本:unmagicquotes.py(专门针对宽字节注入的脚本)

python sqlmap.py -u "" --tamper=unmagicquotes.py

sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第15张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第16张图片
结论:存在布尔盲注、报错注入、union注入、and/or时间盲注。
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第17张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第18张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第19张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第20张图片
sqli-labs靶场实现(九)【宽字节注入(1)、宽字节注入(2)】(less-33、less-32具体步骤+图文详解)_第21张图片





你可能感兴趣的:(sqli-labs靶场)