网络攻击与防护论文.docx
《网络攻击与防护论文.docx》由会员分享,可在线阅读,更多相关《网络攻击与防护论文.docx(14页珍藏版)》请在冰豆网上搜索。
网络攻击与防护论文
江西理工大学应用科学学院
《网络攻击与防御》课程作业论文
题目:
______SQL注入分析____
系别:
_______信息系_________
班级:
______网络091________
姓名:
________苏建滔________
成绩:
_____________________
二〇一二年四月
SQL注入分析课程设计
一、选题的目的和意义
网络技术在随着现代化信息技术的不断发展与进步的基础上,在现实生活中得到广泛的应用,其中Web成为了主流的网络和应用技术,但依然不可避免的是网络安全问题的出现。
网络安全问题目前已成为信息时代一个不容忽视的问题。
在探究和实际操作的基础上,总结网络攻击方法的原理以及有针对性的防护技术,这对于加强网络安全性能,实现web服务器的安全有着极其重要的意义。
二、SQL注入分析
1、SQL注入的原理
SQL注入是一种网络攻击方式,在此攻击方式中,恶意代码被强行插入字符串中,并将该字符串传递至程序执行的SQL语句中以构成攻击方欲执行的任何SQL语句,同时分析服务器返回的信息,获得有关网站或服务器的重要信息和敏感信息,以达到进一步获得非法权限和隐秘资料的目的。
利用WEB应用对用户输入验证程序设计上的疏忽大意,或验证程序的不严格,从而使用户输入的数据中包含对数据库系统具有一定特殊意义的命令或者符号,让WEB应用用户有可能直接对后台数据库系统下达不正当指令,实施入侵行为。
SQL注入的产生主要是由动态字符串的构建和不安全的数据库配置所产生。
动态字符串的构建主要是由错误的处理转义字符、处理类型、处理联合查询、处理错误以及错误的处理多次提交所构成;不安全的数据库配置的产生主要是由默认预先安装的用户,以root,SYSTEM或者Administrator系统用户来运行和默认允许诸多系统函数(如xp_cmdshell,OPENROWSET等)所构成。
2、SQL注入攻击的多种方式
构造参数攻击形式:
若一恶意用户提供的字段并非强制类型,或者无实施类型强制,则会发生此形式的攻击。
当在一个SQL语句中使用一个数字字段时,程序员未检查用户输入字段的合法性(输入字段是否为数型)时就会发生这种攻击。
例如:
Statement:
="SELECT*FROMdataWHEREid="+a_variable+";"
从以上语句可以看出,作者希望a_variable是与"id"字段有关的数字。
但如果终端用户选择一个字符串,就绕过了对转义字符的需要。
转义字符类型的攻击形式:
Web应用程序开发时没有对用户的输入进行转义字符过滤时,会发生这种形式的注入式攻击,它会被传递给一个SQL语句,这样就会导致恶意用户对数据库上的语句实施操纵。
例如,下面的这行代码就会演示这种漏洞:
Statement:
="SELECT*FROMusersWHEREname="+userName+";"
该段代码的设计目的是将特定的用户从其用户表中取出,但如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不是应用程序开发者所期望的那样了。
例如,将用户名变量(即username)设置为:
′a′or′1′=1,此时原始语句发生了变化:
SELECT*FROMusersWHEREname=′a′OR′1′=′1′;
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值′1′=1永远是真。
在一些特定的SQL服务器上,如SQLServer中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。
Union查询攻击形式:
Union查询动机是绕过验证或者提取数据。
攻击者在查询语句中注入UnionSELECT语句,并且因为用户控制“SELECT语句”的内容,攻击者可以得到想要的信息。
Union查询SQL注入测试。
假设我们有如下的查询:
SELECName,Psw,TelFROMUsersWHEREId=$id然后我们设置id的值为:
$id=1UNIONALLSELECTbankCardNumber,1,1FROMBankCardTable
那么整体的查询就变为:
SELECTName,Psw,TelFROMUsersWHEREId=1UNIONALLSELECTbankCardNumber,1,FROMBankCarTable
显然这样就能得到所有银行卡用户的信息。
注释符攻击形式:
使用注释通常可以使攻击者绕过验证。
SQL在查询中支持注释,如,--、#等。
通过注入注释符,恶意用户或者攻击者可以毫不费力的截断SQL查询语句。
例如,对于查询语句SELECT*FROMusersWHEREusermame=unameandPassword=psw,如果恶意用户输入参数uname的值为admin--,Password的值为空,那么查询语句变为SELECT*FROMusersWHEREusermame=adminandPassword=,也就SELECT*FROMusersWHEREusermame=admin。
这就使得恶意用户不用提供密码就可以通过验证。
三、SQL注入实例分析
1系统核心代码
显示文章内容的主要代码:
<%’############查询数据模块开始#################%>
<%functionquery()
id=request.QueryString("id")
为了测试此处没有对参数进行任何过滤和合法性分析
setrs=conn.execute("select*fromnewswhereid="&id)
whilenotrs.eof
response.Write("red;font-weight:
bold;"">
发布者:
"&rs("adder")&"
发布时间:
"&rs("time")&"
标题:
"&rs("title")&"
[red;"">内容:
]
"&rs("content"))
rs.movenext
wend
callfirst()
endfunction%>
<%'############查询数据模块结束#################%>
2、注入测试和分析
①注入测试
首先看正常显示文章截图:
图
(1)
在地址后面加一个单引号'看返回结果是否正常
图
(2)
返回系统查询报错,说明可能存在注入漏洞。
继续测试以确认是否真正存在注入漏洞,在地址后面加上and1=1查看返回结果是正常。
图(3)
显示正常没有异常。
再接着把and1=1改为and1=2看返回结果是否异常。
图(4)
返回空白出现异常。
通过上面的注入测试,可以确定该网站一定存在SQL注入漏洞。
②注入攻击过程及分析
下面使用构造参数攻击:
构造语句:
?
action=query&id=54andexists(select*from_admin)
发现返回正常,那么可以确定数据库一定存在表_admin
下面构造:
(猜测字段)
?
action=query&id=54andexists(selectun,pwfrom_admin)
返回结果造成说明SQL执行正确,那么数据表_admin里一定存在unpw两个字段
下面继续构造语句:
(猜测字用户名)
?
action=query&id=54andexists(select*from_adminwhereun='admin')
返回结果正常,至此已经获得了一个管理员用户名admin
下面构造:
(猜测密码)
?
action=query&id=54andexists(select*from_adminwherepw='admin')
返回结果正常,至此经获得了一个管理员用户名admin密码是admin
下面点击首页的登录:
图(5)
用得到的用户名admin和密码admin登录
图(6)
图(7)
成功进入网站后台管理:
图(8)
到这里一个成功的注入过程就完成了,成功的到了网站管理员的用户名和密码。
四、SQL注入的防范措施
1、防范措施1(对参数进行强制类型转换)
核心代码:
<%'############查询数据模块开始#################%>
<%functionquery()
id=cint(request.QueryString("id"))'使用cint函数把接收的值强制转为整型
setrs=conn.execute("select*fromnewswhereid="&id)
whilenotrs.eof
下面通过再次注入检测看效果:
在链接后加单引号'
图(9)
提示类型转换失败。
在链接后面加and1=1
图(10)
仍然提示类型转换失败。
在链接后面加and1=2
图(11)
还是提示类型转换失败。
从此看来是不能注入的。
说明实施强制类型转换成功的防治了SQL注入。
防范措施2(类型判断)
核心代码:
<%'############查询数据模块开始#################%>
<%functionquery()
ifisnumeric(request.QueryString("id"))then'这里判断参数是否是一个数字如果不是提示非法
id=request.QueryString("id")
else
response.write("参数非法")
response.end()
endif
setrs=conn.execute("select*fromnewswhereid="&id)
whilenotrs.eof
下面通过再次注入检测看效果:
在链接后加单引号'
图(12)
提示参数非法。
在链接后面加and1=1
图(13)
仍然提示参数非法。
在链接后面加and1=2
图(14)
还是提示参数非法。
从此看来是不能注入的。
说明实施强类型判断成功的防治了SQL注入。
五、密码用MD5加密存储和验证
1加密的必要性分析
从上面可以看到通过SQL注入攻击者很容易就得到用户的密码,如果密码没有经过加密那么攻击者就可以使用该密码登录,如果密码是加密保存在数据库的,而且登录验证是也是加密验证,那么攻击者得到的就是加密的字符串,如果攻击者不能破解该字符串那么攻击者是无法登陆的。
这样给网站安全又加上了一道防护。
2加密核心代码,登录验证核心代码
①加密核心代码
<%'##################添加用户模块开始##################%>
<%functionadduser()
ifrequest.QueryString("level")=""thenexitfunction
username=request.Form("username")
password=md5(trim(request.Form("password")))'添加用户时将用户的密码md5加密后保存到数据库
level=cint(request.QueryString("level"))
iflevel=0then
setrs=conn.execute("selectusernamefrom_userwhereusername='"&username&"'")
setrs2=conn.execute("selectunfrom_adminwhereun='"&username&"'")
if(rs.eofandrs.bof)and(rs2.eofandrs2.bof)then
conn.execute("insertinto_user(username,password)values('"&username&"','"&password&"')")
response.Write("alert('添加成功!
');window.close();")
rs.close
else
②登录验证核心代码
<%'############验证登录据模块开始#################%>
<%functionchecklogon()
username=request.Form("username")
password=md5(trim(request.Form("password")))
'登录时先将用户的密码md5加密后与数据库里面的对比
setrs=conn.execute("select*from_userwhereusername='"&username&"'andpassword='"&password&"'")
setrs2=conn.execute("select*from_adminwhereun='"&username&"'andpw='"&password&"'")
if(rs.eofandrs.bof)and(rs2.eofandrs2.bof)then
response.Write("alert('用户名或密码错误');window.location='?
action=showlogon';")
rs.close
rs2.close
else
六、服务器目录权限配置
1、权限分配原则分析
对一个网站来说除了上传文件的目录能写入文件以外其它的所有目录均不能写入文件,而且上传文件的目录不能有网页程序的执行权限,这样可以保证即使黑客成功上传程序到上传目录那么也是不执行的。
2、具体权限分配过程
利用NTFS文件系统的权限分配功能:
首先在文件夹安全选项里面把iis帐号加到网站根目录中。
然后指定其只能读取,不能写入文件,那么整个网站里面的所有目录都不能写入文件了。
下面接着给上传文件目录加上写人的权限。
至此已经完成了除了上传文件目录可以写入文件其它目录均不能写入文件。
接着配置上传目录的运行权限使其不能运行网页程序。
至此完成了权限分析中的所有需求。
七、总结
本次课程设计对网站SQL注入攻击及网站安全技术进行了比较详细地分析,通过本次课程设计使我掌握了对SQL注入攻击漏洞的检测技术和预防SQL注入的手段,而且学会了在IIS和NTFS文件系统环境下安全配置网站的目录权限的技能,了解到信息系统网站中存在的普遍安全漏洞。
网站的安全稳定运行,应侧重于预防,不断增强安全意识,采取各种预防措施,才能及时有效地排除安全隐患。