云曦月末断网考核复现

Web

先看一个BUUCTF中的文件一个上传题

[BUUCTF] 2020新生赛 Upload

打开后是一个文件上传页面

随便上传一个txt一句话木马后出现js弹窗,提示只能上传图片格式文件

说明有前端验证。我的做法是把一句话改为.jpg格式,

然后上传

访问发现虽然上传成功了,但无法解析

当然图片麻烦也无法进行解析,上传无效

然后尝试抓包上传绕过js前端验证后修改后缀名

然后修改数据包

改后缀 (因为是黑盒测试,不知道过滤源码,只能一个个尝试修改了各种后缀,(php1、php2、php3、php4、php5、phps、pht、phtm)但都上传失败,直到最后发现phtml后缀才可以上传成功的同时能被解析)

然后放行,上传成功得到路径

新建网页,把原环境url与得到的图片路径拼接访问,发现是空白页

这里还记得一句话木马上传的参数不? 我的是a

用post传参php语句,验证是否可执行php语句 上传后发现能解析

接下来就可以蚁剑连接

连接成功后添加

进入目录文件找到flag

其实云曦月末考核的文件上传和这题就是一样的(好后悔假期的时候以为这题简单没做。。)

ez_upload

启动靶机后任然只允许上传图片文件

那就改木马后缀名来绕过前端验证(制作图片马也可以)然后抓包上传

修改数据包

放行后上传成功,得到文件路径

同样的,拼接url访问成功得到空白页面

验证是否可执行php语句

发现能解析

那就可以连蚁剑

连接成功后添加数据

最后打开目录搜寻flag即可

ez_ssrf

看题目这题需要先了解ssrf

SSRF(服务器端请求伪造)漏洞解析

定义

SSRF(Server-Side Request Forgery,服务器端****请求伪造)是一种安全漏洞,攻击者通过精心构造的请求,诱使服务器端发起对指定目标的网络请求。这种漏洞通常用于访问从外网无法直接访问的内部系统

原理

SSRF漏洞的形成原因主要是服务端提供了从其他服务器获取数据的功能,但没有对目标地址、协议等进行严格的过滤和限制。例如,应用可能允许用户输入URL来获取内容,但未对输入进行验证,导致攻击者可以构造****恶意URL,使服务器访问内网或外部的任意资源

攻击方式

内网攻击:攻击者可以利用SSRF漏洞访问内网资源,如数据库内部服务

端口扫描:通过向不同端口发送请求判断端口是否开放

文件读取:利用**file://协议****读取服务器本地文件**

其他协议利用:如**gopher://dict://等协议,可用于执行特定的攻击**

例如

假设一个应用允许用户输入URL来加载内容,但未对输入进行验证。攻击者可以构造如下URL:

http://example.com/load?url=http://192.168.1.100:6379/

这可能导致服务器访问内网的Redis服务(就是一个开源的数据库),从而引发一些安全问题,当然,这也意味着在ctf中可以利用它获取flag(攻击内网系统、读取敏感文件、执行恶意操作)

ssrf的常见利用方式

内网端口扫描和主机存活探测

利用SSRF漏洞,攻击者可以扫描 内网的开放端口 ,探测内网主机的存活情况。例如,通过构造**http://192.168.1.1:80等请求,检查内网主机的80端口是否开放**(其实和上面说的差不多)

攻击内网应用

利用**file://协议,攻击者可以读取服务器本地文件。例如,通过构造file:///etc/passwd等请求,读取服务器的/etc/passwd**文件(也和上面说的一样)

利用伪协议进行攻击

SSRF漏洞可以结合多种伪协议进行攻击,如**gopher://** 、dict:// 等。例如,gopher://协议可以发送GETPOST请求,攻击内网的RedisMySQL等服务

绕过限制

当SSRF漏洞存在限制时,攻击者可以利用多种绕过技巧,如短网址进制转换DNS解析等。例如,通过http://127.0.0.1的十进制形式http://2130706433或十六进制形式http://0x7F000001绕过IP限制

接下来看这题

源码

复制代码
 <?php
highlight_file(__FILE__);

//flag在/flag路由中

if (isset($_GET['url'])){
    $url = $_GET['url'];
    
    if (strpos($url, 'http://127.0.0.1') !== 0){
        echo json_encode(["error" => "Only http://127.0.0.1 URLs are allowed"]);
        exit;
    }

    $host = parse_url($url, PHP_URL_HOST);

    $ip = gethostbyname($host);

    $forbidden_ips = ['127.0.0.1', '::1'];
    if (in_array($ip, $forbidden_ips)){
        echo json_encode(["error" => "Access to localhost or 127.0.0.1 is forbidden"]);
        exit;
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'curl/7.68.0');
    
    $response = curl_exec($ch);

    if (curl_errno($ch)){
        echo json_encode(["error" => curl_error($ch)]);
    } else {
        echo $response;
    }

    curl_close($ch);
} else {
    echo json_encode(["error" => "Please provide a 'url' parameter"]);
}
?>
{"error":"Please provide a 'url' parameter"}

进行代码审计

前面的引入高亮函数啥的就不用说了

算了再记一下也没什么不好的

highlight_file(__FILE__); 会显示当前脚本的源代码,并对其进行语法高亮。这通常用于调试,方便查看代码结构

然后检查是否有get参数传入

复制代码
if (isset($_GET['url'])){
    $url = $_GET['url'];

if (strpos($url, 'http://127.0.0.1') !== 0){
        echo json_encode(["error" => "Only http://127.0.0.1 URLs are allowed"]);
        exit;
    } 

strops()是一个在PHP中用于查找字符串中字符 或子字符串第一次出现位置的函数

即验证URL必须以**http://127.0.0.1**开头,否则报错

复制代码
$host = parse_url($url, PHP_URL_HOST);

    $ip = gethostbyname($host); 

解析 URL的主机名并获取其IP地址

复制代码
$forbidden_ips = ['127.0.0.1', '::1'];
    if (in_array($ip, $forbidden_ips)){
        echo json_encode(["error" => "Access to localhost or 127.0.0.1 is forbidden"]);
        exit;
    } 

设置了一个黑名单用于禁止访问127.0.0.1::1(本地回环地址)

分析下来就可以利用URL的解析差异来绕过(特殊构造的URL可能被parse_url和gethostbyname解析不一致)

比如这里利用0.0.0.0或localhost别名(localhost可以解析为127.0.0.1或::1(IPv6),但这个被过滤了绕不过。)

利用0.0.0.0

因为某些系统配置中0.0.0.0等同于127.0.0.1,

  • 在服务器监听时 :表示监听所有可用的网络接口

  • 在客户端连接时 :通常会被解析为127.0.0.1(回环地址)

  • 在某些系统上 :直接访问0.0.0.0会被重定向到localhost

如果我构造一个url参数值由三部分组成来绕过:

http://127.0.0.1(用于满足开头的检查

:80@ (相当于"密码"的占位符

0.0.0.0(实际连接的主机)

既然是为了flag而来那就应该是cat flag,所以加/flag

所以总的url参数值就是

复制代码
http://127.0.0.1:[email protected]/flag

访问得到flag

至于为什么要这么构造:

http://127.0.0.1是为了满足strpos()的检查,规定url参数必须以这个开头

重点是:80@ 因为基本的URL结构就需要" 密码"

一个包含认证信息的URL标准格式

复制代码
http://username:password@hostname/path

而这题根据需要给它构造成这样

复制代码
http://127.0.0.1:[email protected]/flag

也就是

  • 127.0.0.1 被解析为"用户名"

  • 80 被解析为"密码"

  • 0.0.0.0 才是真正的主机

  • /flag 是路径

:80@ 其实就是为了改变 了URL的实际含义,也为了影响parse_url解析

gethostbyname() 会解析 host 部分(即0.0.0.0),实际请求时cURL会连接到0.0.0.0,而系统通常会将0.0.0.0视为localhost

80是HTTP默认端口增加可信度 。作为"密码"部分,它只是占位符,实际值不重要,其实也可以换成其他端口号,比如换为88

99

但80最不容易引起怀疑,还是用80的好一点

别的也不用多解释,因user:pass@host标准URL格式

但做的时候发现冒号打多了一个也没有影响

Misc

流量分析1

就第一个题有附件,后面的通用

下载后选择打开方式

010打开发现文件头是PK,典型的压缩包格式,所以先改一下后缀

全部解压缩后得到流量包

打开后进入winshark

这次要记住后缀为pcpng就是流量包了

这也是最近才了解到,比如前两天云大的Cloudever比赛就遇到

回到这里记得题目是获取抓取流量包所需要的秒数

进入统计>>捕获文件属性

可以看到经过的时间

但要注意题目要求的是秒数,转换一下就可以了

流量分析2

第二题要求的是找计算机抓取流量包时操作系统的build版本

这不就在刚刚的位置吗

题目要求flag格式为10D32,所以应该就是23F79,用Yunxi{}包裹即可

流量分析3

同样先看题目要求

要IP地址,打开协议分级,就会发现两个IP

查看http协议后有两个ip

192.168.75.131

192.168.75.132

试了以后发现131是正确的

流量分析4

受害者的操作系统是什么

相关推荐
过期动态1 小时前
【动手学深度学习】LeNet:卷积神经网络的开山之作
人工智能·python·深度学习·神经网络·机器学习·分类·cnn
88号技师9 小时前
模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊
人工智能·机器学习·分类·数据挖掘·信号处理·故障诊断·信息熵
吴法刚1 天前
14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))
人工智能·深度学习·自然语言处理·分类·langchain·bert·langgraph
随风飘摇的土木狗1 天前
【MATLAB第114期】基于MATLAB的SHAP可解释神经网络分类模型(敏感性分析方法)
神经网络·matlab·分类·全局敏感性分析·gsa·敏感性分析·shap
ArimaMisaki2 天前
量化策略分类、优劣势及对抗风险解析
人工智能·金融·分类·数据挖掘·游戏策划
DragonnAi2 天前
猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
人工智能·分类
AI街潜水的八角2 天前
深度学习图像分类数据集—枣子水果成熟度分类
人工智能·深度学习·分类
@MrLiu3 天前
# 基于BERT的文本分类
人工智能·自然语言处理·分类·bert
人大博士的交易之路3 天前
今日行情明日机会——20250409
人工智能·数学建模·分类·数据挖掘·量化交易