0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

ssrf
ssrf(服务端请求伪造)由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
一般情况下,SSRF攻击的应用是无法通过外网访问的,所以需要借助目标服务端进行发起,目标服务器可以链接内网和外网,攻击者便可以通过目标主机攻击内网应用。
数据流:攻击者----->服务器---->目标地址
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
file_get_contents函数:
//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php
//内网请求:http://x.x.x.x/xx.index
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}
可以利用file协议读取本地文件http://10.2.13.34/pikachu/vul/ssrf/ssrf_fgc.php?file=http:////C:/phpStudy/WWW/y.txt
curl_exec函数:
前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
可以利用这个漏洞通过服务器去访问同一个网络中的其他服务器进行相关探测http://10.2.13.34/pikachu/vul/ssrf/ssrf_curl.php?url=http://10.2.3.227:80
fsockopen函数:
PHP fsockopen需要 PHP.ini 中allow_url_fopen
选项开启。
$host=$_GET['url'];
$port=$_GET['port'];
//fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if(!$fp){
echo "$errstr ($errno)<br />\n";
}else{
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: 127.0.0.1\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp,$out);
$content = '';
while(!feof($fp)){
$content .= fgets($fp,128);
}
echo $content;
fclose($fp);
}
地址和端口用户可控,所以可以用来SSRF漏洞的利用。
常见绕过方法
特殊域名绕过(DNS解析)
配置域名的DNS解析到目标地址(A、cname等),这里有几个配置解析到任意的地址的域名:
nslookup 127.0.0.1.nip.io
nslookup owasp.org.127.0.0.1.nip.io
xip.io是一个开源泛域名服务。它会把如下的域名解析到特定的地址,其实和dns解析绕过一个道理。
http://127.0.0.1.xip.io/
//会解析道本地的127.0.0.1
IP转换进制
IP地址是一个32位的二进制数,通常被分割为4个8位二进制数。通常用“点分十进制”表示成(a.b.c.d)的形式,所以IP地址的每一段可以用其他进制来转换。
8进制格式:0177.0.0.1
16进制格式:0x7F.0.0.1
10进制整数格式:2130706433(转16进制,在转10进制)
16进制整数格式:0x7F000001
还有一种特殊的省略模式,例如127.0.0.1这个IP可以写成127.1
@绕过
http://example.com@127.0.0.1
# 这里的example.com可以任意替换,
参考
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)