互联网上的很多Web应用提供了从其他服务器(也可以是本地)获取数据的功能。使用用户指定的URL, Web应用可以获取图片、文件资源(下载或读取)。
如百度提供识图功能:
用户可以从本地或者URL的方式获取图片资源,交给百度识图处理。如果提交的是URL地址,该应用就会通过URL寻找图片资源。如果Web应用开放了类似于百度识图这样的功能,并且对用户提供的URL和远端服务器返回的信息没有进行合适的验证或者过滤,就可能存在“请求伪造”的缺陷。
请求伪造,顾名思义就是攻击者伪造正常的请求,以达到攻击的目的,是常见的web安全漏洞之一。如果“请求伪造”发生在服务器端,那么这个漏洞就叫做“服务器端请求伪造",英文名字为Server-Side Request Forgery,简称SSRF。
SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种攻击者发起的伪造由服务器端发起请求的一种攻击,也是常见web安全漏洞(缺陷或者风险)之一。(CSRF跨站请求伪造发生在客户端,请求发自客户机,SSRF发自服务器)
在服务器端实现通过URL从服务器(外部或者内部)获取资源功能的方法有很多,此处使用PHP语言和curl扩展实现改功能。
通过phpinfo()函数查看对curl扩展的支持,现在大部分wamp套件均支持curl
扩展。
服务器端代码如下
#index.php
<?php
if (isset($_REQUEST['url']))
{
$link = $_REQUEST ['url'];
$filename = './curled/'.time().'.txt';
$curlobj = curl_init($link);
$fp = fopen ($filename, "w");
curl_setopt ($curlobj, CURLOPT FILE, $fp);
curl_setopt($curlobj, CURLOPT_HEADER, 0) ;
curl_setopt ($curlobj, CURLOPT_FOLLOWLOCATION, TRUE);
curl_exec ($curlobj);
curl_close ($curlobj);
fclose($fp);
$fp = fopen ($filename, "r");
$result = fread ($fp, filesize($filename));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
?>
将以上代码保存成文件[ssrf_curl.php]。该段代码实现了从服务器获取资源的基本功能, 提交
[?url=http://www.baidu. com ]
页面就会载入百度首页的资源。
同时,获取的资源文件会保存在[./curled]中,并以发起请求时间的unix时间戳命名。
[?url=http://www. baidu. com/robots.txt]
[?url=dict://127.0.0.1:1234]
(字典协议)[?url=dict://172.16.132.160:22]
(有成功率)[?url=dict://172.0.0.1:3306]
(内网另一台服务器)[?url=dict://172.0.0.1:21]
[?url=file://c:windows\system32\drivers\erc\hosts]
[?url=http://localhost/phpmyadmin/README]
对外发起网络请求的地方都可能存在SSRF漏洞,列举图片加载下载,分享页面,在线翻译,未公开的api(从远程服务器请求资源文件处理,编码处理,属性信息处理等。
Weblogic–SSRF->GetShell