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_pathphp.ini中如何定义,只要访问的路径是类似../???这样的相对路径或者绝对路径,该属性起不到任何限制作用

日志写入

日志虽然不能用来执行,但如果跟上述include结合,在日志中写入的代码便能在宿主php文件中执行

具体web服务器的默认日志目录可以参考[靶场日记]第一章

php://filter

讲究很多,不过内容基本上都概括在下面两篇博客里

谈一谈php://filter的妙用

file_put_content和死亡·杂糅代码之缘

要注意的是,该伪协议中如果使用的是的write选项,那么后面resource的参数是可以跟一个你自己取文件名,并且会在利用目录下新建该文件并写入内容

base64的等号

等号、加号,这些base64编码结果末尾常见的符号被叫做“占位符”。字面意思,其实就是为了填充编码后的字符串,使得其满足base64的长度规范。在字符串末尾删掉这些符号也不会影响解码结果(这里强调末尾,因为其他位置的占位符删除有可能导致预料意外的结果)

convert、string、zlib、mcrypt

上面这几个东西都是伪协议中的过滤器,也只有这四个

不一样的过滤器有不一样的功能,详情可以看这里

过滤器的配合能让你很轻松地绕过大部分防御,详情还是参考file_put_content和死亡·杂糅代码之缘