sql注入-宽字节注入
宽字节注入的原理:mysql 特性在使用 GBK 编码的时候,会认为两个字符为一个汉字,例如%aa%5c 就是一个汉字(前一个 ascii 码大于 128 才能到汉字的范围)。我们在过滤 ’ 的时候,往往利用的思路是将 ‘ 转换为 \’ (转换的函数或者思路会在每一关遇到的时候介绍)。因此我们在此想办法将 ‘ 前面添加的 \ 除掉,一般有两种思路:
反斜杠:* —url编码–> %5c
单引号:’* —url编码–> %27
1、%df 吃掉 \ 具体的原因是 urlencode(‘) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,同时也就达到了我们的目的。
2、将 \’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 的情况,后面的%5c 会被前面的%5c给注释掉。这也是 bypass 的一种方法。
实站宽字节注入靶场:
http://127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union%20select%201,user(),3--+
这里的%27是单引号(’),数据库会自动实施转义,将单引号转义为%5c%27(’)在前面加%df与%5c形成一个汉字,从而留下%27(单引号)进行闭合。
回显表示我们绕过了对于 ’ 的防护,接下来看一下源码。
可以看到源码对于单引号(’),反斜杠(\)进行转义,单引号转为 ’ ,反斜杠转为 \\ ,双引号转为 "\ 。所以我们选择第一个思路,利用%df与%5c组成一个汉字吃掉%5c。
从回显也可看到%df%5c变成了一个字符。
显错注入
获取所有数据库与当前使用数据库
获取表,这里需要注意一点,这里table_schema='security’中对单引号过滤的方式%df%27和%**%5c%5c%27好像起不了作用,所以这里我用database()代替。
http://127.0.0.1/sqllib/less-32/?id=-1%df%27union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
得到表,爆出数据。
addslashes()函数
函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(’)
双引号(")
反斜杠(\)
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。Addslashes()函数和之前实现的功能基本一致的,所以我们依旧可以利用%df 进行绕过。
Notice:使用 addslashes(),我们需要将 mysql_query 设置为 binary 的方式,才能防御此漏洞。
Mysql_query(“SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary”,$conn);
以上就是宽字节注入的基本内容。