PHP杂记
最近hvv当蓝队,每天闲的要死,又不能打游戏,于是就开始认真读文章,复现
前两天打强网+dsctf,打的挺自闭的,也发现了自己的一些问题,之前打比赛搜payload有时候搜到了就直接用了,完全没懂原理,稍微一改就没想出来,比如昨天的php://filter我现在才知道是流处理器,能做很多事情,于是抽时间把很多关于php的部分复现了。
CISCN2022华北
签到题,当时直接搜的p牛的php裸包含,payload抄来改改直接用了,但细想有很多地方不理解。
1 | GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1 |
读完p牛文章大概意思就是说php会把?query-string没有等号的会当做命令行参数,所以可以用pearcmd.php来传入参数来执行php脚本,其中这个config-create就是写配置文件的。
Root directory must be an absolute path beginning with “/“, was: “123”
这就解释了为什么是
/<?=phpinfo()?>
成功写进来长这样:
里面包含了很多乱七八糟的,但只要有<?php就好了。
剩下的我们需要搞清楚php对我们url的处理,如何理解get的参数,如何理解argv?
分析得到通过+来划分argv
所以,这段代码的意思就相当于下图,直接执行了这个命令,写进了配置文件。
1
$ php pearcmd.php config-create /&page=../../../usr/local/lib/php/pearcmd&/%3C?php%20echo%201;?%3E /tmp/aab
然后$_GET理解没有变化,都是按照&来分割,=来区分键值对。
综上,这个利用payload是巧妙的将php对url中get变量的分离与argv变量的分离构造出来的,虽然很简单,但不得不说很巧妙。