SQL概述及在网络安全中的利用[MSSQL防范]
本文“SQL概述及在网络安全中的利用[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1.网络利用和SQL注射
1.1概述
有些网络数据库没有过滤客户供应的数据中大概有害的字符,SQL注射就是操纵插入有害字符举行攻击的技术.固然非常简单防备,但因特网上仍旧有惊人数目的存储系统简单遭到这种攻击.这篇文章的目的是指导专业安全组织理解这种技术,并奉告他们精确的,用来防备SQL注射的办法,以及处理各种常见的,由于不法输入惹起的问题.
1.2后台
在读这篇文章之前,你应当对数据库若何工作,以及SQL若何被用来拜候数据库有一些底子的理解.我倡议您阅读eXtropia.com的文章"Introduction to Databases for WebDevelopers".
(网址:http://www.extropia.com/tutorials/sql/toc.HTML)
1.3字符编码
在大大都的网络浏览器中,标点标记和很多别的标记在用于一个网络恳求前需求把URL编码,以便被适本地编译(interpret).在本文中的例子和截图中我利用了固定的ASCII字符以保证最大的可读性.但是,在实际利用中,你需求在HTTP恳求顶用%25来替换百分号(%),用%2B来替换加号(+)等等.
1.网络利用和SQL注射
1.1概述
有些网络数据库没有过滤客户供应的数据中大概有害的字符,SQL注射就是操纵插入有害字符举行攻击的技术.固然非常简单防备,但因特网上仍旧有惊人数目的存储系统简单遭到这种攻击.这篇文章的目的是指导专业安全组织理解这种技术,并奉告他们精确的,用来防备SQL注射的办法,以及处理各种常见的,由于不法输入惹起的问题.
1.2后台
在读这篇文章之前,你应当对数据库若何工作,以及SQL若何被用来拜候数据库有一些底子的理解.我倡议您阅读eXtropia.com的文章"Introduction to Databases for WebDevelopers".
(网址:http://www.extropia.com/tutorials/sql/toc.html)
1.3字符编码
在大大都的网络浏览器中,标点标记和很多别的标记在用于一个网络恳求前需求把URL编码,以便被适本地编译(interpret).在本文中的例子和截图中我利用了固定的ASCII字符以保证最大的可读性.但是,在实际利用中,你需求在HTTP恳求顶用%25来替换百分号(%),用%2B来替换加号(+)等等...
1.网络利用和SQL注射
1.1概述
有些网络数据库没有过滤客户供应的数据中大概有害的字符,SQL注射就是操纵插入有害字符举行攻击的技术.固然非常简单防备,但因特网上仍旧有惊人数目的存储系统简单遭到这种攻击.这篇文章的目的是指导专业安全组织理解这种技术,并奉告他们精确的,用来防备SQL注射的办法,以及处理各种常见的,由于不法输入惹起的问题.
1.2后台
在读这篇文章之前,你应当对数据库若何工作,以及SQL若何被用来拜候数据库有一些底子的理解.我倡议您阅读eXtropia.com的文章"Introduction to Databases for WebDevelopers".
(网址:http://www.extropia.com/tutorials/sql/toc.html)
1.3字符编码
在大大都的网络浏览器中,标点标记和很多别的标记在用于一个网络恳求前需求把URL编码,以便被适本地编译(interpret).在本文中的例子和截图中我利用了固定的ASCII字符以保证最大的可读性.但是,在实际利用中,你需求在HTTP恳求顶用%25来替换百分号(%),用%2B来替换加号(+)等等...
3.2.5 LIKE语句查询
另一个大的灾难是陷入一个LIKE子句的陷阱.(Seeing the LIKE keyword or percent signs cited in an error message are indications of this situation.)大大都的web搜索程序利用LIKE子句来查询数据库,比方下面这个:
SQLString = "SELECT FirstName, LastName, Title FROM Employees WHERE LastName LIKE '%" & strLastNameSearch & "%'"
这里面的%是通配符,在这个例子里,WHERE子句会返回TRUE,只要LASTNAME里有字符串含有strLastNameSearch.为了禁止sql server返回预计中的记录,你构造的SQL语句里必须含有LASTNAME里没有的字符串.web搜索程序搜索的字符串来自于用户的输入.普通有一个'和一个%在输入的字符串之前,因此我们构造字符串时,需求在WHERE子句中匹配它们.假如你提交了NULL作为搜索字符串,那么LIKE的参数会变成"%%",这是一个全匹配,会返回全部的记录.
[1] [2] [3] 下一页
3.2.6 "死胡同"
大部份的时刻sql injection都要伴随着大量失利的实践,假如你发现你无论若何都不能插入相关的语句,并且无论你怎么做都不对,这个时刻你就要判断自己能否掉进了一个死胡同,很多时刻碰到这种情形你极大概是在一个多重嵌套的WHERE和SELECT子句的语句中,大概一些越发复杂的多重嵌套,连利用";--"都没有效,所以自己要当心和避免在这种地方逗留.
3.2.7 列的数目不匹配问题
如图所示,我们可以从几次错误中得到很多有效的信息,并且加以调整自己的恳求语句,这种信息多了,那就意味着我们离成功不远了.在猜列名时,如图所示,我们提交语句后会碰到以下错误"在UNION语句中的全部查询都必须在目标列表中具有相同数目的表达式",这就是说你需求找出大概说是探测出在合理的恳求中有多少个列.
这里我注释一下,UNION 语句是用来将两个差别的查询后果集相加得到一个后果集,UNION利用的唯一要求是两个查询的信息(你的查询语句)必须有相同的列数和相同的数据范例
我举个例子,web程序中有以下语句:
SQLstring= "SELECT FirstName,LastName,EmployeeID FROM Employees WHERE City ='"&strCity"'"
合理的SELECT语句和我们注入的UNION SELECT语句在WHERE子句中都要有相同的列.就上面的语句来说,假如我要加入UNION 语句的话,前后二者都要有3个列.并且他们列的数据范例也要彼此匹配才可以.假如FirstName这个值是字符串范例的,那么在你注入的语句中所对应的值也应当是字符串范例的.一些数据库,如Oracle,是对范例查抄非常严峻的.其他的数据库相对要好一些,答应你输入任何数据范例并且它会自动的把你输入错误的数据范例转换成精确的.比方SQL数据库中,你在varchar范例的地方输入数值范例的数据(如int)是不会报错的,因为在这里数值范例会被自动转为字符串范例.但是假如在smallint列处输入text范例则被认为是不法的,因为text范例不能被转换成int范例.把数值范例的数据转换成字符串型是被答应的,而反之则不行,所以默许都是利用数值范例的数据.
要想知道我们要注入的目标语句中有多少个列,你就要摸干脆的往UNION SELECT子句中增添呼应的值,直到它不报"在UNION语句中的全部查询都必须在目标列表中具有相同数目的表达式"这样的错为止.如图所示,假如你碰到的是数据范例不匹配的错误,那么你要去改变列的数据范例.假如返回消息只是一个转换数据范例失利的错误,那就阐明你已经猜对了列的数目,只是此中有个别的列的数据范例不对.那么接下来要做的就是判断是哪个列的数据范例的不精确招致的错误.然后将他改过来便可以了.
假如一切顺利,那么庆贺你,你会得到一个和上面格局近似的并且是合理的页面;)无论动态页面在那边呈现,你都可以构造自己的语句应对自如.
3.2.8.WHERE关键字
报错为"无效的列名'EmployeeID'",这个问题大概是由我们注入的语句末尾的WHERE关键字惹起的,举例阐明:
SQLString="SELECT FirstName,LastName,Title FROM Employees WHERE City='"&strcity&"'AND Country ='USA'"
假如我们注入的语句是UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 那么会得到以下的提交语句:
SELECT FirstName, LastName, Title FROM Employees WHERE City = 'NoSuchCity' UNION ALL SELECT OtherField FROM OtherTable WHERE 1=1 AND Country = 'USA'
这样就会报错:[Microsoft][ODBC SQL Server Driver][SQL Server]无效的列名 'Country'.
其实问题就是因为你注入的语句后,系统没有在从数据库的表中找到一个叫'Country'的列名.我们这里可以简单的用";--"注释标记将其注释掉(假如我们是SQL Server).大概干脆持续猜其他的列名,然后构造合理恳求就如我们上一节讲到的一样.
表名的列举
我们已经开始掌握若何来利用注入举行攻击,但是我们还要肯定要从哪个表得到信息,换句话说就是我们要的到关键的表名才能得到我们想要的有效信息.若何得到表名呢?在SQL Server中,你可以很简单得从数据库中得到全部的表名和列名.但是在Oracle和Access中,你就不一定能如此简单的得到了,这要看WEB程序对数据库的拜候权限了.关键在于能否能得到系统成立时自动生成的表中包含的表名和列名.如在SQL Server中,它们辨别为'sysobjects'和'syscolumns',(在本文最后我们将给出其他数据库系统自建表和呼应的列名)我们用以下的句子可以在这些表中列出数据库的全部列名和表名,(按照情形自行改正):
SELECT name FROM sysobjects WHERE xtype = 'U'
这句话会返回数据库顶用户定义的全部表,假如我们看到我们感爱好的大概是想要看的表,那么我们就把他翻开,这里以Orders为例构造语句:SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'Orders')得到后果如图.
3.2.10.单一记录
上面我们构造的语句返回了大量的信息,假如你只想显示一条数据记录也是可以的.你完好可以构造你的注入语句来得到你想要的唯一的信息.我们只要在WHERE子句中增添关键字来避免某些行的关键字被选中便可以了.我来举个列子:' UNION ALL SELECT name, FieldTwo, FieldThree FROM TableOne WHERE ''='
我们这样便可以得到FieldOne,FieldTwo和FieldThree的第一个值,假定我们的到的辨别是"Alpha", "Beta"和"Delta".注意,更有意思的来了,我们要得到第2行的值,怎么构造下面的语句呢?这样来:' UNION ALL SELECT FieldOne, FieldTwo, FieldThree FROM TableOne WHERE FieldOne NOT IN ('Alpha') AND FieldTwo NOT IN ('Beta') AND FieldThree NOT IN ('Delta') AND ''='
这里有一个子句"NOT IN VALUES",它的作用是不再返回我们已经得到的信息,即不是alpha,不是beta,不是delta.既然都不是,数据库就会傻乎乎的奉告我们第二行的值.我们再假定我们得到第二行的值为"AlphaAlpha", "BetaBeta"和"DeltaDelta".
我们来得到第三行的值,构造语句以下:' UNION ALL SELECT FieldOne, FieldTwo, FieldThree FROM TableOne WHERE FieldOne NOT IN ('Alpha', 'AlphaAlpha') AND FieldTwo NOT IN ('Beta', 'BetaBeta') AND FieldThree NOT IN ('Delta', 'DeltaDelta') AND ''='
这样就避免了得到第一次和第二次我们已经得到的值,我们就这样试下去会得到数据库中全部的值.这看起来仿佛确切对比麻烦,但在这里倒是最有效的,不是么?
上一页 [1] [2] [3] 下一页
3.3 插入
3.3.1 插入底子
关键字INSERT 被用于向数据库增添信息,普通利用INSERT主要在包含用户注册,论坛,增添商品到购物车,等等.查抄INSERT利用的弱点和查抄WHERE一样.你大概不想利用INSERT,若何避免被操纵弱点是一个重要的考虑问题.INSERT注入尝试常常会让数据库以行情势返回后果招致泛滥的单独的引用和SQL关健字的意义大概改变.取决于管理员的注意和信息对数据库的操作,这个是要惹起注意的,方才说过的那些,INSERT注入和SELECT注入的差别.我们在一个答应用户举行各种注册,这就供应了一个你输入你的名字,地址,电话等等的表单.在你提交了这个表单之后,为了得到进一步的INSERT的弱点,你必须可以看到你提交的信息.它在那边不要紧.大概当你登陆按照在数据库里存储的名字的赐与你权利的时刻,大概在发送你的spam邮件的..,谁知道,探求一个途径至少可以看到你输入的信息.
3.3.2
一个插入的恳求看起来象这样:INSERT INTO TableName VALUES ('Vaule One','Value Two','Value Three') 你想大概操纵一个在参数VALUES中的子句来看到其他的数据.我们可以利用这种办法,sql的代码象这样:SQLString ="INSERT INTO TableName VALUES ('" & strValueOne & "', '" & strValueTwo & "', '" & strValueThree & "')"我们象这样填写表单:Name: ' + (SELECT TOP 1 FieldName FROM TableName) + ' Email: blah@blah.com Phone: 333-333-3333 使SQL的声明象这样 : INSERT INTO TableName VALUES ('' + (SELECT TOP 1 FieldName FROM TableName) + '', 'blah@blah.com', '333-333-3333')当你到了个人设置页面查看你的利用信息,你将看到的第一个字段这个普通是用户名r假如你使不在你的subselect中利用TOP 1,你将得到一个错误信息说你的subselect返回了太多记录,你能查看表中全部的行,利用NOT IN()一样的办法你可以得到单独的记录.
3.4. SQL服务器存储历程操纵
3.4.1 存储历程底子
4. 一个完好安装的MSSQL服务器有上千的存储历程.假如你能在一个后台利用mssql的网页利用程序得到SQL注入,你能利用这些存储历程完成一些不凡的成果.我将谈论很少的特别的历程.取决于网页程序利用数据库的用户,只有一些可以工作,并非全部的用户都可以操纵.第一件事你应当知道存储历程注入不能通过存储历程的返回值来肯定你的注入能否成功.取决于你想完成什么,你大概不需求得到数据.你可以找到返回给你的数据的其他意义.存储历程注入比普通的查询注入要简单些,存储历程的注入的弱点操纵看起来象这样.
simplequoted.ASP?city=seattle';EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'
注意,
Notice how a valid argument is supplied at the beginning and followed by a quote and the final argument to the stored procedure has no closing quote. This will satisfy the syntax requirements inherent in most quoted vulnerabilities. You may also have to deal with parentheses, additional WHERE statements, etc.但是在这今后将不需求耽忧列和数据的范例的匹配.这个大概弱点的输出象程序无法返回错误信息一样.我最喜好存储历程.
5. 3.4.2. xp_cmdshell
xp_cmdshell {'command_string'} [, no_output]
master.dbo.xp_cmdshell是存储历程的圣杯,它带来了一个问题,可以调用号令行的数据库用户的和他的运行权限,这个并不可用除非这个网页程序利用的数据库用户是SA. 运行级别为6
sp_makewebtask [@outputfile =] 'outputfile', [@query =] 'query'
6. 别的一个好的调用对象是master.dbo.sp_makewebtask,象你所看的,它是一个本地的输出文件和一个SQL statement.sp_makewebtask可以查询并成立一个包含输出的网页.注意你可以象利用一个UNC途径名一样利用一个本地输出.这个意思就是这个输出文件可以放有在任何一台连在Internet并且有个可写的SMB同享(SMB恳求不需求任何的身份考证).假若有一个防火墙限制了服务器对Internet,试着把输出文件放在网页目录下(你要知道大概猜想网页的目录).一样值得注意的是引用查询大概是 包含履行其他的存储历程.Making "EXEC xp_cmdshell 'dir c:'" 这个查询将在网页中给出"dir c:"的输出.当你举行嵌套引用的时刻,记得单独的引用和双引号.
4.1数据处理
全部的客户端数据可以被恶意的提交的字符或字符串排除.这些大概在全部的利用程序做到,不但仅是利用SQL查询的.Stripping quotes or putting backslashes in front of them is nowhere near enough.最好的过滤数据的方法是不用法则的表达方法,使它只包含你所想要的字符范例.举个例子,下边的regxp将只能返回字母和数字,尽大概的过滤象s/[^0-9a-zA-Z]//g 这样的特别字符.大概的时刻尽大概利用数字,在这今后只利用数字和字母.假如你需求包含各种各样的标志或标点.确信完好的把它们转换成html标志,像""e;" or ">".比方,一个用户提交了一个email地址只答应利用数字和字母还有"@", "_", "." 和"-".仅仅只有这些字符可以转换成html标志.
4.2. 编写安全的web程序
这里一样有很少的特别的sql注入法则.First, prepend and append a quote to all user input.
固然数据使数字.其次,限制网页利用程序的数据库用户在数据库里的权限.不要给这个用户拜候全部的存储历程的权利假如这个用户只需求拜候一些预定义的.
这部份包含了全部在sql注入中有效的系统表,你可以在谷歌上搜索到每一个的表的列的定义
5.1. MS SQL Server
Sysobjects
syscolumns
5.2. MS Access Server
MSysACEs
MSysObjects
MSysQueries
MSysRelationships
5.3. Oracle
SYS.USER_OBJECTS
SYS.TAB SYS.USER_TABLES
SYS.USER_VIEWS SYS.ALL_TABLE
S SYS.USER_TAB_COLUMNS
SYS.USER_CONSTRAINTS SYS.USER_TRIGGERS
SYS.USER_CATALOG
上一页 [1] [2] [3]
以上是“SQL概述及在网络安全中的利用[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |