SSRF服务器端请求伪造
凡是发起网络请求的地方,就有可能涉及ssrf
1.SSRF漏洞定义:
SSRF(Server-sideRequestForge)服务器端请求伪造,由于服务端提供了从其他服务器应用获取数据的功能,但没有对地址和协议等做过滤和限制。使得攻击者可以利用存在缺陷的web应用作为代理,攻击其远程和本地的服务器。正是因为它提由服务端发起的,所以它能绕过防火墙去访问内网里的数据,请求到与它相连而与外网隔离的内部系统
2.漏洞产生原因:
大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
3.漏洞利用:
引发SSRF漏洞的几个函数:
file_get_contents() : 获取本地或者远程文件内容
fsockopen(): 获得套接字信息
curLexec(): 随意攻击内网中所有应用
fopen(): 打开文件或者URL
readfile(): 输出一个文件
1.file_get_contents0
功能:把整个文件读入一个字符串中,获取本地或者远程文件内容
语法:file_get_contents(path,include_path,context,start,max_length)
参数
path:必需。规定要读取的文件。
include_path:可选。如果也想在include_path中搜寻文件的话,可以将该参数设为"1”。
context:可选。规定文件句柄的环境,context是一套可以修改流的行为的选项,若使用null,则忽略。
start:可选。规定在文件中开始读取的位置。该参数是PHP5.1新加的。
max_length:可选,规定读取的字节数,该参数是PHP5.1新加的。
<?php
if(isset($_POST['url']))
{$content=file_get_contents($_PosT['url']);$tilenanel='./inages/'.rand().'.img';\file_put_contents($filenane,$content);echo $_POST['url'];$img="<img src=\"".$filenane."\"/>";
}
echo $iag:
?>
2.fsockopen0
功能:获得套接字信息
开启:编辑PHPini中allow_urlfopen选项
allow_url_fopen=On
参数:
hostname:如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议
SsI://或者是tIs://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
port:端口号。如果对该参数传一个1,则表示不使用端口,例如unix://。
errno:如果errno的返回值为O,而且这个函数的返回值为FALSE,那么这表明该错误发生在套接字连接(connect0)调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
errstr:错误信息将以字符串的信息返回。
timeout:设置连接的时限,单位为秒。
实例:
<<<EOF HKHKHKHK字符串 EOF 尾部以EOF收尾
3.curLexeco
功能:执行一个CURL会话这个函数应该在初始化一个CURL会话并且全部的选项都被设
置后被调用。
语法:mixed curLexec(resource Sch)
参数:ch由curLinitO返回的cURL句柄。
curLexeco实例<?php
//创建一个CURL资源$ch = curl_init();
//设置URL和相应的选项
curl_setopt($ch,CURLoPT_URL,"http://ww.w3cschool.cc/");
curl_setopt($ch, CURLOPT_HEADER,0);
//抓取URL并把它传递给浏览器
curl_exec($ch);
//关闭CURL资源,并且释放系统资源
curl_close($ch);
?>
4.fopeno
功能:打开文件或者URL
语法:fopen(filename,mode,include_path,context)
参数
filename:必需。规定要打开的文件或URL。
mode:必需,规定要求到该文件/流的访问类型,可能的值见下表。
include_path:可选。如果也需要在include_path中检索文件的话,可以将该参数设为1或TRUE。
context:可选,规定文件句柄的环境,Context是可以修改流的行为的一套选项.
mode参数可能的值
"r":只读方式打开,将文件指计指向文件头。
"r+":读写方式打开,将文件指针指向文件头。
"w":写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建
"w+":读写方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建
"a":写入方式打开,将文件指针指向文件末尾,如果文件不存在则尝试创建。
"a+":读写方式打开,将文件指针指向文件末尾,如果文件不存在则尝试创建
“x"创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回
FALSE,并生成一条EWARNING级别的错误信息,如果文件不存在则尝试创健之。这和给底 层的open(2)系统调用指定OEXCL|O_CREAT标记是等价的。此选项被PHP4.3.2以及以后的 版本所支持,仅能用于本地文件。
"x+":创建并以读写方式打开,将文件指针指向文件头、如果文件已存在,则fopen(调用失并返回
FALSE,并生成一条EWARNING级别的错误信息,如果文件不存在则尝试创健之。这和给底 层的OPeN(2)系统调用指定OEXCL|OCREAT标记是等价的.此选项被PHP4.3.2以及以后的版 本所支持,仅能用于本地文件。
如果PHP认为filename指定的是一个本地文件,将尝试在该文件上打开一个流。该文件
必须是PHP可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或
者open_basedir则会应用进一步的限制。
如果PHP认为filename指定的是一个已注册的协议,而该协议被注册为一个网络URL,
PHP将检查并确认allow_urLfopen已被激活。如果关闭了,PHP将发出一个警告,而
fopen的调用则失败。
如:
<?php
$file = fopen("test.txt","r");
$file= fopen("/home/test/test.txt","r");
$file fopen("/home/test/test.gif","wb");
$file=fopen("http://ww.example.com/","r");
$file = fopen("ftp://user:passwordgexample.com/test.txt","w");
?>
5.readfile0
功能:输出一个文件,读入一个文件并写入到输出缓冲
语法:readfile(filename,include_path,context)。如果在php.ini文件中“fopenwrappers”已经被激活,则在本函数中可以把URL作为文件
名来使用
4.SSRF的业务场景
1.分享:通过URL地址分享网页内容
2.转码服务(手机也适配)
3.在线翻译(百度翻译搜索检索IP的网址:http://www.ip.cn)
4.图片加载与下载通过URL地址加载或下载图片
5.图片、文章收藏功能
6.未公开的api实现以及其他调用URL的功能
7.从uRL关键字中寻找(share、wap、url、link、src、source、target、sourceURI、imageURL、domain)
8.图片加载与下载
9.未公开的api实现以及其他调用URL的功能
5.漏洞危害:
具体危害取决于,内网和本机涉及哪些漏洞有什么功能
1.对目标服务器所在的内网进行IP存活性扫描和端口扫描(Nmap)
2.利用扫描的指纹信息判断开放的服务,从而对内网的主机进行攻击
3.识别内网WEB应用指纹,判断应用类型进行攻击
4.使用特定协议攻击应用(gopher、dict、file、FTP/SFTP等)
5.扫描内网开放的端口
6.读取主机任意文件
7.攻击内网应用,如redis,mysql等
8.可以向内部任意主机的任意端口发送精心构造的数据包payload
6.漏洞挖掘思路:
思路一:黑白盒
1、白盒:找能够发起请求的函数
<?php$URL =$_GET['url'];$CH=CURL_INIT();CURL_SETOPT(SCH, CURLOPT_URL, $URL);CURL_SETOPT($CH, CURLOPT_HEADER, FALSE);CURL_SETOPT(SCH, CURLOPT_RETURNTRANSFER,TRUE);CURL_SETOPT($CH, CURLOPT_SSL_VERIFYPEER, FALSE);CURL_SETOPT(SCH, CURLOPT_FOLLOWLOCATION, TRUE);$RES=CURL EXEC($CH);CURL_CLOSE($CH);echo $RES;
2、黑盒:看URL传参,urI中出现协议和域名,就有可能存在
url=http://此处可以是dnslog域名(获得随机域名)
url=file://
相关关键字:share、wap、url、link、src、source、target、display、sourceURI、
imageURL、domain
3、检测SSRF是否存在
(1)dnslog辅助:
测试方法:可以在测试点输入dnslog域名,看是否能访问到,如果dnslog有反应,说明有极高概率,漏洞存在
思路二:
能发起网络请求的地方就有可能存在SSRF
1、如何确定是否存在ssrf:
1.要能让目标发起网络请求
2.首先要能确定能访问外网,利用dnslog,如果有反应说明可以访问外网
3.接下来确定是否访问内网,本来我们是访问不到内网,但我们可以通过如网页翻译SSRF访问对
方服务器内网,如:dict:/P地址端口号对对方内网开启那些端口进行探测,可以跑端口(1-
65535)得出开放什么端口后,在点开开放端口页面看开启那些服务
能访问外网(一般不认)
能访问内网
能访问本机
3、相关案例手法:
分享:通过URL地址分享网页内容。
在线翻译。
图片的加载与下载:通过URL地址加载或下载图片,要注意区分是客户端发送的请求还是服务端发送的请求。
图片,文章收藏功能。
未公开的api实现以及其他调用URL的功能。
7.漏洞防范:
1.通过正则表达式编写不允许访问本机和内网1
2.用户指定(或者预埋在前端的请求)的地址进行资源请求则请做好目标地址的过滤
3.限制协议只为HTTP、HTTPS,减少其他如file://、gOpher://和ftp://等可能引起的问题协议
4.禁止3xx跳转,重定向
5.设置URL白名单或者限制内网IP