易受攻击的PHP代码示例?

易受攻击的PHP代码示例?,php,security,Php,Security,好的,我和一个朋友正在做一个关于PHP安全性的小型演示(虽然我对PHP不是很感兴趣),他让我找到一些易受攻击的PHP代码的例子(容易受到SQL注入和所有其他类型的攻击)。我想知道有没有网站上有好的和坏的代码片段,显示你应该如何编码和不应该如何编码 基本上我会把它们放到我们的网站上,他会尝试破解,然后我们会展示“合适的”网站,他会再次尝试破解。很简单: $var = $_POST['var']; mysql_query("SELECT * FROM sometable WHERE id = $va

好的,我和一个朋友正在做一个关于PHP安全性的小型演示(虽然我对PHP不是很感兴趣),他让我找到一些易受攻击的PHP代码的例子(容易受到SQL注入和所有其他类型的攻击)。我想知道有没有网站上有好的和坏的代码片段,显示你应该如何编码和不应该如何编码

基本上我会把它们放到我们的网站上,他会尝试破解,然后我们会展示“合适的”网站,他会再次尝试破解。

很简单:

$var = $_POST['var'];
mysql_query("SELECT * FROM sometable WHERE id = $var");
这很容易通过以下方式解决:

$var = mysql_real_escape_string($_POST['var']);
另一个常见问题是:


sql注入易受攻击的登录脚本的另一个示例。不幸的是,这在新程序员中很常见

$username = $_POST["username"];
$password = $_POST["password"];
$query = "SELECT username, password 
          FROM users 
          WHERE (username = '{$username}') 
            AND (password = '{$password}')";

一个非常常见的初学者错误是在重定向后忘记终止脚本执行

<?php
if ($_SESSION['user_logged_in'] !== true) {
    header('Location: /login.php');
}

omg_important_private_functionality_here();

在普通浏览器中测试时可能会忽略这一点,因为浏览器通常遵循
位置
标题,而不呈现脚本的任何输出。

请查看Open Web Application Security Project。他们有很多不同类型攻击的解释和例子。

我以前见过这样的代码:

foreach ($_REQUEST as $var => $val) {
    $$var = $val;
}
这是一种模拟恶意选项的方法。这意味着您可以像这样访问变量:

$myPostedVar
$hasAdminAccess = get_user_access();

foreach ($_REQUEST as $var => $val) {
    $$var = $val;
}

if ($hasAdminAccess) { ... }
而不是更复杂的问题:

$_POST['myPostedVar']
在这样的情况下会出现安全风险:

$myPostedVar
$hasAdminAccess = get_user_access();

foreach ($_REQUEST as $var => $val) {
    $$var = $val;
}

if ($hasAdminAccess) { ... }

因为你所要做的就是将hasAdminAccess=1添加到url中,你就进入了。

Bobby Tables

是一个专门用于详细说明脚本可能通过以下方式受到攻击的页面。这不是PHP独有的,但是,SQL注入是许多网页漏洞的原因


这可能是您希望在演示文稿中包含的内容。

使用模板的错误方法

<?php

  include("header.php");
  include($_GET["source"]); //http://www.mysite.com/page.php?source=index.php
  include("footer.php");

?>

XSS漏洞很容易显示。只需创建一个页面,将GET变量“q”的值放在页面的某个位置,然后点击以下URL:

http://mysite.com/vulnerable_page.php?q%3D%3Cscript%20type%3D%22javascript%22%3Ealert(document.cookie)%3B%3C%2Fscript%3E

这将导致用户的cookie显示在警报框中。

允许上载而不检查扩展名。注意:

站点A允许上传图像并显示它们


Cracker guy上传一个文件并欺骗你相信它是一个图像文件(通过HTTP mimetypes)。此文件具有PHP扩展名并包含恶意代码。然后他尝试查看他的图像文件,因为每个PHP扩展文件都是由PHP执行的,所以代码是运行的。他可以做apache用户可以做的任何事情。

哦,天哪,你不会缺少例子的。只要谷歌,他们每个人都有足够的洞来填满阿尔伯特大厅

结果1,W3所学校。他们第一个包含用户输入的示例是什么

Welcome <?php echo $_POST["fname"]; ?>!<br />
echo "You ordered ". $quantity . " " . $item . ".<br />";
Bzzt。SQL注入,你就输了。下一个

结果2,官方PHP教程。输出变量的第一个例子是什么

echo $_SERVER['HTTP_USER_AGENT'];
Bzzt。HTML注入。这不是一个容易利用的方法,但仍然是在php.net的学习资料中重复的那种糟糕的做法

结果3,tizag.com。回显用户输入的第一个示例是什么

Welcome <?php echo $_POST["fname"]; ?>!<br />
echo "You ordered ". $quantity . " " . $item . ".<br />";
Bzzt

结果5,learnphp-tutorial.com

<title><?= $greeting ?> World!</title>
世界!
Bz

我可以继续

当这些可悲的垃圾是程序员们正在学习的东西时,有什么奇怪的吗?在野外PHP代码的总体质量如此糟糕

<?php
$newEmail = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$pdoStatement = $pdoDb->prepare('UPDATE user SET email=:email WHERE ID=:id');
$pdoStatement->execute(array(':email'=>$newEmail, ':id'=>$_SESSION['userId']));


HTTP响应分裂攻击

如果web应用程序将HTTP请求的输入存储在cookie中,比如

<?php setcookie("author",$_GET["authorName"]); ?>

如果输入未正确验证“\r\n”字符,则很容易受到HTTP响应拆分攻击

如果攻击者提交恶意字符串,如“AuthorName\r\nHTTP/1.1 200 OK\r\n…”,则HTTP响应将分为以下形式的两个响应:

HTTP/1.1200正常

设置cookie:author=AuthorName

HTTP/1.1200ok

显然,第二个响应完全由攻击者控制,并且可以用任何标题和正文内容来构造,而不是

是一个比你可能怀疑的更大的麻烦(除非你不得不处理它们)

这是非常糟糕的:

$to = 'contact@domain.com';
$subject = $_POST["subject"];
$message = $_POST["message"];
$headers = "From: ".$_POST["from"];
mail($to,$subject,$message,$headers);
(从上面第二个参考中复制的代码。)

基本(通常是安全敏感的)操作没有按预期工作,而是要求程序员使用第二个“真实”版本来获得未损坏的功能

其中最严重的一个问题是实际运算符受到影响的地方:“==”运算符不能像预期的那样工作,而是需要“==”运算符才能获得真正的相等比较

三大PHP论坛包之一的“保持登录”代码中存在漏洞。cookie将包含用户的ID和密码哈希。PHP脚本将读取并清理ID,使用它在数据库中查询用户的正确哈希,然后将其与cookie中的哈希进行比较,以查看是否应该自动登录


但是,比较是使用==,因此通过修改cookie,攻击者使用boolean:true的散列“值”,使得散列比较语句无效。因此,攻击者可以替换任何用户ID,在不使用密码的情况下登录。

允许用户上传文件,无论用户是否使用该API。例如,如果一个程序将一些文件上传到服务器,并且该程序永远不会上传坏文件,那就好了

但是黑客可以追踪发送的内容和地址。他可能会发现它允许上传文件

从那里,他可以轻松上传一个php文件。一旦完成,游戏就结束了。他现在可以访问您的所有数据,并且可以销毁或更改任何他想要的内容

另一个常见的错误是允许洪水泛滥。你应该对你的数据设置一些合理的限制。不允许用户输入无意义的数据。为什么用户名的长度是2MB?诸如此类的事情让人觉得很容易
<form method="post" action="http://site/updateMyAccount.php">
  <p>
    <input name="email" value="badguy@siteB"/>
    <input type="submit"/>
  </p>
</form>
if(strstr($username, '**')) {

    $admin = 1;
    $username = str_replace('**', '', $username);
    $_SESSION['admin'] = 1;

} else {

    $admin = 0;

}
<?php setcookie("author",$_GET["authorName"]); ?>
$to = 'contact@domain.com';
$subject = $_POST["subject"];
$message = $_POST["message"];
$headers = "From: ".$_POST["from"];
mail($to,$subject,$message,$headers);