气愤,居然有黑客在BNU校园百科上挂马,解决D99_Tmp挂马方法

by shinichi_wtn 2010-05-25 16:15

最近用浏览器打开BNU校园百科网站(http://www.bnubaike.cn)的词条发现恶意脚本,分析源码后知道了词条内容被批量篡改了,嵌入了许多恶意js脚本,基本上每个词条都被加入了类似的脚本,无语。

打开数据库,发现存储每个词条内容的字段都被篡改了,在随机位置加入了脚本"<script type='javascript'>......</script>“,同时数据库多了两个表,其中一个是D99_Tmp,另一个是syscommand,由于这两个表本来是不存在的,可想而知是黑客利用网站漏洞注入进来的。

曾经没有考虑过被攻击或者被注入的情况,所以网站的安全性还不够高,但是一旦被攻击后才知道安全的重要性。由于每个词条记录都被嵌入了脚本,恢复很困难,所以我只能把数据库还原到前一个时间段,然后再增量恢复到被注入前最近的时间点。

由于BNU校园百科网站是我自己建设的一个较为庞大的网站,文件和类都比较多,怎么才能很快找到漏洞并且修复呢?答案就是分析网站访问日志,查找日志里的异常记录,即含有注入脚本的记录。通过分析访问日志,获得了黑客攻击的IP和时间。比如其中一条记录里含有如下语句:

somepage.aspx?id=1;CREATE%20TABLE%20D99_Tmp......

由于自己在SQL语句中忽略了注入的危害性,使得别人可以在url后面直接添加SQL语句从而实现攻击(以后不能犯这样的低级错误了)。

在传递值的时候,最好用整型数据,这样多余的字符串会被直接砍掉或抛出异常;当然,最好的方法还是优化SQL语句,比如使用存储过程,使用参数化的SQL语句,这样比直接一条SQL语句更为安全。网上找到的技巧也差不多,如下:

简单的预防的办法,就是写程序都用这样方式吧:

在写代码 id=Request.QueryString["id"]

改为 id=int.Parse(Request.QueryString["id"])

这样 id变数字后面的 SQL 字串就会被清除

另外将 sql="select * from XXX where id=" & id

改为 sql="select * from XXX where id='" & id & "'"

那么黑客加入的 SQL 字串,不会被处理执行或执行失败

另外如果有多个参数的话,最好把ID这种数字的,作为最后一个参数。

Comments (3) -

38580698 People's Republic of China
5/29/2010 10:57:08 PM #

额。。已经被谷歌浏览器报错了。。。。看来你们的发明真的是太火了啊哈哈哈~

Reply

shinichi_wtn People's Republic of China
5/29/2010 11:12:37 PM #

哎,最近很多高校的网站都被挂马了,因为马上要高考了......

Reply

ety001 People's Republic of China
8/8/2010 4:15:29 PM #

D99_Tmp这应该是用的啊D注入工具进行的……错误真的挺低级的,任何进库的数据都要进行必要的检查的。

Reply

(仅用于Gavatar)

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

shinichi_wtnI'm Shinichi_wtn

Software Engineering Manager at Microsoft

[More...]


Month List