PHP脚本中,我们可以对输入进行注入攻击。什么是注入?注入即是通过利用无验证变量构造特殊语句对服务器进行渗透。
注入的种类有很多,而不仅仅只是SQL Injection。那么PHP中有哪些注入呢?
- 命令注入(Command Injection)
- Eval 注入(Eval Injection)
- 客户端脚本攻击(Script Insertion)
- 跨网站脚本攻击(Cross Site Scripting, XSS)
- SQL 注入攻击(SQL injection)
- 动态函数注入攻击(Dynamic Variable Evaluation)
- 序列化注入&对象注入
命令注入
PHP中可以使用下列5个函数来执行外部的应用程序或函数(当然、能实现这样的功能的手段不只是这5个函数)
- system()
- exec()
- passthru()
- shell_exec()
- “(与 shell_exec 功能相同)
函数原型
string system(string command, int &return_var) string exec (string command, array &output, int &return_var) void passthru (string command, int &return_var) string shell_exec (string command) command 要执行的命令 return_var 存放执行命令的执行后的状态值 output 获得执行命令输出的每一行字符串
漏洞实例
//ex1.php
<?php
$dir = $_GET["dir"];
if (isset($dir))
{
echo "<pre>";
system("ls -al ".$dir);
echo "</pre>";
}
?>
我们提交 http://www.xxx.com/ex1.php?dir=| cat /etc/passwd
提交以后,命令变成了 system(“ls -al | cat /etc/passwd”);
eval 注入
Eval 函数将输入的字符串参数当作 PHP 程序代码来执行
函数原型
mixed eval(string code_str) //eval 注入一般发生在攻击者能控制输入的字符串的时候
漏洞实例
//ex2.php
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
当我们提交 http://www.xxx.com/ex2.php?arg=phpinfo(); 漏洞就产生了
动态函数注入攻击
//ex3.php
<?php
func A()
{
dosomething();
}
func B()
{
dosomething();
}
if (isset($_GET["func"]))
{
$myfunc = $_GET["func"];
echo $myfunc();
}
?>
程序员原意是想动态调用A和B函数, 那我们提交http://www.xxx.com/exp3.php?func=phpinfo 漏洞就产生了
序列化注入&对象注入
unserialize的一个小特性
unserialize() 函数相关源码
if ((YYLIMIT – YYCURSOR) < 7) YYFILL(7);
yych = *YYCURSOR;
switch (yych) {
case ‘C’:
case ‘O’: goto yy13;
case ‘N’: goto yy5;
case ‘R’: goto yy2;
case ‘S’: goto yy10;
case ‘a’: goto yy11;
case ‘b’: goto yy6;
case ‘d’: goto yy8;
case ‘i’: goto yy7;
case ‘o’: goto yy12;
case ‘r’: goto yy4;
case ‘s’: goto yy9;
case ‘}’: goto yy14;
default: goto yy16;
}
经过测试,unserialize()解序列化一个完整序列化语句之后的字符串是会被无视掉的。
unserialize(‘a:1:{s:5:”phone”;s:11:”12345678901″;}’)
等价于
unserialize(‘a:1:{s:5:”phone”;s:11:”12345678901″;}xxxxxxxxxxxxxxxx’)
在一定的条件下、可以构造语句截断序列化。
其他序列化&对象注入相关漏洞文章
- 通过PHP反序列化进行远程代码执行 http://www.freebuf.com/vuls/80293.html
- 理解php对象注入
- WordPress < 3.6.1 PHP 对象注入漏洞
- PHP源码中unserialize函数引发的漏洞分析 https://www.91ri.org/3960.html
转载请注明:Adminxe's Blog » PHP基础代码审计 2.4 PHP注入漏洞