‘or’万能密码漏洞的修补
### ‘or’万能密码漏洞的修补 在网站开发中,由于输入验证不足或SQL查询构建不当,常常会出现SQL注入漏洞。其中,“or”万能密码漏洞是一种典型的SQL注入攻击方式,攻击者通过向登录表单提交特殊构造的用户名和密码(如`username='or 1=1 --`),使得原本的查询逻辑被绕过,进而实现非法登录的目的。本文将详细介绍“or”万能密码漏洞的工作原理、危害性以及两种常见的修补方法。 #### 一、漏洞原理 当用户提交登录信息时,后台会根据这些信息构造SQL查询语句,并将其发送到数据库进行验证。如果查询构造过程中没有对用户的输入进行有效的过滤和转义处理,那么攻击者就可以利用这个漏洞,通过提交特殊的字符串来改变原有的SQL查询逻辑。 例如,假设原始的SQL查询语句为: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password' ``` 攻击者可以尝试提交这样的用户名:`username='or 1=1 --`,则实际执行的SQL语句变为: ```sql SELECT * FROM users WHERE username = ''or 1=1 --' AND password = '' ``` 由于`1=1`总是成立,而`--`表示SQL注释,这会导致查询结果始终返回true,从而让攻击者成功登录。 #### 二、修补方法 ##### 方法1: Replace过滤字符 这种方法主要是通过在接收用户输入之前,使用特定函数过滤掉可能引起SQL注入的特殊字符。比如,使用`Replace`函数替换单引号为两个单引号。 **示例代码:** ```vbscript username = Replace(request.Form("name"), "'", "''") pass = Replace(request.Form("pass"), "'", "''") ``` 这里的`Replace`函数用于将所有出现的单引号(')替换为两个单引号('')。这样即使用户尝试输入恶意数据,也不会影响到最终的SQL查询语句结构。 ##### 方法2: 使用安全脚本文件过滤 除了直接修改登录脚本外,还可以引入一个安全脚本来处理所有用户的输入,以确保所有请求都经过了必要的过滤和检查。 **示例代码:** ```vbscript <!--#include file="safe.asp"--> ``` 这段代码的作用是包含了一个名为`safe.asp`的安全脚本文件。在这个文件中,可以编写更复杂的逻辑来过滤和检查用户的输入,确保其不会引发SQL注入攻击。 **`safe.asp`示例内容:** ```vbscript <% Dim Query_Badword, Form_Badword, i, Err_Message, Err_Web, name Err_Message = 3 '设置错误信息提示类型 Err_Web = "safe.htm" '定义敏感词汇列表 Query_Badword = "'|and|select|update|chr|delete|%20from|;|insert|mid|master.|set|chr(37)|=" Form_Badword = "'|(|)|;|=|" OnErrorResumeNext If Request.QueryString <> "" Then Chk_badword = Split(Query_Badword, "|") For Each Query_Name In Request.QueryString For i = 0 To UBound(Chk_badword) If InStr(LCase(Request.QueryString(Query_Name)), Chk_badword(i)) <> 0 Then Select Case Err_Message Case "1" Response.Write "<Script Language=JavaScript>alert('非法操作!'); window.close();</Script>" Case "2" Response.Write "<Script Language=JavaScript>location.href='" & Err_Web & "'</Script>" Case "3" Response.Write "<Script Language=JavaScript>alert('非法操作!'); location.href='" & Err_Web & "';</Script>" End Select Response.End End If Next Next End If If Request.Form <> "" Then Chk_badword = Split(Form_Badword, "|") For Each name In Request.Form For i = 0 To UBound(Chk_badword) If InStr(LCase(Request.Form(name)), Chk_badword(i)) <> 0 Then Select Case Err_Message Case "1" Response.Write "<Script Language=JavaScript>alert('非法操作!'); window.close();</Script>" Case "2" Response.Write "<Script Language=JavaScript>location.href='" & Err_Web & "'</Script>" Case "3" Response.Write "<Script Language=JavaScript>alert('非法操作!'); location.href='" & Err_Web & "';</Script>" End Select Response.End End If Next Next End If %> ``` 此段代码实现了对GET和POST请求中的敏感词汇进行检查,一旦发现存在潜在的SQL注入攻击,就立即中断后续流程,并给出相应的提示信息或重定向到安全页面。 #### 三、总结 “or”万能密码漏洞是由于程序设计时未对用户输入进行充分验证而导致的一种典型SQL注入漏洞。通过对用户输入进行适当的过滤和转义处理,或者采用更高级的安全脚本文件来过滤所有请求,可以有效地防止这类攻击的发生。同时,开发者还应该定期对系统进行安全审计,及时发现并修复存在的安全问题,以保护系统的安全稳定运行。
解决方法:查找login.asp下的<from找到下边的类似
username=request.Form("name")
pass=request.Form("pass")
修改为:
username=Replace(request.Form("name"), "'", "''")
pass=Replace(request.Form("pass"), "'", "''")
语法是屏蔽'和''字符来达到效果.
方法2:在conn.asp 内加入<!--#include file="safe.asp"-->
注:(前提 登陆页面有<!--#include file="conn.asp"-->)
使用这种方法的好处是,所有调用conn.asp的页面,都将受到以下代码保护,对于sql注入会起到一定作用。
把以下代码保存为safe.asp
下面是程序代码********************************************************
<%
Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name
Err_Message = 3 '这里可以更改错误提示信息1、2、3个选择。
Err_Web = "safe.htm"
'出错时转向的页面
Query_Badword="'|and|select|update|chr|delete|%20from|;|insert|mid|master.|set|chr(37)|="
'在这部份定义get非法参数,使用"|"号间隔
Form_Badword="'|(|)|;|="
- 粉丝: 1
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- js基础但是这个烂怂东西要求标题不能少于10个字才能上传然后我其实还没有写完之后再修订吧.md
- electron-tabs-master
- Unity3D 布朗运动算法插件 Brownian Motion
- 鼎微R16中控升级包R16-4.5.10-20170221及强制升级方法
- 鼎微R16中控升级包公版UI 2015及强制升级方法,救砖包
- 基于CSS与JavaScript的积分系统设计源码
- 生物化学作业_1_生物化学作业资料.pdf
- 基于libgdx引擎的Java开发连连看游戏设计源码
- 基于MobileNetV3的SSD目标检测算法PyTorch实现设计源码
- 基于Java JDK的全面框架设计源码学习项目