信息安全试题 什么是sql注入漏洞

信息安全试题 什么是sql注入漏洞,第1张

以下是OMG我为大家收集整理的文章,希望对大家有所帮助。

SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。其实就是就是提交精心构造的数据库语句,使其反馈一些有用的数据。说白了就是去欺骗数据库,假如只有web服务器的话,是没法进行SQL注入的。

网上常用的注入手法有两种,一种是猜测,让数据库暴出用户名、密码等信息;另一种直接绕过认证,取得权限。相对应,要想修复此类漏洞,就必须禁止特殊数据的提交或将特殊提交的数据修改。

下面是不同脚本语言下的防注入过滤代码,其实思想是一致的。

1、 PHP防注入过滤代码

php 代码复制内容到剪贴板

<!-- php

/

说明: 判断传递的变量中是否含有非法字符 如$_POST、$_GET

功能: 防注入

使用方法: 将下列代码保存为ak,php,调用方式 在数据提交页加上include("akphp");

/

function dowith_sql($str)

//实现将特征码两边加

{

$refuse_str="exec|and|or|select|update|from|where|order|by||delete||insert|into|values|create|table|

database|set|char|asc|cast|declare| </script|script|iframe|3bomb|cjs|;";>

//定义防注入的字符

$arr=explode("|",$refuse_str);

//将$refuse_str中的值单独取出

for($i=0;$i<count($arr);$i++) p=""> </count($arr);$i++)>

{

$replace="["$arr[$i]"]";

$str=str_replace($arr[$i],$replace,$str);

//在变量$str中搜索字符串$arr[$i],并将其替换为字符串[$replace]

}

return $str;

}

foreach ($_GET as $key=>$value)

//遍历获GET方法获得的参数$_GET的值传给$key,并赋值给$value

{

$_GET[$key]=dowith_sql($value);

//将$value中的特征码处理传个$_GET[$key]

}

foreach ($_POST as $key=>$value)

{

$_POST[$key]=dowith_sql($value);

}

>

上面的防注入的方法只是防了GET与POST方法提交的数据,但是,WEB服务器读取数据的顺序是,先取GET中的数据,没有再去POST中的数据,没有还会再去COOKIES中的数据,上面的代码还没有防cookies注入。防cookies注入就比较简单了,cookies的id值一般只为阿拉伯数字,但是cookies注入必须得在id中构造代码,只要在获得参数UID后,对其进行过滤就可以了,代码如下:

php 代码复制内容到剪贴板

<!-- php

if($_COOKIE[id]!=null) {

//判断cookies不为空

foreach ($_COOKIE[id] as $key=>$id){

//读取cookies中的值

if (is_numeric($id)<0){

echo " ";

}

}

>

将上述代码保存为hkphp。

所以在平时应用时,在网页上加上include("akphp");与include("hkphp");

2、 ASP防注入过滤代码

<%

--------说明------------------

使用方法: 在需要防注的页面头部用 SSI ʱ B>

包含就可以了

友情提示:把代码复制到CONNasp(数据库连接文件) 那么,只要包含了CONN的所有文件都防注了

-------- ------------------------

Dim xf_Post,xf_Get,xf_In,xf_Inf,xf_Xh,xf_db,xf_dbstr

自定义需要过滤的字串,用 "|" 分隔

xf_In = "|;|and|exec|insert|select|delete|update|count||%|chr|mid|master|truncate|char|declare"

xf_Inf = split(xf_In,"|")

If RequestForm<>"" Then

For Each xf_Post In RequestForm

For xf_Xh=0 To Ubound(xf_Inf)

If Instr(LCase(RequestForm(xf_Post)),xf_Inf(xf_Xh))<>0 Then

ResponseWrite ""

ResponseWrite "非法 *** 作!系统做了如下记录↓

"

ResponseWrite " *** 作IP:"&RequestServerVariables("REMOTE_ADDR")&"

"

ResponseWrite " *** 作时间:"&Now&"

"

ResponseWrite " *** 作页面:"&RequestServerVariables("URL")&"

"

ResponseWrite "提交方式:POST

"

ResponseWrite "提交参数:"&xf_Post&"

"

ResponseWrite "提交数据:"&RequestForm(xf_Post)

ResponseEnd

End If

Next

Next

End If

If RequestQueryString<>"" Then

For Each xf_Get In RequestQueryString

For xf_Xh=0 To Ubound(xf_Inf)

If Instr(LCase(RequestQueryString(xf_Get)),xf_Inf(xf_Xh))<>0 Then

ResponseWrite ""

ResponseWrite "非法 *** 作!系统已经给你做了如下记录↓

"

ResponseWrite " *** 作IP:"&RequestServerVariables("REMOTE_ADDR")&"

"

ResponseWrite " *** 作时间:"&Now&"

"

ResponseWrite " *** 作页面:"&RequestServerVariables("URL")&"

"

ResponseWrite "提交方式:GET

"

ResponseWrite "提交参数:"&xf_Get&"

"

ResponseWrite "提交数据:"&RequestQueryString(xf_Get)

ResponseEnd

End If

Next

Next

End If

%>

同样,再将cookies防一下,代码加在数据提交页。

if(RequestCookies["uid"]!=null)

{

uid=RequestCookies["uid"]value;

isnumeric cooidesID = new isnumeric();

//这是一个类

if (cooidesIDreIsnumeric(ruid))

//如果是数字就运行下面的

{

string str="select from userTable where id="+uid;

}

}

3、 JSP防注入过滤代码

先猜表名

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

Responsewrite 参数 & ParaName & 必须为数字型!

Responseend

End if

Else

ParaValue=replace(ParaValue,','')

End if

SafeRequest=ParaValue

End function

然后就用SafeRequest()来过滤参数 ,检查参数是否为数字,不是数字的就不能通过。 SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

以上就是关于信息安全试题 什么是sql注入漏洞全部的内容,包括:信息安全试题 什么是sql注入漏洞、轻松理解什么是 SQL 注入、如何防治SQL注入等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9799340.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存