0%

CTF-SSRF

CTF-SSRF

SSRF介绍与简单介绍

原理:

1
服务器请求伪造是一种由web服务器发出请求的漏洞,它能够请求到与它相连的内网资源。因此SSRF主要测试目标是企业的内网系统。
1
2
很多web应用提供从其他服务器获取数据的功能,可根据用户提交URL访问对应资源(获取图片,下载文件,读取内容等)。
如果该功能作为代理通道去访问本地或远程服务器,这就是所谓的SSRF。

SSRF可能造成的危害

1
2
3
4
5
1、对内网进行信息探测-端口扫描
2、对内网服务区进行漏洞扫描利用
3、对内网web的应用进行安全测试,如Structs、Sql注入漏洞利用。
4、对内网中的文件读取(file协议)
5、在PHP环境中,如果搭建expect扩展,可能被命令执行。

SSRF 漏洞 常用函数

1
2
3
1、file_get_contents
PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
-将整个文件读入一个字符串。
1
2
3
4
2、fsockopen函数
(PHP 4, PHP 5, PHP 7, PHP 8)
-打开一个网络连接或者一个Unix套接字连接

1
2
3
curl函数
参考文档:https://www.php.net/manual/zh/book.curl.php
PHP支持Daniel Stenberg创建的libcurl库,能够连接通讯各种服务器、使用各种协议。libcurl目前支持的协议有http、https、ftp、gopher、telnet、dict、file、ldap。libcurl同时支持HTTPS证书,HTTP POST、HTTP PUT、FTP上传(也能通过PHP的FTP扩展完成)、HTTP基于表单上传、代理、cookies、用户名+密码的认证。

SSRF绕过限制姿势

1、添加端口

HTTP请求URL中默认以80端口。

2、短网址

https://sina.lt/

3、指定任意IP的域名xip.io

https://xip.io/

1
2
3
4
127.0.0.1.xip.io
www.127.0.0.1.xip.io
mysite.127.0.0.1.xip.io
foo.bar.127.0.0.1.xip.io

4、数制绕过

1
2
3
4
5
6
IP地址是32位二进制数->4个字节
目前看到的IP地址都是采用点分十进制组成的。
127.0.0.1 -> 01111111.00000000.00000000.00000001
转化为十进制 -> 2130706433
八进制-> 0177.00.00.01
十六进制 -> 0x7f.0x0.0x0.0x1

5、@跳转

1
2
3
4
5
在URL中使用@可跳转到指定的URL
http://www.baidu.com@127.0.0.1
变成http://127.0.0.1
https://www.baidu.com@127.0.0.1
变成https://127.0.0.1

SSRF可用协议

1、file协议

1
file://文件路径

2、dict协议

1
利用dict协议可探测端口的开放情况和指纹信息
1
2
3
命令格式:
dict://serverip:port/info
dict://127.0.0.1:80/info

3、gopher协议

1
Gopher是internet上非常有名的信息查找系统,它将internet的文件组织成某种索引,很方便从internet的一处带到另一处。在www出现之前,Gopher是internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但是www出现之后,Gopher地位受到打击。Gopher协议在SSRF可以是一个万能协议,可进行GET、POST请求发送。

构造Gopher数据:

1
2
3
4
5
抓包后将整个数据包的
空格替换成%20
问好替换成%3f
回车换行替换成%0d%0a
最后一行也需要%0d%0a

gopher GET请求

1
2
3
4
curl gopher://ip:端口/_数据


curl gopher://127.0.0.1:端口/_GET%20/..../?a=...%20HTTP/1.1%0d%0aHost:127.0.0.1%0d%0a

gopher POST请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
与get请求类似,但是需要传入更多的相关信息。
必须有

POST /.../ HTTP/1.1
Host: xxx
Content-Type: application/x-www-form-urlencoded
Content-Length:9

a=xxx


最终变成
curl gopher://_POST%20/.../%20HTTP/1.1%0d%0aHost:%20xxx%0d0aContent-Type:%20application/x-www-form-urlencoded%0d0aContent-Length%209%0d0a%0d0aa=xxx%0d%0a


特别注意 POST有两个换号位置。
%0d%0a%0d%0a
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道