include的直接用法
碰到include()
第一反应,应该就是想到php伪协议中的filter,直接上payload
php://filter/convert.base64-encode/resource=flag.php
更多有关filter
参数的用法,可以往下看
data协议
如果出现类似php、flag等关键字过滤的函数,没法用特殊构造方法绕过的时候,考虑使用data协议配合base64加密的方法,同样下面直接放上payload
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
#上面base64解码:<?php system('cat flag.php');
大写绕过
一种很骚的方法,str_replace
不是在找php吗?那关我PHP什么事?
include_path
说实话对于安全防御来说这更像是个可有可无的属性,看看官方是怎么解释的
为了方便理解,假设代码长下面这样
if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file);}else{ highlight_file(__FILE__);
不管include_path
在php.ini
中如何定义,只要访问的路径是类似../???
这样的相对路径或者绝对路径,该属性起不到任何限制作用
日志写入
日志虽然不能用来执行,但如果跟上述include
结合,在日志中写入的代码便能在宿主php文件中执行
具体web服务器的默认日志目录可以参考[靶场日记]第一章
php://filter
讲究很多,不过内容基本上都概括在下面两篇博客里
要注意的是,该伪协议中如果使用的是的write选项,那么后面resource的参数是可以跟一个你自己取文件名,并且会在利用目录下新建该文件并写入内容
base64的等号
等号、加号,这些base64编码结果末尾常见的符号被叫做“占位符”。字面意思,其实就是为了填充编码后的字符串,使得其满足base64的长度规范。在字符串末尾删掉这些符号也不会影响解码结果(这里强调末尾,因为其他位置的占位符删除有可能导致预料意外的结果)
convert、string、zlib、mcrypt
上面这几个东西都是伪协议中的过滤器,也只有这四个
不一样的过滤器有不一样的功能,详情可以看这里
过滤器的配合能让你很轻松地绕过大部分防御,详情还是参考file_put_content和死亡·杂糅代码之缘