#SQL注入:
定义:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。
SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的 数据 库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
SQL注入攻击的总体思路:
·发现SQL注入位置;
·判断后台数据库类型;
·确定XP_CMDSHELL可执行情况
·发现WEB虚拟目录
·上传ASP木马;
·得到管理员权限
#问题背景:
我们在学习系统的登录界面时有这么一段代码:
txtSQL = "select * from user_info where user_ID='" & txtUserName.Text & "'"
当你在登陆学生管理系统的时候,添加的用户名若和你数据库中的数据不符时,就会弹出一个窗体,告诉你没有这个用户,但是当你在用户名中输入数字或者字母外加英文状态下的单引号,比如:“a’”,“‘or 1=1#”两个单引号括起来的部分是判断输入的用户名是否和数据库中一致,但你输入“a’”时,就会在两个单引号之间添加了一个单引号,结果可想而知,数据库无法连接,所以就无法登陆。
解决办法:
'sql注入简便方法
Private Sub txtUserName_KeyPress(KeyAscii As Integer)
If KeyAscii = 39 Then '如果输入的是单引号
KeyAscii = 0
End If
End Sub
'sql注入全面的方法
Private Sub txtusername_Change()
Dim s As String
Dim ss As Long
Dim l As Long
Dim i As Long
s = ",。、;’【】·!@#¥%……&*()——+|~《》?:“{}',.;\/:*?""<>|{}[]!@#$%$^&()~`_-+=" '需要禁止的字符都放这里吧
ss = txtUserName.SelStart 'selstart是选中文本的开始位置
For i = 1 To Len(s) 'len(s)求s的长度
l = Len(txtUserName.Text)
txtUserName.Text = Replace(txtUserName.Text, Mid(s, i, 1), "") 'replace是SQL语句里面的替换,把txtusername.text里面的mid(s,i,l)替换为“”
'Mid就是从一个字符串中取子字符串,比如a="aabbcc",我们想取出"bb"就可以用Mid("aabbcc",3,2)
Next
txtUserName.SelStart = ss
End Sub
#预防措施:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过 正则表达式 ,或限制长度;对单引号和双"-"进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用 存储过程 进行数据查询存取。
- 永远不要使用 管理员 权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的 错误信息 对原始错误信息进行包装
- sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具、MDCSOFT SCAN等。采用 MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。