电子商务网站设计与维护,中国外贸公司排行榜,专业的推广公司,做物流网站电话一、环境
unbentu#xff0c;docker
https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz
二、解析
PHP Filter 当中有一种 convert.iconv 的 Filter #xff0c;可以用来将数据从字符集 A 转换为字符集 B #xff0c;其中这两个字符集可以…一、环境
unbentudocker
https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz
二、解析
PHP Filter 当中有一种 convert.iconv 的 Filter 可以用来将数据从字符集 A 转换为字符集 B 其中这两个字符集可以从 iconv -l 获得这个字符集比较长不过也存在一些实际上是其他字符集的别名。
举个简单的例子
?php
$url php://filter/convert.iconv.UTF-8%2fUTF-7/resourcedata:,sometext;
echo file_get_contents($url);
// Output:
// someADwAPg-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 . /resourcedata://,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