万能密码 'or'='or'如何防
用户名和密码分开验证,
set rs = server.createobject("adodb.recordset")
rs.open "select * from admin where 用户名 = '"&name&"' ",conn,1,
if rs.eof then
错误提示:用户名错
处理代友码。。。
end if
if rs("密码")输入密码 then
错误提示:密码错
处理代码
end if
将以下代码放入conn.asp文件就行了
"" thenChk_badword=split(Query_Badword,"∥")FOR EACH Query_Name IN Request.QueryStringfor i=0 to ubound(Chk_badword)If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))0 ThenSelect Case Err_MessageCase "1"Response.Write "alert('传参错误!参数 "&name&" 的值中包含非法字符串!
请不要在参数中出现:and update delete ; insert mid master 等非法字符!');window.close();"Case "2"Response.Write "location.href='"&Err_Web&"'"Case "3"Response.Write "alert('传参错误!参数 "&name&"的值中包含非法字符串!
请不要在参数中出现:and update delete ; insert mid master 等非法字符!');location.href='"&Err_Web&"';"End SelectResponse.EndEnd IfNEXTNEXTEnd if'-----对 post 表 单值的过滤.if request.form"" thenChk_badword=split(Form_Badword,"∥")FOR EACH name IN Request.Formfor i=0 to ubound(Chk_badword)If Instr(LCase(request.form(name)),Chk_badword(i))0 ThenSelect Case Err_MessageCase "1"Response.Write "alert('出错了!表单 "&name&" 的值中包含非法字符串!
请不要在表单中出现: % & * # ( ) 等非法字符!');window.close();"Case "2"Response.Write "location.href='"&Err_Web&"'"Case "3"Response.Write "alert('出错了!参数 "&name&"的值中包含非法字符串!
请不要在表单中出现: % & * # ( ) 等非法字符!');location.href='"&Err_Web&"';"End SelectResponse.EndEnd IfNEXTNEXTend if%>
Set Conn= Server.CreateObject("ADODB.Connection") '定义连接数据库的对象
Const AccessFile="jmdcw.mdb" '数据库地址
Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(AccessFile) '连接到数据库
Conn.Open '打开数据库
....................
name=request("name") '得到所提交的用户名
pass=request("pass") '得到所提交来的密码
............
Set Jmdcw=Server.CreateObject("ADODB.RecordSet") '定义操作数据库的对象
SQL="SELECT username,userpass FROM User WHERE username='"&name&"' AND userpass='"&pass&"'" 'SQL语句
Jmdcw.Open SQL,Conn,1,1 '执行查询
......
If Jmdcw.EOF AND Jmdcw.BOF Then '如果没有查询到
response.redirect "onerror.html" '显示错误页
end if
'如果正确,就继续执行。
..........
以上就是一段简单的用户验证代码,当注入漏洞被广泛发掘之后,类似这样的漏洞就越来越少了,但少并不表示程序员在写代码时已经具备了防范意识,无意之中还是会出现这样或那样的漏洞。OK,书归正传,先来测试一下上面的代码。输入的用户名是:jmdcw,密码是:123456。(典型的弱口令密码,哈哈),这样SQL语句就是:
select username,userpass from user where username='jmdcw' and userpass='123456'
程序会查询user表中是否有jmdcw用户,并且该用户的密码是否为123456。如果username='jmdcw'的结果为真,userpass='123456'的结果也为真,那么“真 And 真 ”的结果就是真,验证通过。
当然,如果用户名和密码其中之一的结果为假,“真 And 假 ”的结果就是假,当然“ 假 And 假 ”的结果也是假,呵呵。
没有用户名或密码怎么进入?试一下'or''='吧,在提交用户名处输入 jmdcw'or''=',这样的SQL语句就是
select username,userpass from user where username='jmdcw'or''='' and userpass='12345678'
在逻辑表达式中,AND的优先级要高于OR,所以语句会先对 “''='' and userpass='12345678'” 进行判断,虽然 ''='' 为真,但密码为假,所以结果为假,但因为我们加入了OR连接符,这样,虽然后面的结果为假,但username的结果为真,所以也一样能进入这个用户的后台。
但如果不知道用户的名称,那么就要在输入的密码后也加入一个'or''=',这样,SQL语句就是
select username,userpass from user where username='jmdcw11'or''='' and userpass='12345678'or''=''
在执行and语句,''='' and userpass='12345678'的结果为假,然后是 'jmdcw11'or假 ,结果为假,再接下来是:假or ''='',这个结果就是真了。
但现在的密码都用MD5加密,对提交来的密码在进入SQL语句之前,先用MD5进行了转换,这样,就算在密码后加入了'or''=',也发挥不了作用。对于密码采用md5加密的,不妨在用户名处再加入一个or''='',也 就是在用户名处输入:jmdcw'or''=''or''=',这样的SQL 语句就是:
select username,userpass from user where username='jmdcw11'or''=''or''='' and userpass='12345678'
先执行and语句,结果为假,然后是username='jmdcw11'or''='',结果为真,接下来是:真or假,结果还是真,这样又绕过了验证。
说到这儿,我忽然想起,在文章开头所提到的网站,其密码也是用md5加密的,并且我也不知道任何一个用户名,也只用了一个or语句,为什么却进入了呢?思来思去,莫不是SQL语句中的用户与密码的位置有所不同,其的SQL语句是这样的:
select username,userpass from user where WHERE userpass='"&pass&"'" and username='"&name&"',
密码在前面,用户在后面,这样,当我在用户名处输入:jm'or''='后,其语句就变成了
select username,userpass from user where WHERE userpass='123456" and username='jm'or''=''
按照优先级,先运算ANd语句,结果为假,然后是OR语句,假or''='',结果就是真了。看来代码中的位置发生变化也能演绎成一种漏洞。
上面所提到的方法主要是针对于ACCESS数据库,但如果程序所对应的数据库是SQL,那危害就大很了,先不要说别的,还是说一下登陆的事情,直接用:
存在的用户名';--
这个可以不用密码就登陆到指定的用户之中,如果不知道呢:就用:
任意名称'or''='';--
这样所进入的会是第一个用户,很有可能是管理员的用户之中.
如何防止这种漏洞呢?很简单,就是在接收字符的语句中加入replace过滤语句,比如name就是:
name=replace(request("name"),"'","")
将'过滤为空。密码过滤的方法也类似。当然,这是简单的过滤方法,还有更多复杂的。比如过滤一些特殊字符,空格、chr(0)、%、script等一些字符,防止写入XSS代码。
那是ASP才遇到这样的问题,JSP是不会遇到这样的,PHP可以用正则表达式
加上 ' or '1'= '1 就可以
package com.swift;
(此处空一行)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
(此处空一行)
public class LoginJDBC$PreparedStatement2 {
(此处空一行)
public static void main(String[] args) {
User userSwift=new User("zhangsan","123456");
if(login(userSwift)) {
System.out.println("账号密码正确,登陆成功");
}else {
System.out.println("登陆失败");
}
}
(此处空一行)
private static boolean login(User userSwift) {
(此处空一行)
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1、装载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//2、链接数据库,使用com.mysql.jdbc.Connection包会出错
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
//3、创建连接语句
ps=conn.prepareStatement("select * from sw_user where username=? and password=?");
ps.setString(1, userSwift.getUsername());
ps.setString(2, userSwift.getPassword());
//4、执行SQL语句获得结果集
rs=ps.executeQuery();
if(rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭结果集
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭连接语句
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭数据库连接
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
(此处空两行)
}
(此处空一行)
}
扩展资料:
注意
sql语句通过字符串连接的方式,虽然已经使用了PreparedStatement,但依然不能防止注入,因为字符串连接可以加入'or '1'='1
ps=conn.prepareStatement("select * from sw_user where
username='"+userZhangsan.getUsername()+"' and
password='"+userZhangsan.getPassword()+"'");
sql语句变为 select * from sw_user where username=? and password=?
就不存在字符串连接,password 加上其他字符sql也无法执行。
请问我手机的开机密码忘了该怎么办??我全都试过了都没用。你能帮帮我吗?
万能密码 'or'='or'如何防
如果不知道用户名,可以在密码后加上“or''=”,生成如下SQL语句:“select username,userpass from user where username='jmdcw11'or''='' and userpass='12345678'or''=''”这段语句会先判断“''='' and userpass='12345678'”,结果为假。然后是“username='jmdcw11'or''=''”,结果为...
有谁知道现在最新的万能密码!我只知道一个‘or’='or'
网站后台所谓的“万能密码”其实是一种利用SQL注入技术实现的漏洞利用方法。具体做法是在用户名和密码字段中输入特定的SQL注入语句,使得后台验证逻辑被绕过,从而实现无需正确密码就能登录的效果。这类方法依赖于数据库系统的SQL注入漏洞。常见的注入语句包括:“or 'a'='a”、“'or 1=1--”、“or 1...
万能密码 'or'='or'如何防
在逻辑表达式中,AND的优先级要高于OR,所以语句会先对 “''='' and userpass='12345678'” 进行判断,虽然 ''='' 为真,但密码为假,所以结果为假,但因为我们加入了OR连接符,这样,虽然后面的结果为假,但username的结果为真,所以也一样能进入这个用户的后台。但如果不知道用户的名称,那么就...
为什么说'or'='or'是通用密码?
你说的那些都是黑客破解中常用的伎俩,想黑某网站时,可以在网址后面加上“and1=1"或者1=2来确定有没有注入点,那个“or=or"一般用来猜解网站管理员密码用的,如果想学黑客可以买本书什么的。
'or'='or' 可以登录后台吗?
if pass=rs("pass")then 就打开管理网页 else 就打开身份验证网页 end if 这样就可以解决'OR''='漏洞的问题。如果你熟悉Javascript,也可以用Javascript来限制用户名和密码中出现的特殊字符,一旦出现“'”就提示出错,这也是个不错的方法。最后笔者还想提醒一下各位站长,'OR''='问题绝对不容忽视!
寻求破解网站后台最新万能密码
其实万能是没有的,默认是很多的,admin admin admin admin888 少数ASP网页后面登陆时可以用密码1'or'1'='1(用户名用admin等试)登陆成功。这一般也是SQL注入的第一课,原理涉及到SQL语句……验证登陆时,如果密码=输入的密码,那么登陆成功,把1' or '1'='1带入即“如果密码=1或者1=1那么登成功...
超简单的Sql注入之万能密码
简单来说,万能密码可以表示为:a' or 1 # 或者 a' or 1=1 #,等同于a' or true #。在登录界面输入万能密码,如admin’ #后,后端将参数添加至SQL中,执行如下:select * from user where username='admin' #' and password='pass'由于#为SQL注释符,其后内容无效,实际执行的SQL为:select...
谁能帮我教我如何破解asp的后台管理帐号和密码。
1、首先,破解一个网站,是因为这个网站安全性较低,有漏洞(SQL注入等),所以才能够被破解。2、1是前提,如果网站本身没有漏洞,就只能从虚拟主机上下手。Qme:334194041,下午吧,上午一般很忙。我有相关破asp的工具。
5种方法轻松找回电脑开机密码
1,解决方法分两部分,第一部分,如果管理员Adminstartor帐号没有设置密码,可以在开机进入登录框时,左手按Ctrl + Alt ,然后右手连接两下Delete键,调出管理员登录框。不要输入任何密码,直接按“确定”就可登录系统。 2,进入系统后,打开控制面板,进入“用户帐户”这一项。 3,在用户帐户窗口,选择自已的帐号,双击。 4...
密码的英文是什么
英文密码是:代码;密码;秘密代码;他正是知道密码的人。只有他知道密码。匪徒们威胁说,如果他不告诉他们密码藏在哪里,他们就把他干掉。匪徒们威胁说,如果他不说出密码藏在哪里,他们就杀了他。一站式出国留学攻略 http:\/\/www.offercoming.com ...