1. 什么是sql注入
SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。
SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据“越俎代庖”做了代码才能干的事情。
这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
二、SQL注入的产生需要满足以下两个条件
1、参数用户可控:前端传给后端的参数用户可控。2、参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库中查询。
1、按照注入点分类:
(1)数字型注入:许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,注入点id为数字,一般被叫做数字型注入点,通过这种形式查询出后台数据库信息返回前台展示,可以构造类似以下的SQL语句进行爆破:select *** from 表名 where id=1 and 1=1。
2)字符型注入:网页链接有类似的结构
http://xxx.com/users.php?name=admin 这种形式,注入点name为字符串,被称为字符型注入,可以用:select *** from 表名 where name='admin' and 1=1。
3)搜索型注入:主要是指在数据搜索时没有过滤搜索参数,一般在链接地址中有 "keyword=“关键字”",注入点提交的是SQL语句,select * from 表名 where 字段 like '%关键字%' and '%1%'='%1%'。
2. 什么是SQL注入
SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。
随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水平和经验参差不齐,相当一部分的开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行必要的合法性判断,导致了攻击者可以提交一段数据库查询代码,根据程序返回的结果,获得一些他想得到的数据。
SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现。
SQL注入攻击过程分为五个步骤:
第一步:判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注入问题,如:http://www.../162414739931.shtml就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://www...../webhp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。
第二步:寻找SQL注入点。完成上一步的片断后,就要寻找可利用的注入漏洞,通过输入一些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。
第三步:猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜测过程可以通过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。
第四步:寻找WEB管理后台入口。通常WEB后台管理的界面不面向普通用户
开放,要寻找到后台的登陆路径,可以利用扫描工具快速搜索到可能的登陆地址,依次进行尝试,就可以试出管理台的入口地址。
第五步:入侵和破坏。成功登陆后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。
SQL注入攻击的特点:
变种极多,有经验的攻击者会手动调整攻击参数,致使攻击数据的变种是不可枚举的,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。
攻击过程简单,目前互联网上流行众多的SQL注入攻击工具,攻击者借助这些工具可很快对目标WEB系统实施攻击和破坏。
危害大,由于WEB编程语言自身的缺陷以及具有安全编程能力的开发人员少之又少,大多数WEB业务系统均具有被SQL注入攻击的可能。而攻击者一旦攻击成功,可以对控制整个WEB业务系统,对数据做任意的修改,破坏力达到及至。
SQL注入的危害和现状
SQL注入的主要危害包括:
未经授权状况下操作数据库中的数据
恶意篡改网页内容
私自添加系统帐号或者是数据库使用者帐号
网页挂木马
如何防止SQL参数:
1,检查上传的数据,并过滤
2. 禁止拼接SQL字符串
3.使用SQL参数化处理
4.加载防入侵等硬件设施
3. 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的出错提示是:将nvarchar转换int异常,XXXX不能转换成int
看到这里大家明白了吧,报错的原理就是利用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 from admin
And 1=2 union select 1,2,3,user,5,passwd,7,8,9,10 from admin
上面的order by 10主要就是查字段数目,admin就是表名,可以自己猜,user,passwd是列名
反正就是返回正确即对,返回异常即错
另外还有十分常用的ASCII码拆半法
先要知道指定列名,例如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里内容的第一位的ASCII字符是不是大于100
正确的话,那么表示USER第一个字符的ASCII码大于100,那么就猜>120,返回错误就是介于100-120之间,然后再一步一步的缩少,最终得到正确字符XXX,然后用ASCII转换器吧这个转换成普通字符就可以了
然后就是第二位 And (Select top 1 asc(mid(user,2,1)) from admin)>100 一直猜下去
加在url后面,列名表名还是先猜解,返回正确的代表帐号的ASCII码大于100,那么就再向前猜,直到报错,把猜出来的ASCII码拿去ASCII转换器转换就可以了,中文是负数,加上asb取绝对值
And (Select top 1 asb(asc(mid(user,n,1))) from admin)>15320
得到之后就记得在数字前加-号,不然ASCII转换器转换不来的,中文在ASCII码里是-23423这样的,所以猜起来挺麻烦
这个猜解速度比较慢,但是效果最好,最具有广泛性 后台身份验证绕过漏洞
验证绕过漏洞就是'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加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了 防御方法
对于怎么防御SQL注入呢,这个网上很多,我这里讲几个
如果自己编写防注代码,一般是先定义一个函数,再在里面写入要过滤的关键词,如select ; “”;from;等,这些关键词都是查询语句最常用的词语,一旦过滤了,那么用户自己构造提交的数据就不会完整地参与数据库的操作。
当然如果你的网站提交的数据全部都是数字的,可以使用小竹提供的方法
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注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。
4. SQL注入是什么意思
SQL注入属于注入式攻击,这种攻击是因为在项目中没有将代码与数据隔离,在读取数据的时候,错误地将数据作为代码的一部分执行而导致的。
如何处理SQL注入情况?三个方面:
1、过滤用户输入参数中的特殊字符,降低风险;
2、禁止通过字符串拼接sql语句,严格使用参数绑定来传入参数;
3、合理使用数据库框架提供的机制。
5. 什么是SQL注入
SQL注入是用于从企业窃取数据的技术之一,它是在应用程序代码中,通过将恶意SQL命令注入到数据库引擎执行的能力。当通过SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串时,会发生SQL注入,而不是按照设计者意图去执行SQL语句。
6. Android中是怎样防止SQL注入的
COPY过来有什么意思。。。。。。。 ----------------------------- 要防止SQL注入其实不难,你知道原理就可以了。 所有的SQL注入都是从用户的输入开始的。如果你对所有用户输入进行了判定和过滤,就可以防止SQL注入了。用户输入有好几种,我就说说常见的吧。 文本框、地址栏里***.asp?中?号后面的id=1之类的、单选框等等。一般SQL注入都用地址栏里的。。。。如果要说怎么注入我想我就和上面的这位“仁兄”一样的了。 你只要知道解决对吗? 对于所有从上一页传递过来的参数,包括request.form 、request.qurrystring等等进行过滤和修改。如最常的***.asp?id=123 ,我们的ID只是用来对应从select 里的ID,而这ID一般对应的是一个数据项的唯一值,而且是数字型的。这样,我们只需把ID的值进行判定,就可以了...
7. sql注入通俗说到底是什么意思
一般开发,肯定是在前台有两个输入框,一个用户名,一个密码,会在后台里,读取前台传入的这两个参数,拼成一段sql,例如:
select
count(1)
from
tab
where
usesr=userinput
and
pass
=
passinput,把这段sql连接数据后,看这个用户名/密码是否存在,如果存在的话,就可以登陆成功了,如果不存在,就报一个登陆失败的错误。对吧。
但是有这样的情况,这段sql是根据用户输入拼出来,如果用户故意输入可以让后台解析失败的字符串,这就是sql注入,例如,用户在输入密码的时候,输入
''''
'
or
1=1'',
这样,后台的程序在解析的时候,拼成的sql语句,可能是这样的:
select
count(1)
from
tab
where
user=userinput
and
pass=''
or
1=1;
看这条语句,可以知道,在解析之后,用户没有输入密码,加了一个恒等的条件
1=1,这样,这段sql执行的时候,返回的
count值肯定大于1的,如果程序的逻辑没加过多的判断,这样就能够使用用户名
userinput登陆,而不需要密码。
防止sql注入,首先要对密码输入中的单引号进行过滤,再在后面加其它的逻辑判断,或者不用这样的动态sql拼。
8. 安全测试中sql的注入是什么意思
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
一般来说要阻止sql注入,需要前后端配合表单的内容进行验证。我是前端的,只要对表单的输入绑定change事件,对其中的内容进行正则验证,阻止用户输入特殊字符(比如\转义字符)。
9. 苹果手机cklib提示未通过
1、版权问题。您的代码可指滑旅能包含了未经授权的第三方代码或图像资源,导致不符合开源协议的规定。
2、安全问题。您的代码可能存在一些安全问题,如代码注入、SQL注唯凳入、XSS攻击等。
3、性能问题。您的代码可能存在让竖一些性能问题,如死循环、内存泄漏、缓存问题等。如果您的代码遇到了未通过情况,需要仔细查看错误信息并进行相应的修正。
10. APP安全之SQL注入之什么是SQL注入
简单来说就是在sql语句未结束的地方让他提前结束;
比如一个sql
select * from table where name='a' and pass='b'
a表示一个变量,当a的值为 : admin' and 0=0;
那么sql就会变成
select * from table where name='admin' and 0=0;' and pass='b'
当执行到;的时候就默认结束了 直接查询出name=admin的数据