Adminxe's Blog | 低调求发展 - 潜心习安全 ,技术永无止境 | 谢谢您对本站的支持,有什么问题或者建议请及时联系:点击这里给我发消息

PHP基础代码审计 2.4 PHP注入漏洞

代码审计 Adminxe 2164℃ 0评论

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注入漏洞

喜欢 (7)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址