审计 6 SSRF和任意文件读取

本文分析了一个特定的SSRF与任意文件读取漏洞案例,详细介绍了如何利用上传功能修改$_SESSION['avatar']变量,从而实现任意文件读取及服务器侧请求伪造(SSRF)的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 <?php
2 error_reporting(0);
3 session_start();
4 header("Content-type:image/jpeg");
5 echo file_get_contents($_SESSION['avatar']); 
6 ?> 

在第5行发现    读取的文件后,将文件进行了输出。  所以猜测此处可能存在SSRF 和  任意文件读取

搜索关键变量$_SESSION['avatar']  发现在登陆 和修改密码 读取了改变量,而上传的地方可以修改该变量 。

因为所有的$_SESSION['avatar']变量在发送数据包时都是加密的所以不能直接修改$_SESSION['avatar']导致任意文件读取,所以采用上传时修改其路径。来改$_SESSION['avatar']

 1 <?php
 2 include_once('../sys/config.php');
 3 $uploaddir = '../uploads';
 4 
 5 if (isset($_POST['submit']) && isset($_FILES['upfile'])) {
 6 
 7     if(is_pic($_FILES['upfile']['name'])){
 8 
 9         $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];
10 
11         if (move_uploaded_file($_FILES['upfile']['tmp_name'], $avatar)) {
12             //更新用户信息
13             $query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'";
14             mysql_query($query, $conn) or die('update error!');
15             mysql_close($conn);
16             //刷新缓存
17             $_SESSION['avatar'] = $avatar;
18             header('Location: edit.php');
19         }
20         else {
21             echo 'upload error<br />';
22             echo '<a href="edit.php">返回</a>';
23         }
24     }else{
25         echo '只能上傳 jpg png gif!<br />';
26         echo '<a href="edit.php">返回</a>';
27     }
28 }
29 else {
30     not_find($_SERVER['PHP_SELF']);
31 }
32 ?>

在第13行发现   $query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'"; 他直接把上传的路径$avatar直接取出来,更新了数据库

而UPDATE有个特殊的属性在set设置多个相同的键时,只取最后一个键的值。  因此可以导致可以构造$_SESSION['avatar']  

payload:

$avatar=  ' , user_avatar = '读取的文件路径' WHERE user_id = 'zzz'  首先用单引号把$avatar去闭合,然后用逗号接下一个构造的变量 user_avatar = '读取的文件路径' ,但是出现了一个问题  user_id不是知道   但是可以取构造   user_name='注册的用户'

然后发现  if(is_pic($_FILES['upfile']['name']))  对文件后缀进行了验证

最终payload:   $avatar=  ' , user_avatar = '读取的文件路径' WHERE  user_name='注册的用户' #.jpg

 然后用户登录 上传抓包,把抓到的

  上传文件修改文件名的包

   去取变量$avatar

   将取到的$avatar读出来

修改文件名 filename

发现数据库得到是 ../upload/..........._config.php   是因为取 单引号时对单引号和 / 进行了转义导致单引号没闭合

重新编码成16进制 绕过单引号和/

 

成功构造。

 然后先重放登录页面获取去取变量$avatar

然后在   将取到的$avatar读出来

如图所示攻击成功,本地文件任意读取。

 接下来测试SSRF

因为没有内网环境,所以测试百度  将http://www.baidu.com 

发现成功将百度页面读取,也就是可以读取内网信息。所以存在SSRF

转载于:https://www.cnblogs.com/pojun/p/7354916.html

参考资源链接:[2020 YCBCTF羊城杯官方Writeup:PHP与Web安全解题技巧实录](https://wenku.youkuaiyun.com/doc/9uv2icy61q?utm_source=wenku_answer2doc_content) SSRF(服务器端请求伪造)漏洞允许攻击者使服务器向内部或外部的任意位置发起请求,如果这些请求未经充分限制,就可能成为攻击者的攻击路径。为了帮助你深入理解如何识别利用SSRF漏洞,我推荐你阅读《2020 YCBCTF羊城杯官方Writeup:PHP与Web安全解题技巧实录》。这份资料详尽地记录了在羊城杯CTF比赛中与PHPWeb安全相关的挑战解决方案,其中包含了实际案例详细的解题步骤。 在PHP代码审计中,为了发现SSRF漏洞,你应该检查应用中所有允许用户输入的地方,并尝试输入各种协议(如***、***、***等)IP地址。以下是一个简单的工作流程示例: 1. 审计代码中所有用户可控的输入点,特别是那些用于发起网络请求的函数,比如file_get_contents、curl_exec、fsockopen等。 2. 对于每个输入点,尝试使用***协议并提供本地服务器的路径,比如尝试读取/etc/passwd,看应用是否允许这类请求。 3. 确认没有对输入的协议IP地址做严格的过滤限制。 4. 如果找到可以利用SSRF漏洞的输入点,可以进一步构造恶意的URL以获取敏感信息或执行远程代码。 示例操作: 假设我们发现在应用中,有一个参数允许我们控制fopen函数的文件名: ```php $f = fopen($input_from_user, 'r'); ``` 我们可以尝试输入: ```php *** ``` 如果服务端未对请求进行限制,我们可能会看到本地服务的响应或错误信息。这表明我们可以利用这个SSRF漏洞来读取服务器上的文件,甚至可能在本地环境中执行远程代码。 通过这个方法,你可以对找到的SSRF漏洞进行深入分析,并尝试利用它来执行远程文件包含攻击,最终获取敏感数据或者提升权限。 在你理解了如何识别利用SSRF漏洞后,你将能够在实际的安全审计中应用这些知识。《2020 YCBCTF羊城杯官方Writeup:PHP与Web安全解题技巧实录》不仅能帮助你理解识别SSRF漏洞,还能提供更多的CTF实战经验。通过深入学习这份资料,你可以获得更为全面的技术理解实战技巧。 参考资源链接:[2020 YCBCTF羊城杯官方Writeup:PHP与Web安全解题技巧实录](https://wenku.youkuaiyun.com/doc/9uv2icy61q?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值