如何修复PHP中的shell注入漏洞


How to fix shell injection exploits in PHP?

我们有人利用我们的网站,给自己资金进行购买,而实际上没有存款。当运行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'];
?>

我对贝壳注射并不太熟悉,但我真的不明白这有什么意义。我试着在浏览器中输入URL,但它只是加载了页面。这些实际上是做什么的?如何修复它们?

您可以尝试过滤输入(无论如何都应该这样做)。下面的MySQL Real Escape String很快就会被弃用,但现在可能有效。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变量。