没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
sql 注入
sql 注入
所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终
达到欺骗服务器执行恶意的 SQL 命令,比如先前的很多影视网站泄露 VIP 会员密码大多就是通过 WEB 表
单递交查询字符暴出的,这类表单特别容易受到 SQL 注入式攻击.
注入大致方法:
先猜表名
And (Select count(*) from 表名)<>0
猜列名
And (Select count(列名) from 表名)<>0
或者也可以这样
and exists (select * from 表名)
and exists (select 列名 from 表名)
返回正确的,那么写的表名或列名就是正确
这里要注意的是,exists 这个不能应用于猜内容上,例如 and exists (select len(user) from admin)>3##这
样是不信的
现在很多人都是喜欢查询里面的内容,一旦 iis 没有关闭错误提示的,那么就可以利用报错方法轻松获得
库里面的内容
获得数据库连接用户名:;and user>0
这个是小竹提出来的,我这里引用《SQL 注入天书》里面的一段话来讲解:
----------------------------------------------
----------------------------------------------
--------------
"重点在 and user>0,我们知道,user 是 SQLServer 的一个内置变量,它的值是当前连接的用户名,类型
为 nvarchar。拿一个 nvarchar 的值跟 int 的数 0 比较,系统会先试图将 nvarchar 的值转成 int 型,当然,
转的过程中肯定会出错,SQLServer
的出错提示是:将 nvarch"
----------------------------------------------
----------------------------------------------
---------------° °° °° °° °° °° °° °° °° °° °° °° °° °° °° °° °°°
看到这里大家明白了吧,报错的原理就是利用 SQLserver 内置的系统表进行转换查询,转换过程会出
错,然后就会显示出在网页上,另外还有类似的 and 1=(selet top 1 user from admin),这种语句也是可以
爆出来的。;and db_name()>0 则
是暴数据库名。
一旦关闭了 IIS 报错,那么还可以用 union(联合查询)来查内容,主要语句就是
Order by 10# #
And 1=2 union select 1,2,3,4,5,6,7,8,9,10 by admin
And 1=2 union select 1,2,3,user,5,passwd,7,8,9,10 by admin
上面的 order by 10 主要就是查字段数目,admin 就是表名,可以自己猜,user,passwd 是列名
反正就是返回正确即对,返回异常即错
另外还有十分常用的 ascll 码拆半法
先要知道指定列名,例如 user 里的内容的长度
and (select len(user) from admin)=2 就是查询长度为不为 2 位,返回错误的增加或减少数字,一般这个数
字不会太大,太大的就要放弃了,猜也多余
后面的逻辑符号可以根据不同要求更改的,
>大于 <小于 =就是等于咯,更新语句的话,=也可以表示传递符号 <>就是不等
知道了长度后就可以开始猜解了
And (Select top 1 asc(mid(user,n,1)) from admin)>100
n 就是猜解的表名的第几位,最后的长度数字就是刚才猜解出来的列名长度了,And (Select top 1
asc(mid(user,1,1)) from admin)>100 就是猜解 user 里内容的第一位的 ASCLL 字符是不是大于 100
正确的话,那么表示 USER 第一个字符的 ASCLL 码大于 100,那么就猜>120,返回错误就是介于 100-
120 之间,然后再一步一步的缩少,最终得到正确字符 XXX,然后用 ASCLL 转换器吧这个转换成普通字
符就可以了
然后就是第二位 And (Select top 1 asc(mid(user,2,1)) from admin)>100 一直猜下去
加在 url 后面,列名表名还是先猜解,返回正确的代表帐号的 ascll 码大于 100,那么就再向前猜,指导报
错,把猜出来的 ascll 码拿去 ascll 转换器转换就可以了,中文是负数,加上 asb 取绝对值
And (Select top 1 asb(asc(mid(user,n,1))) from admin)>15320
得到之后就记得在数字前加-号,不然 ASCLL 转换器转换不来的,中文在 ASCLL 码里是-23423 这样的,
所以猜起来挺麻烦
这个猜解速度比较慢,但是效果最好,最具有广泛性
2.2.后台身份验证绕过漏洞
验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是 AND 和 OR 的运算规则,从而造成后台脚本逻辑性
错误
例如管理员的账号密码都是 admin,那么再比如后台的数据库查询语句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那么我使用'or 'a'='a 来做用户名密码的话,那么查询就变成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'
这样的话,根据运算规则,这里一共有 4 个查询语句,那么查询结果就是° ° 假 or 真 and 假 or 真,先算
and 再算 or,最终结果为真,这样就可以进到后台了
这种漏洞存在必须要有 2 个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也
就是类似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。
第二就是要看密码加不加密,一旦被 MD5 加密或者其他加密方式加密的,那就要看第一种条件有没有可
以,没有达到第一种条件的话,那就没有戏了
3 防御方法
对于怎么防御 SQL 注入呢,这个网上很多,我这里讲几个
如果自己编写防注代码,一般是先定义一个函数,再在里面写入要过滤的关键词,如 select ; “”;form;等,
这些关键词都是查询语句最常用的词语,一旦过滤了,那么用户自己构造提交的数据就不会完整地参与数
据库的操作。
当然如果你的网站提交的数据全部都是数字的,可以使用小竹提供的方法
Function SafeRequest(ParaName,ParaType)
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1 表示以上参数是数字,0 表示以上参数为字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function
然后就用 SafeRequest()来过滤参数 ,检查参数是否为数字,不是数字的就不能通过
现在向各位朋友请教一下防止 SQL 注入的问题。 我的几个想法,希望大家给我补充指正一下:
1、关于用户注册时的表单输入,用正则控制约束一下,不得输入一些特殊字符及空格等(好像不给输入
空格,很能防止 SQL 注入,对吧)?
2、关于大段文本(比如文章)的输入问题,是不是正则不大好控制?我想用存储过程和 HTMLEncode 两
个步骤不知有没有效?
3、地址栏的 SQL 攻击,这个我一点都不懂了,不知该怎么防范?
1、对,限制用户输入肯定有效
2、应该也可以做到,但正则不是一种高效的方法,用 HtmlEncode 的方法可以有效防止空格等被 DBMS
解释,但注意别把编码、解码搞反了;存储过程是 DBMS 执行的一段程序,把数据操纵交给存储过程执
行,而不是提交 SQL 语句,可以有效防止 SQL 注入。
3、地址栏的 Sql 攻击,下面我引用了一段资料解释,他关于机制说的较清楚,关于解决,只是从客户端
考虑的,实际上用存储过程等都可以防范。
资料:
首先,入侵者会对一个网站确定可不可以进行注入,假设一篇文章的地址为:http://www.scccn.com/new
s.asp?id=1
一般会以提交两个地址来测试,如:
http://www.scccn.com/news.asp?id=1 and 1=1
http://www.scccn.com/news.asp?id=1 and 1=2
第一个地址后面加了 and 1=1,构成的 SQL 语句也就变为了:Select * from 表单名 where id=1 and 1=1
这句话要成立就必须 and 前后语句都成立。那么前面的文章地址是可以访问的,后面的 1=1 也是客观成
立的,那么第一个地址就可以正常显示;相反 1=2 是显然不成立的,关键就看这步了,如果提交 and 1=2
页面还是正常显示说明他并没有将 and 1=2 写入 SQL 语句,此站也就不存在注入漏洞;但如果提交 and
1=2 之后返回了错误页面则说明此站点将后面的语句带入了 SQL 语句并执行了,也就说明他可以进行
SQL 注入。(注:如果地址后面跟的是 news.asp?id='1'就得变为 news.asp?id=1' and '1'='1 来补全引号
了)
那么,知道可以注入后入侵者可以做什么呢?
这里就简单的说一下,比如提交这样的地址:
http://www.scccn.com/news.asp?id=1 and exists (select * from 表名 where 列名=数据)
根据返回的正确或错误页面来判断猜的表名和列名是否正确,具体实现时是先猜表名再猜列名。当猜出表
名和列名之后还可以用 ASC 和 MID 函数来猜出各列的数据。MID 函数的格式为:mid(变量名,第几个字符
开始读取,读取几个字符),比如:mid(pwd,1,2)就可以从变量 pwd 中的第一位开始读取两位的字符。ASC
函数的格式为:ASC("字符串"),如: asc("a")就可以读出字母 a 的 ASCII 码了。那么实际应用的时候
就 可 以 写 为 : asc(mid(pwd,1,1)) 这 样 读 取 的 就 是 pwd 列 的 第 一 个 字 符 的 ASCII 码 , 提 交 :
asc(mid(pwd,1,1))>97 以返回的页面是否为正确页面来判断 pwd 列的第一个字符的 ASCII 码是否大于
97(a 的 ASCII 码),如果正确就再试是否小于 122(z 的 ASCII 码)……这样慢慢缩小字符的 ASCII 码
的范围,猜到真实的 ASCII 码也只是时间的问题。一位一位的猜就可以得到数据库中的用户名和密码了。
还有一种 ASP 验证缺陷——就是用户名和密码都输'or '1'='1,构造 SQL 语句 Select * form 表单名 where
username='' or '1'='1' and pwd='' or '1'='1'就可以达到绕过密码验证的目的。
说了那么多,其实防范的方法很简单,我们把特殊字符(如 and、or、'、")都禁止提交就可以防止注入
了。ASP 传输数据分为 get 和 post 两种, get 是通过将数据添加到 URL 后提交的方式,post 则是利用邮
寄信息数据字段将数据传送到服务器。
那么,我们先来看看如何将 方式提交数据中的特殊字符过滤。首先要知道, 是以字符串的形式将
请 求 传 给 的 , 在 将 数 据 传 递 给 之 后 , 解 析 器 会 解 析 出
的信息,然后跟据来分出各个数组内的数据。现在我们要让 方式不能提交以下
字符:
、、、、、、、、、、、、、、、
那么,防止 方式注入的代码就如下:
! "! #$%$
&!!!!!!!!!!!!!!!
"&' !!(
)*%
+,- .
+- #&"%/0' "(
)''- .(! "' #$%$((*"%
1请不要尝试进行 - 注入!
)
2
,)
*
其中,变量 中的字符串就是指定过滤的字符,以!隔开。
3333接着过滤 提交方式的注入,我们可以看到,) 也是以数组形式存在的,只要对它再进行
一次循环判断就可以了。防止以 方式注入的 $4 代码如下:
)+*%
+, 4+
+- #&"%/0' "(
)'+' 4(! "' #$%$((*"%
1请不要尝试进行 - 注入!
剩余16页未读,继续阅读
资源评论
saishangpeiqian
- 粉丝: 67
- 资源: 127
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功