[靶场笔记]第六章
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 讲究很多,不过内容基本上都概括在下面两篇博客里 谈一谈php://filter的妙用 file_put_content和死亡·杂糅代码之缘 要注意的是,该伪协议中如果使用的是的write选项,那么后面resource的参数是可以跟一个你自己取文件名,并且会在利用目录下新建该文件并写入内容 base64的等号 等号、加号,这些base64编码结果末尾常见的符号被叫做“占位符”。字面意思,其实就是为了填充编码后的字符串,使得其满足base64的长度规范。在字符串末尾删掉这些符号也不会影响解码结果(这里强调末尾,因为其他位置的占位符删除有可能导致预料意外的结果) convert、string、zlib、mcrypt 上面这几个东西都是伪协议中的过滤器,也只有这四个 不一样的过滤器有不一样的功能,详情可以看这里 过滤器的配合能让你很轻松地绕过大部分防御,详情还是参考file_put_content和死亡·杂糅代码之缘