<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    PHP編碼安全:上傳文件安全

    VSole2021-12-10 22:13:22

    在Web系統中,允許用戶上傳文件作為一個基本功能是必不可少的,如論壇允許用戶上傳附件,多媒體網站允許用戶上傳圖片,視頻網站允許上傳頭像、視頻等。但如果不能正確地認識到上傳帶來的風險,不加防范,會給整個系統帶來毀滅性的災難。

    在PHP項目中,提供上傳功能并在服務器端未對上傳的文件格式進行合理的校驗是存在巨大風險的。如果惡意攻擊者利用上傳漏洞上傳一些webshell,則可能完全控制整個網站程序,執行系統命令,獲取數據庫鏈接字串進行操作數據庫等危險操作。

    1、文件上傳漏洞

    以下是一個不安全的上傳代碼示例,即文件上傳PHP接收代碼upload.php。

    $upload_dir='uploads'; // 用戶上傳文件保存目錄

    $upload_file=$upload_dir.basename($_FILES['userfile']['name']);

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

    echo "恭喜您,文件上傳成功";

    } else {

    echo "文件上傳失敗";

    }

    ?>

    以下是文件上傳HTML代碼upload.html。

    請選擇上傳文件:

    這是一個簡單的上傳文件功能,其中由用戶上傳文件,如果上傳成功,保存文件的路徑為http://服務器路徑/uploads/文件名稱。

    如果攻擊者上傳一個如下內容的hacker.php腳本文件到服務器:

    system($_GET['shell']);

    ?>

    則攻擊者就可以通過該文件進行URL請求http://服務器路徑/uploads/hacker.php?shell=ls%20-al,從而可以執行任何shell命令。

    圖1所示是惡意腳本的執行結果,其中列出了該目錄下的所有文件。

    圖1 上傳漏洞造成的webshell執行結果

    2、檢查文件類型防止上傳漏洞

    上面例子中的代碼非常簡單,并沒有進行任何的上傳限制。如果要限制,通常的做法是限制文件上傳類型。

    下面在PHP代碼中增加了文件類型限制來防止上傳漏洞。

    if($_FILES['userfile']['type']!="image/gif") {

    die("請上傳正確的文件類型");

    }

    $uploaddir='uploads';

    $uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

    echo "恭喜您,文件上傳成功";

    } else {

    echo "文件上傳失敗";

    }

    ?>

    在這種情況下,如果攻擊者試圖上傳shell.php,則應用程序在上傳請求中將檢查文件MIME類型。以下是拒絕上傳的HTTP請求返回數據包。

    POST /upload.php HTTP/1.1

    TE: deflate,gzip;q=0.3

    Connection: TE,close

    Host: localhost:8080

    User-Agent: Mozilla/5.0(Macintosh: Inter Mac OS X10_13_2)

    AppleWebKit/537.36(KHTML,like gecko) Chrome/65.0.3325.181

    Safari/537.36

    Content-Type: multipart/form-data;boundary=xYzzY

    Content-Length:32

    --s76f8a7sf8as9f8a9f80as8df--

    Content-Disposition: form-data;name="userfile";filename="shell.php"

    Content-Type: text/plain

    system($_GET['shell']);

    ?>

    --s76f8a7sf8as9f8a9f80as8df--

    HTTP/1.1 200 OK

    Date: Thu, 31 May 2019 22:00:01 GMT

    Server: Apache

    X-Powered-By: PHP/5.6

    Content-Length: 30

    Connection: close

    Content-Type: text/html

    請上傳正確的文件類型

    這里成功地通過檢測類型防止了非授權類型文件的上傳,服務器拒絕接收文件。

    但是如果只進行上傳文件類型的檢查也是不夠的,攻擊者通過修改POST數據包中Content-Type:text/plain字段為Content-Type:image/gif,然后發送數據包,即可成功實現惡意腳本的上傳。

    3、檢查文件擴展名稱防止上傳漏洞

    除了檢查文件類型外,研發人員最常用的防范方法之一,就是基于白名單或者黑名單,驗證所傳文件的擴展名稱是否符合。以下代碼通過黑名單方式對文件類型進行限制。

    $blacklist=array(".php","phtml",".php3",".php4"); // 黑名單

    $uploaddir='uploads/';

    $uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

    $item==substr($_FILES['userfile']['name'],-4);

    if(in_array($item,$whitelist)) {

    die("請上傳正確的文件類型");

    }

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

    echo "恭喜您,文件上傳成功";

    } else {

    echo "上傳失敗";

    }

    ?>

    以下是白名單模式限制文件類型的代碼示例。

    $whitelist=array(".jpg",".gif","png"); //白名單

    $uploaddir='uploads/';

    $uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

    $item==substr($_FILES['userfile']['name'],-4);

    if(!in_array($item,$whitelist)) {

    die("請上傳正確的文件類型");

    }

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

    echo "恭喜您,文件上傳成功";

    } else {

    echo "上傳文件失敗";

    }

    ?>

    從黑名單和白名單兩種不同的驗證方法來看,白名單方式絕對要比黑名單安全得多。但是,并不是說采用白名單方式驗證就足夠安全了。

    IIS服務存在一個漏洞(Microsoft Internet Infomation Server 6.0 ISAPI Filename Analytic Vulnerability),如上傳一個名為hacker.php;.gif的文件到服務器,PHP腳本文件因限制最后4個字符,所以本文件是合法的,但是當上傳后瀏覽該文件——http://服務器路徑/uploads/hacker.php;.gif時,就可以繞過Web程序的邏輯檢查,從而能導致服務器以IIS進程權限執行任意惡意用戶定義的腳本。此漏洞只針對于IIS特定版本。

    在Apache程序中,同樣存在一個由擴展名解析的漏洞。當惡意攻擊上傳一個有多個擴展名的PHP腳本文件時,如果最后的擴展名未定義,就會解析前一個擴展,比如hacker.php.2018文件。當將該文件上傳時,如果是以白名單、黑名單方式進行驗證,就可以繞過驗證,上傳非法文件到服務器,當瀏覽http://服務器路徑/uploads/hacker.php.2018時,就會被當成PHP腳本執行。

    4、文件上傳漏洞的綜合防護

    以上例子說明,不可以只通過一種安全手段來阻止攻擊者進行非法文件上傳,應該同時綜合應用檢測文件類型、檢查文件后綴、黑白名單、使用隨機文件名稱等多種方法進行防范。下面的代碼是綜合應用示例。

    /**

    * 生成隨機字符串

    * @param int $len

    * $return string

    */

    function genRandomString($len) {

    $chars=array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9");

    $charsLen=count($chars)-1;

    shuffle($chars); // 將精妙絕倫打亂

    $output="";

    for($i=0;$i<=$len;$i++) {

    $output.=$chars[mt_rand(0,$charsLen)];

    }

    return $output;

    }

    $whitelist=array(".jpg",".gif","png"); //白名單

    $item==substr($_FILES['userfile']['name'],-4);

    if(!in_array($item,$whitelist)) {

    die("請上傳正確的文件類型");

    }

    if($_FILES['userfile']['type']!="image/gif") { // 校驗文件MIME類型

    die("請上傳正確的文件類型");

    }

    $uploaddir='/tmp/uploads'; // 將用戶上傳的文件放到項目目錄之外

    $uploadfile=$uploaddir.genRandomString(20).$item; // 使用隨機文件名

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

    echo "恭喜您,文件上傳成功";

    } else {

    echo "上傳文件失敗";

    }

    ?>

    驗證上傳文件的擴展名,以白名單、黑名單方式為主,但最好使用白名單。

    除了在代碼邏輯中防止上傳漏洞外,同時也可以在項目部署時將上傳目錄放到項目工程目錄之外,當作靜態資源文件處理,并且對文件的權限進行設定,禁止文件的執行權限。

    當用戶上傳文件到服務器保存時,一定要使用隨機文件名進行存儲,并保證所存儲的擴展名合法。保證文件名的唯一性,也保證了存儲的安全性,可以防止上傳文件非法擴展進行解析。

    php文件類型
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    專家警告,一個影響Concrete5 CMS的遠程執行代碼漏洞使許多服務器面臨完全接管。CMS目前已被全球許多知名組織使用,包括BASF,GlobalSign和美國陸軍。通過在服務器上執行任意命令,攻擊者可能會損害完整性,可用性和機密性。該漏洞是在2020年1月通過HackerOne平臺報告的,但該漏洞已在6月發布的Concrete5版本中修復。EdgeScan專家還提供了一些建議,以確保CMS的安全。“至少每周更新一次同樣重要。定期備份CMS及其基礎數據庫。”
    id=10結尾,我們猜測可能是一個sql注入點。首先我們在id=10后面加上一個單引號’進行判斷。網站所呈現的內容是由代碼中寫入的sql語句調用數據庫中的內容進行一個呈現,例如我們剛剛看到的文字。而sql注入漏洞一般是由于程序員書寫的sql語句不規范所導致的安全事件。例如網站源碼中使用如下的sql語句進行查詢。發現10列的時候報錯,說明不足10列,我們繼續縮小范圍。發現會分別回顯第三列、第五列和第七列。
    在Web系統中,允許用戶上傳文件作為一個基本功能是必不可少的,如論壇允許用戶上傳附件,多媒體網站允許用戶上傳圖片,視頻網站允許上傳頭像、視頻等。但如果不能正確地認識到上傳帶來的風險,不加防范,會給整個系統帶來毀滅性的災難。
    如果Web系統中存在服務器請求偽造漏洞,不僅會影響系統本身,而且會影響到與其相關的其他系統服務。一個被忽視的服務器請求偽造漏洞,很容易引起蝴蝶效應,可能給整個系統帶來長期的巨大危害。
    01目錄掃描分析代碼這是一道很好反序列化字符串溢出的題目,首先打開容器看到這是一個上傳點先進行目錄掃描,
    Fuxploider是一種開源滲透測試工具,可自動檢測和利用文件上傳表單缺陷的過程。該工具能夠檢測允許上傳的文件類型,并能夠檢測哪種技術最適合在所需的Web服務器上上傳Web Shell或任何惡意文件。
    利用這個實驗我們就可以更清晰的了解多層網絡滲透測試的過程。并了解通過msf進行內網滲透,由一級代理到二級代理的搭建來進行對三層網絡的滲透的過程。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类