SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内网。(正因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内网)。
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。即SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现这个请求是非法的,然后服务器以他的身份来访问其他服务器的资源。
利用php中file_get_contents()漏洞:
if (isset($_POST['url'])) {
$url = $_POST['url'];
if (preg_match('/^http
展开收缩?://([(w|d)+.]+[/]?)*/', $url, $matches)) {$content = file_get_contents($_POST['url']);
$filename = str_replace('/', '', $matches[1]);
$filename = './chuoybinu/' . md5($filename) . $matches[1];
file_put_contents($filename, $content);
$image = getimagesize($filename);
$image_type = $image[2];
if(in_array($image_type, array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP))) {
echo '<img src="' . $url . '">';
} else {
echo '<a href="' . $url . '">' . $url . '</a>';
}
} else if (preg_match('/^file://([/wd.]+)/', $url)) {
$content = file_get_contents($url);
readfile($file);
$filename = './chuoybinu/' . md5(time());
file_put_contents($filename, $content);
if (strpos($url, '_')) {
echo '<p>Flag is not such easy to get!(:◎)≡</p>';
} else {
echo '<a href="' . $filename . '">' . $filename . '</a>';
}
} else {
echo '<p>Protocol Not Supported!(:◎)≡</p>';
}
} else {
审计代码发现开头必须是 http
展开收缩
😕/ 或者是 file:// ,可以进行SSRF攻击:
-
首先读取index.php:
file:///var/www/index.php
-
观察到flag在 flag_chunibyou.php 中,但是index限制读取的文文件不不能包含 _ ,所以只能找其他方法。
-
根据提示,数据库文件是可以访问的,从index文件中可以看到数据库结构,因此可以下载ibd文文件:
file://.../ctf/user.ibd
通过 strings user.idb 可以拿到password,进而拿到flag。
转载自CSDN,作者:bob62856
链接:https://blog.csdn.net/qq_20817327/article/details/77686308
如果觉得文章对你有帮助,请点击右下角“在看”
本文始发于微信公众号(LemonSec):CTF web题总结--SSRF
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论