如何在PHP中修复shell注入攻击?

时间:2014-10-24 04:04:13

标签: php shell code-injection exploit

我们有人利用我们的网站并为自己购买资金而无需实际存入任何款项。当运行Vega扫描程序来查找漏洞时,我们的几乎所有页面都会打开shell注入漏洞。

该程序表示以下2个请求(基本上在任何页面上,因为此PHP代码位于header.php中)使我们容易受到攻击。

GET /web-hosting.php?cid=1`true`
GET /web-hosting.php?cid=1"`true`"
GET /style.css?1=null`true`
GET /style.css?1=null"`true`"

在查看header.php代码时,我注意到链接的CSS文件后面有“?1”。我没有对这个网站进行编码所以我不确定它们是否总是存在但是没有充分的理由将这个参数放在那里?它似乎只是让我们开始利用。

<link rel="stylesheet" type="text/css" href="reset.css?1" />
<link rel="stylesheet" type="text/css" href="style.css?1" />
<link rel="stylesheet" type="text/css" href="style-custom.css?1" />

修改

以下是将cid.php作为参数的标头中使用的代码。

<?php
// Enter WHMCS Folder location  eg "whmcs"
$location = "customers";


require("".$location."/dbconnect.php");
if (isset($_REQUEST['cid'])) $_SESSION['currency'] = $_REQUEST['cid'];

?>

我对shell注射并不过分熟悉,但是我并没有真正理解这有什么意义。我尝试在浏览器中输入URL,但它只是加载了页面。这些实际上做了什么以及如何修复它们?

1 个答案:

答案 0 :(得分:0)

您可以尝试过滤输入(无论如何都应该这样做)。下面的MySQL Real Escape字符串很快就会被弃用,但现在可能会有效。 http://php.net/manual/en/function.mysql-real-escape-string.php

<?php
//...
if (isset($_REQUEST['cid']))
  $_SESSION['currency'] = mysql_real_escape_string($_REQUEST['cid']);

?>

您可能希望通过确保cid变量不太长,没有特殊字符,匹配模式等来进一步过滤cid变量。