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://
协议可以发送GET或POST请求,攻击内网的Redis、MySQL等服务
绕过限制
当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
受害者的操作系统是什么
