知识点:

二次注入

报错注入

原理:

二次注入:

第一次进行数据库插入数据的时候,仅仅只是使用了 ‘addslashes’ 或者是借助 ‘get_magic_quotes_gpc’对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库取出了脏数据,没有进行进一步的检验和处理,这样就造成了SQL二次注入

8581772-b024d9bb4acded26.webp

解题思路:

打开题目之后,测试一番没什么信息可以获得,查看源代码发现有 ?file=? ,猜测是文件包含

文件包含.PNG

既然猜测是文件包含,那就用 PHP伪协议读取一下 index 页面的源码

base64.PNG

发现读取成功,拿去BASE64解码一下,发现是存在文件包含的

index.PNG

继续读取一下 confirm 的源码

confirm.PNG

这里只对 user_name 和 phone 进行严格过滤验证,但是漏掉了 address 的

接着往下按看

读取一下 change 的源码

change.PNG

发现还是只对 user_name 和 phone 进行严格过滤验证,但是这里不同的是,这里用 addslashes() 对 address进行的简单的转义操作,并没有被sql语句执行

接着往下看,有一条 sql 语句
sql.PNG
这里可以看到,当上面 user_name 和 phone 正常执行之后,这一条sql语句就会被执行,而在这条语句里面,发现修改新的地址会调用上一次输入进来的 address ,而且并没有进行检验和处理,好了,到这里可以联想到是二次注入了

带着这个猜想去验证一下

先正常的创建一个订单

提交一个正常的.PNG

然后在修改地址的地方输入 sql 语句

输入sql语句.PNG

sql语句:1’ where user_id=updatexml(1,concat(0x7e,(select substr(load_file(‘/flag.txt’),1,10)),0x7e),1)#

这里用的是 updataxml 的报错函数,利用调用的时候造成的格式错误而引起的查询错误

而 substr() 函数因为读取的长度有限,所以每次只读是个字符

当我们再次修改订单,输入正常的数值之后,就会读取到我们想要的 flag 信息

读取成功.PNG

最后 flag 拼接为

flag{c747ad59-4e54-4c64-bfed-ec279700011f}