0%

php杂记

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”

    image-20220802155625660

    这就解释了为什么是/<?=phpinfo()?>

    成功写进来长这样:

    image-20220802155821716

    里面包含了很多乱七八糟的,但只要有<?php就好了。

image-20220802161238202

image-20220802161303293

  • 剩下的我们需要搞清楚php对我们url的处理,如何理解get的参数,如何理解argv?

    分析得到通过+来划分argv

    image-20220802162953953

    所以,这段代码的意思就相当于下图,直接执行了这个命令,写进了配置文件。

    1
    $ php pearcmd.php config-create /&page=../../../usr/local/lib/php/pearcmd&/%3C?php%20echo%201;?%3E /tmp/aab

    image-20220802163051556

    然后$_GET理解没有变化,都是按照&来分割,=来区分键值对。

    image-20220802163233383

综上,这个利用payload是巧妙的将php对url中get变量的分离与argv变量的分离构造出来的,虽然很简单,但不得不说很巧妙。