当前位置: 首页 > news >正文

ctfshow web入门 SSRF

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

http://www.hskmm.com/?act=detail&tid=10612

相关文章:

  • C#中避免GC压力和提高性能的8种技术
  • ctfshow web入门 爆破
  • 函数内联
  • 7. Innodb底层原理与Mysql日志机制深入剖析
  • 深入解析:HSA35NV001美光固态闪存NQ482NQ470
  • ERP和MES、WMS、CRM,到底怎么配合 - 智慧园区
  • YOLO实战应用 1YOLOv5 架构与模块
  • YOLO实战应用 2数据准备与增强
  • Day18稀疏数组
  • 底层
  • YOLO实战应用 3训练与优化策略
  • WPF 视图缩略图控件(支持缩放调节与拖拽定位)
  • ik中文分词器使用
  • 动态水印也能去除?ProPainter一键视频抠图整合包下载
  • SpringBoot整合RustFS:全方位优化文件上传性能
  • windows使用es-client插件
  • AI学习日记 - 实践
  • es中的端点
  • 解码C语言宏
  • es中的索引
  • es中的数据类型
  • 防御安全播客第214期:数据泄露与漏洞攻防实战
  • windows使用kibana
  • 03作业
  • 软工作业个人项目
  • YOLO进阶提升 5标注与配置
  • rapidxml中接口函数
  • YOLO进阶提升 6模型训练与测试
  • YOLO进阶提升 4训练准备与数据处理
  • windows安装elasticsearch