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这种数字的,作为最后一个参数。