简介
当利用SSRF漏洞时,攻击者可以通过构造恶意请求来读取本地文件。其中一种方法是使用file协议来读取本地文件。例如,file:///etc/passwd是一个常见的示例,它用于读取Linux系统上的passwd文件。
passwd文件是Linux系统中用于存储用户账户信息的文件,其中包含了所有用户的用户名、密码和相关配置信息。攻击者可以利用SSRF漏洞,构造一个恶意的请求,通过服务端向file:///etc/passwd发送请求,从而读取该文件的内容。
攻击者可以利用web应用程序中的SSRF漏洞,构造一个包含file协议的URL,例如:file:///etc/passwd。当应用程序没有对目标地址做过滤和限制时,服务端会向该URL发送请求,读取passwd文件的内容。如果攻击者能够成功读取到该文件的内容,就可以获得系统中的用户账户信息,进而进行更进一步的攻击。
除了passwd文件外,攻击者还可以尝试读取其他敏感文件,例如shadow文件(存储密码哈希值)或配置文件等,以获取更多有用的信息。
例题([NISACTF 2022]easyssrf Leaderchen)
1.打开环境,如下所示,查看源码,没有任何就可以利用
2.在输入框输入1,发现有回显,输入flag测试
3.得到提示文件在/fl4g,构造payload
file:///fl4g
测试结果如下
4.看到ha1x1ux1u.php,直接访问
源码分析
<?php
:这是PHP代码的开始标记。highlight_file(__FILE__)
:这个函数调用会输出当前文件的源代码。它用于调试或显示当前文件的源代码,但通常不建议在生产环境中使用,因为它可能会泄露敏感信息。error_reporting(0);
:这条语句关闭了所有错误报告。错误报告通常是用来向开发者提供问题反馈的,但在这种情况下,你禁用了所有的错误报告。这可能会导致难以发现和修复问题。$file = $_GET["file"];
:从HTTP GET请求中获取名为"file"的参数并将其值赋给变量$file
。这样,用户可以在URL中通过添加?file=somefile.txt
来指定要读取的文件。if (stristr($file, "file")){ die("你败了."); }
:这个if语句检查$file
是否包含字符串"file"。如果包含,它会终止程序并输出"你败了."。这个逻辑可能意味着你不想让用户能够通过传递参数来读取名为"file"的文件,但这个逻辑是不完整的,因为它仅检查文件名是否包含"file",而不是文件路径。echo file_get_contents($file);
:这个语句会读取$file
指定的文件内容并将其输出。但是,由于之前的逻辑只检查文件名,而不检查文件路径,这可能会导致任意文件读取漏洞。例如,如果用户尝试访问/?file=/etc/passwd
,它可能会读取到敏感的系统文件。
5.直接构造payload
?file=../../../../../../flag
得到答案
解决方案
为了防范SSRF漏洞的利用,需要对服务端的请求进行严格的过滤和限制,确保只允许访问指定的、安全的URL,而禁止访问本地或内网的URL。同时,对于敏感文件的读取应该进行严格的权限控制和访问授权,避免被恶意攻击者利用。