web
web1
首先要使$login=true,想到的是md5弱类型比较,查看str_shuffle函数的用法,是随机地打乱字符串中的所有字符。如果是md5加密绕过的话,想到的是0e开头绕过和传入数组绕过。但是str_shuffle打乱之后这两种思路都行不通。试图查看str_shuffle函数有没有漏洞,没有找到。
接下来继续观察, $unserialize_str这个函数是可控的,它与$username弱类型比较的值要为真,而$username是不可控的,查看弱类型比较还有什么可以利用的地方,发现可以利用0与字符串弱类型比较的结果也为0(这里要注意的是,第一个字符不能为数字),到这里就清楚了,md5在这里就是混淆视线的,我们可以把$username,$password视为随机值。
那么接下来要思考的是,怎样让$unserialize_str[‘username’]和$unserialize_str[‘password’]的值为0
注意到 unserialize函数,想到反序列化漏洞,但是在反序列化漏洞中没有找到可以利用的地方。
还是继续从弱类型比较入手,PHP弱类型 - 简书 https://www.jianshu.com/p/90d235d4f745
在这篇文章中找到
这里的json_decode函数让我联想到了unserialize函数,都是可以触发反序列化漏洞的函数。
这里的payload为 item={“key”:0},尝试构造这到题的payload,没有成功。
继续找弱类型,发现这篇文章,ctf常见php弱类型分析_词语大杂烩-CSDN博客_ctf弱类型 https://blog.csdn.net/qq3401247010/article/details/77867399
发现这道题的payload用的是数组的方法,unserialize函数在数组中不会报错。
接着绕过正则,https://blog.csdn.net/silence1_/article/details/102835743参考了这篇文章,构造payload
1 | ?str=a:2:{s:8:%22username%22;i:0;s:8:%22password%22;i:0;}&code=eval(end(current(get_defined_vars())));&b=var_dump(highlight_file(end(scandir(pos(localeconv()))))); |
web2
1 |
|
$_SERVER[“REMOTE_ADDR”] 为获取IP
$a ?? 0 等同于 isset($a) ? $a : 0
$a ?: 0 等同于 $a ? $a : 0
可得$_GET[“action”] ?? “” 等同于isset($attion) ? $attion : “”
我们的目的就是要让$action=’upload’,执行file_put_contents函数
$dir并不是我们能控制的,也就是file_put_contents函数打开的文件路径是固定的,这里我在本地测试的时候遇到一个问题,文件名中不能含有’/‘
既然名不能有’/‘,我一开始想到的是注释,但是行不通,然后是文件流,base64编码,但是由于$dir不是我们能控制的,所以都行不通。接着发现mkdir函数在创建文件目录或文件是也不能有’/‘等特殊符号,如何存在’/‘,’/‘前面会被当成创建文件目录处理。而这道题中刚好有有mkdir函数if(!file_exists($dir)){ mkdir($dir);}
只要执行mkdir函数,file_put_contents函数打开的文件路径就不会报错了。
这道题还可以通过让$action=pwd,打印出$dir,也就是file_put_contents函数打开的文件路径。
接下来考虑的是$data变量,因为file_put_contents函数打开的文件后缀为php,也就是如果$data为输入php格式,可以执行php代码。
这里 waf($data)调用了两个函数
1 | error_reporting(0); |
isArray() 方法用于判断一个对象是否为数组。如果对象是数组返回 true,否则返回 false。我们刚才分析$data的内容应该是php文件的格式,所以不会是一个数组。观察 check方法
php被过滤,我们可以采用短标签的格式,<?= ?>
到这里一开始的想法是构造一句话木马,但是这些符号被过滤了,构造失败
1 | _ ^ ~ ; { } |
然后发现反引号没有被过滤,可以构造= %09`dir`?>
这里空格被过滤,用%09代替。
这里当前目录只有index.php,一开始的想法是通过返回上级目录查看内容,也就是cd%09..&&ls
,但发现没有执行成功,最后是通过返回根目录
可以看出最后xxxaf14gss.php即为我们想找的文件,cat /xxxaf14gss.php,php被过滤,用*绕过
misc
隐藏的书
用Bandzip解压成功
打开pdf是一篇隐写的论文,到这里就很清楚了,就是需要根据论文的解密方法解开flag.txt的内容
隐写信息的编码
编码算法首先应获取秘密信息每一位的 ASCII 码,之后把 ASCII 码转换为十六进制 数,最后用 Unicode 编码字符表示从 ASCII 码转换过来的十六进制数。考虑的中文 ASCII 编码的特殊性,中文一个字符占两个字节,则我们将每个字节分别转为对应 的 ASCII 码,即一个英文字符用两个不可见字符表示,而一个中文字符用四个不可 见字符表示。
隐写信息的一个英文字符用两个不可见字符表示 ASCII码 –> 十六进制数 –> Unicode编码
隐写信息的嵌入
第一步:找到’.’字符
第二步:以字符‘.’为界截成 Ca 和 Cb 两部分,并且‘.’字符在 Ca 中
第三步:Ca、不可见字符串、Cb 的顺序形成新的字符串
这道题中Ca为Hello. Cb为Gzmtu,中间为不可见字符串
隐写信息的解码
对每一个字符逆的 Unicode编码找到对应的 ASCII 编码;最后,根据 ASCII 码转换出相应的实际字符;
首先,我们可以从Unicode编码推出hex编码(16进制),再推出ASCII码。
这道题的不可见字符从0606开始,到070D结束。
因为隐写信息的一个英文字符用两个不可见字符表示,也就是0606代表一个英文字母,060c代表一个英文字母,以此类推到070D。
一般的flag形式为flag{****},也就是0606表示的是f,060c表示的是l,可以猜测,该算法的0606表示的是16进制66,转换为ASCII码是f。
1 | 例:隐写flag |
神秘的铃声
010脚本安装
Templates(模板,范本)—Template Repository
选中脚本(.bt文件),使用F5运行分析,如果没有窗口,那么手动打开窗口 View—Inspector Windows—Show/Hide All Inspector Windows
参考文章:http://www.cxyzjd.com/article/iamsongyu/84674337
打开题目给的wav文件,发现有一个struct UNKNOWNCHUNK unkown模块,发现是一串base64字符串,复制到burpsuit进行解码。
解码完是以PK开头的,保存为zip文件,复制到repeater模块,右键保存为zip文件。
打开文件需要解码,想到WAV文件播放是一段DTMF音频,也就是电话机按键的声音
识别音频的网站:http://dialabc.com/sound/detect/index.html
D#*C9A16B即为zip文件的密码,解压得到flag.txt是一串坐标,将其转换为图片得到二维码扫码得到flag:
1 | from PIL import Image |
也可以安装gnuplot
神秘的网站
扔到wireshark分析根据题目提示是一个神秘的网站,只需要找HTTP即可。hint提示了上传包那么:直接filter过滤出所有POST协议迅速就能找到上传包。(http.request.method==”POST”)
追踪该HTTP流,发现有zip文件
右键,导出分组字节流
解压得到一个文件和一张图片
看到最后是KP,想到应该是zip文件开头的PK,自然想到该文件是倒转。
1 |
|
得到zip文件,解压发现需要密码。
- 图片只能看到一部分说明chunk被破坏过用010打开可以发现chunk4长度很奇怪应该被改过
将其改大可以恢复图片得到一串字符串
得到的这个字符串是zip文件的密码,解压得到一个音频文件,不过该音频文件也是需要倒放,打开au,效果—反向(时间)即可。最后用网易云音乐听歌识曲,flag在评论区。