文章目录
一、客户端请求
客户端请求是用户设备(如浏览器、APP)向服务器发起的资源或服务请求(如打开网页、提交表单),由用户触发,受浏览器安全策略限制。
二、服务器端请求
服务器端请求是服务器在处理客户端请求时,主动向其他服务器或服务发起的请求(如调用第三方API、同步数据),在后台执行,用户无感知,不受浏览器策略限制。
三、服务器端请求伪造
服务器端请求伪造(SSRF)是攻击者通过构造恶意参数,诱导服务器发起非预期请求,利用服务器权限访问内网资源、扫描端口或攻击其他系统,突破网络隔离,危害较大。
四、漏洞形成原因
由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。
五、漏洞危害
- 内部网络探测:绕过防火墙,扫描内网服务(如数据库、管理后台)。
- 敏感数据泄露:读取本地文件(
file://
协议)或访问云元数据(如AWS/Azure密钥)。 - 内部服务攻击:攻击Redis、MySQL等未授权服务,甚至执行命令。
- 权限绕过:利用服务器身份访问受限资源(如API、SSH)。
六、漏洞场景
SSRF漏洞一般存在于Web应用程序中,这些应用程序接受来自用户的输入,然后将其用于向其他服务器发出请求。攻击者可以在输入中注入恶意的URL,从而使服务器发起未经授权的请求,以访问敏感的内部资源。
- 文件上传功能:Web应用程序通常允许用户上传文件,攻击者可以上传包含恶意URL的文件,以触发SSRF漏洞。
- 图片处理功能:Web应用程序通常包含图片处理功能,攻击者可以在图片URL中注入恶意的URL,以触发SSRF漏洞。
- URL重定向功能:Web应用程序可能包含URL重定向功能,攻击者可以在重定向URL中注入恶意的URL,以触发SSRF漏洞。
- API调用:Web应用程序可能会使用API与其他服务进行交互,攻击者可以在API请求中注入恶意的URL,以触发SSRF漏洞。
七、漏洞函数
- php:
这些函数用于发出HTTP请求,包括常见的函数如curl_exec()
、file_get_contents()
、fsockopen()
。如果这些函数允许从用户输入中获取URL,但未正确验证和过滤用户输入,攻击者可以通过在URL中注入恶意代码来触发SSRF漏洞。 - java:
仅支持HTTP/HTTPS协议的类:HttpClient类、HttpURLConnection类、OkHttp类、Request类支持sun.net.www.protocol所有协议的类:URLConnection类、URL类、ImageIO类。
1. curl_exec
格式:curl_exec(resource $ch)
作用:执行 cURL 会话
<?php
// 创建一个cURL资源
$ch = curl_init();
// 设置URL和相应的选项
curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com/");
// 设置不包括响应头信息,只返回正文内容 curl_setopt($ch,CURLOPT_HEADER, 0);
// 将SSL证书验证设置为false,即不验证对等证书
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
// 将SSL主机验证设置为FALSE,即不验证主机
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
// 抓取URL并把它传递给浏览器
curl_exec($ch);
// 关闭cURL资源,并且释放系统资源
curl_close($ch);
?>
- 在网站根目录中创建文件。
- 在浏览器中访问,可以看到直接跳转到了百度。
2.file_get_contents
格式:file_get_contents(path,include_path,context,start,max_length)
作用:把整个文件读入一个字符串中。将整个文件或一个url所指向的文件读入一个字符串中。
<?php
if(isset($_POST['url']))
{
$content=file_get_contents($_POST['url']);
$filename='./images/'.rand().'.txt';
file_put_contents($filename,$content);
echo $_POST['url'];
$img="<img src=\"".$filename."\"/>";
}
echo $img;
?>
- 在网站根目录中创建文件,并创建一个images文件夹。
- 在浏览器中访问,并传入一个地址。
- 打开images文件夹,发现自动生成了一个txt文件,里面是百度首页的源码。
3. fsockopen
格式:fsockopen(string hostname[, intport = -1 [, int &$errno
[, string &errstr[, floattimeout = ini_get(“default_socket_timeout”) ]]]] )
作用:打开一个网络连接或者一个Unix 套接字连接。
<?php
$fp =fsockopen("192.168.1.11",9998,$errno,$errstr,30);
if(!$fp){
echo "$errstr($errno)<br />\n";
}else {
$out ="GET / HTTP/1.1\r\n";
$out .="Host:192.168.1.11\r\n";
$out .="connection:close\r\n\r\n";
fwrite($fp, $out);
while(!feof($fp)){
echo fgets($fp, 128);
}
fclose($fp);
}
?>
八、漏洞类型
- 有回显:页面有返回具体内容。
- 无回显:页面没有返回具体内容
九、判断是否存在
在无回显(Blind)的SSRF攻击中,攻击者无法直接获取目标系统返回的响应,因此需要寻找一种方法来间接地确认攻击是否成功。
DNSLog是一种常用的间接确认方法,它通过向一个域名提交请求,然后查看DNS服务器的日志来获取该域名的请求记录,从而确认攻击是否成功。
攻击者可以在SSRF漏洞中注入带有DNSLog服务地址的URL,并将该URL发送到目标服务器上,当目标服务器对该URL进行请求时,DNSLog服务将接收到请求并记录在日志中。攻击者可以定期查看 DNSLog的日志,以确认目标服务器是否对该URL进行了请求。
- DNS
域名解析系统(Domain Name System), 用户在浏览器输入一个域名, 靠DNS服务解析域名的真实IP,访问服务器上相应的服务。 - DNSLOG
DNS的日志, 存储在DNS 服务器上的域名信息, 记录着用户对域名的访问信息,类似日志文件。
十、漏洞利用
1.读取敏感文件
(1)通过file协议读取敏感文件
- 格式:
file://filepatch
- 作用:本地文件传输协议,用于访问本地计算机中的文件。
注意:读取文件读取的是目标服务器本地的文件,无法读取其他服务器的文件。
1)读取etc/passwd
在Linux系统里,/etc/passwd
文件中每条记录都对应着一个用户,里面保存着该用户的基础属性信息。对于系统管理员而言,这个文件是用户管理工作中的常用对象,他们常会通过修改其中的内容来完成对用户的各类管理操作。
2)读取etc/hosts
hosts文件的核心功能是建立IP地址与主机名的对应映射,这份映射关系以文本形式记录,可用普通文本工具打开。当用户在浏览器输入网址时,系统会先查询hosts文件,若找到对应的IP地址,就直接用该地址访问网页;若未找到,才会将网址提交给DNS服务器解析IP。简单讲,它是用于快速完成IP与域名对应解析的文件,通过查看该文件,能获取内网所处的网段信息。
十一、漏洞防御
服务器端请求本是业务正常功能的一部分,比如加载图片等场景都会用到。但正因如此,也可能被恶意利用,从而产生服务器端请求伪造(SSRF)漏洞。
目前防御SSRF的主要手段有:
白名单机制:对用户提交的URL设置允许访问的白名单,例如当用户访问www.example.com时,仅允许提交来自example.com的URL。
协议限制:限定仅可使用http、https协议发起请求,以此避免file://、ftp://等协议可能导致的文件泄露问题。
返回信息过滤:对服务器返回的内容进行校验,比如若服务本应获取jpg格式图片,却返回了其他类型内容,则判定为异常并进行报错处理。
统一错误信息:仅返回固定的几种错误提示,使SSRF攻击无法获取有效反馈,成为无回显漏洞。