hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境

unbentu,docker

https://2021.ctf.link/assets/files/includer's%20revenge-25377e1ebb23d014.tar.xz

二、解析

PHP Filter 当中有一种 convert.iconv 的 Filter ,可以用来将数据从字符集 A 转换为字符集 B ,其中这两个字符集可以从 iconv -l 获得,这个字符集比较长,不过也存在一些实际上是其他字符集的别名。

举个简单的例子:

复制代码
<?php
$url = "php://filter/convert.iconv.UTF-8%2fUTF-7/resource=data:,some<>text";
echo file_get_contents($url);
// Output:
// some+ADwAPg-text

使用以上例子,我们可以通过 iconv 来将 UTF-8 字符集转换到 UTF-7 字符集。那么这个有什么用呢?

结合我们上述提到的编码、文件内容,我们是不是可以利用一些固定文件内容来产生 webshell 呢

单看代码其实并不难

可以说是 onelinephp 了,当然如果光看这些代码,我们可以直接用 36c3 hxp CTF includer 的解法解掉,用 compress.zip://http:// 产生临时文件,包含即可

当然这里既然标了 revenge 肯定说明有一些不同的地方,结合题目给我们的附件,我们可以发现相对上一次 includer 题目有了比较大区别,主要在 Dockerfile 里面:

复制代码
RUN chown -R root:root /var/www && \
    find /var/www -type d -exec chmod 555 {} \; && \
    find /var/www -type f -exec chmod 444 {} \; && \
    chown -R root:root /tmp /var/tmp /var/lib/php/sessions && \
    chmod -R 000 /tmp /var/tmp /var/lib/php/sessions

使用以上例子,我们可以通过 iconv 来将 UTF-8 字符集转换到 UTF-7 字符集。那么这个有什么用呢?

pass:出题人这里竟然狠心把 php tmp 目录以及一些临时目录都弄得不可写了,所以导致之前题目的产生临时文件的方法就失效了。

所以很明显,我们需要找到另一个产生临时文件,将其包含的方法。

源码很容易看出是一句话木马:

这里我们思考一个问题

那我们测试一下,很明显可以

那我们可以用Base64创造我们想要的内容吗?

这里就要说到一个技巧了

我们先假设我们的文件内容为 14 个 a 字符,我们可以通过暴力遍历 iconv 支持的字符编码形式,看我们得到的结果,例如:

复制代码
$url = "php://filter/";
​
$url .= "convert.iconv.UTF8.CSISO2022KR";
​
$url .= "/resource=data://,aaaaaaaaaaaaaa";     //我们这里简单使用 `data://` 来模拟文件内容读取。
var_dump(file_get_contents($url));
​
// hexdump:
// 00000000  73 74 72 69 6e 67 28 31  38 29 20 22 1b 24 29 43  |string(18) ".$)C|
// 00000010  61 61 61 61 61 61 61 61  61 61 61 61 61 61 22 0a  |aaaaaaaaaaaaaa".|

我们可以看到这个 UTF8.CSISO2022KR 编码形式,并且通过这个编码形式产生的字符串里面, C 字符前面的字符对于 PHP Base64 来说是非法字符,所以接下来我们只需要 base64-decode 一下就可以去掉不可见字符了,但是与此同时,我们的 C 字符也被 base64-decode 解码了,这时候我们需要再把解码结果使用一次 base64-encode 即可还原回来原来的 C 字符了。

什么都没干莫名其妙生成了一个C

那我们思考一下假如生成的不是一个C而是base64形式下的一句话木马,我之后对其进行解码,是不是可以做一些事情???

那这里有小伙伴就有疑问了,字符集编码怎么来的,这里就要说一个国外的老师将字符集编码进行了一个开源wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT (github.com)

python的脚本会自动生成

把所有字符拼完以后进行了一个base64

理论形成开始测试,看是否能打印出/etc/passwd

实现文件包含RCE

相关推荐
北城笑笑5 分钟前
Vue 109 ,从零搭建 Vue3 + Electron 工程:生态、安全桥接与打包选型( Vue + Electron )
前端·javascript·vue.js·安全·electron·vue
山东科恩光电13 小时前
安全触边在协作机器人工作站防碰撞防护中的安装方案与性能优化
安全
山东科恩光电1 天前
安全地毯压力感应防护在工厂自动化区域的实时监测与停机联动应用
安全
Flynt2 天前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
国科安芯2 天前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
国科安芯2 天前
算力上天之后的电与静:星上边缘计算载荷带外管理网络的低功耗调度与辐射容错
网络·人工智能·嵌入式硬件·安全·边缘计算·低轨卫星·商业航天
7177772 天前
2026 供应链安全用什么:SBOM、SLSA 与制品库的落地选型
安全·gitee
QXWZ_IA2 天前
定位数据怎么推给 IoT 平台?消息协议选型与接入准备
网络·人工智能·物联网·安全
不庸.2 天前
WPScan 实战入门:从 Docker 靶场到弱密码爆破
运维·安全·web安全·docker·容器·安全性测试·wpscan
qq_452396232 天前
第十篇:《Kafka 安全加固:SASL、SSL、ACL 与多租户隔离》
安全·kafka·ssl