假如strUsername和strPassword变量可以包含任何你要的字符,你可以修改当前的SQL查询结构,那样即使你不知道有效的用户名和密码,你仍何以得到一个有效的name,它是如何实现的呢?让我们假设用户像下面那样填充了一个登陆表单:
|
这将给SQLQuery以下值:
SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''=''
请求并不把用户提交的数据与现存的Users表单做比较,而是直接比较''和'',显然它总是返回true,(注重nothing和null是有区别的)由于WHERE语句中的所有验证条件都符合了,用户名将使用表单中搜索到的第一行中的那个,接着用户名将被传递给变量strAuthCheck,这样我们的效力就得以保证。使用single result cycling技术,也有可能使用另外一行的数据,这将在以后讨论。
3.2 SELECT
对于另一些情况而言,你必须根据查询那些有缺陷的web程序返回的结果,来判定和调整你提交的SQL查询字符串,以便搞定服务器.
3.2.1 直接利用单引号
你将面临的第一个错误是语句结构错误.一个结构错误表明SQL查询的语句结构存在缺陷.首先你应该明白,在没有编码引号的情况下, 插入脚本攻击是否可以成功.
直接SQL注射的时候,无论你提交什么语句都会被不加任何改变地应用于SQL查询中.试着提交参数的时候,先输入合法的值,然后在其后添加一个空格和一个OR,假如服务器产生了错误,那么直接SQL注射是可能的.提交的值可以是任何WHERE子句中用到的值,例如:
|
或者是紧跟于一个SQL要害字,例如表名或者表里的栏目名,比如
|
所有其他的例子都是引号注射,在一个存在引号插入漏洞的程序里面, 任何一个你提交的参数,系统都会在前面和后面添加一个引号,就像这样:
|
为了能(break out)打破这引号,并伪造一个正确的查询,在你的SQL注射字符串中的SQL要害字之前必须包含一个单引号,而且在WHERE子句的后面也需要加上一个单引号.现在我们来谈谈"欺骗"的问题.是的,SQL SERVER会忽视在";--"后面的任何东西,但是只有MS的SQL SERVER会这样做.我们最好学习如何处理这个问题,这样我们在面对Oracle,DB/2,MySQL 和他种类的数据库服务器的时候就知道怎么做了.
评论加载中…
![]() |