‘or’='or’万能密码漏洞修补与总结
? 说起这个万能密码,相信玩过黑的都认识吧.也就是 ‘or’='or’,这只最基础的一种,总结一下吧:
各种各样的万能密码
‘or’='or’
1′or’1′=’1
admin’or’1′=’1′–
‘or’’=’
” or “a”=”a
‘) or (’a’=’a
or 1=1– ‘
or ’a’=’a
‘or”=’
‘or’1′=’1
“or=or”
‘or”=”or”=’
‘or’=’1′
‘or’ ’1′=’1
’or’’=’ " or "a"="a  ’) or (’a’=’a  ") or ("a"="a  or 1=1--  ’ or ’a’=’a
最短的:’or’1
修补方案:
在管理登录文件源码内类似下面代码的代码
?username=request.Form(“name”)
pass=request.Form(“pass”)
改成:
username=Replace(request.Form(“name”), “‘”, “””)
pass=Replace(request.Form(“pass”), “‘”, “””)
如果不到的话,看下管理登录页面源码内是否有调用的页面.
例如:
<form name=”form1″ method=”post” action=”login_ok.asp”>
则应检查login_ok.asp页面的源码.
来个例子吧:
原代码:
thename=trim(request(“name”))
thepassword1=trim(request(“password”))
修改为:
thename=Replace(request.Form(“name”), “‘”, “””)
thepassword1=Replace(request.Form(“password”), “‘”, “””)
记得大约是在2002年的时候,SQL Injection(SQL注入)开始有了最初的雏形。黑客们发现,在动态网页的某些地方(表单等……)插入一些可以在数据库查询中起作用的语句和符号,就可以让页面执行后,返回特殊的结果。于是,经过了2003的发展,到2004年,SQL Injection已经作为一种很成熟的入侵技术登上了安全界的舞台。也是2004年,有大批的网站程序被发现了SQL Injection漏洞,也有大批的网站栽倒在这种攻击手段之下。
下面,我就小行和逍遥一指令的帖子,作总结性的说明,仅供参考。
正如如小行所说的,在某些网站的登录界面,如果你知道了存在的用户名(例如:admin),你无须知道密码。只需在密码框中输入' or ''='即可。(注意,全是单引号!)这样在不知道密码的情况下,也可以用admin的身份登录。
但是,我想说的是,' or ''='在一些地方会出现问题。有些数据库不会认为“空”=“空”是成立的条件,这样就不行了。最好写成' or '1'='1
这样,SQL的查询语句,就变成了如下的样子。
select * from users where name='admin' and pass='123456' or '1'='1'
上面,蓝的部分是用户在密码框中输入的数据。大家可以看见,由于用户的巧妙构造,使得SQL Server把这条查询语句解析为3个条件:
1、name='admin'
2、pass='123456'
3、'1'='1'
关键是中间的那个or,这样一来,SQL Server在解析的时候,只要条件2、3,符合一个就可以了。
因为1=1是衡成立的,所以这个查询的结果肯定是true。
既然已经知道了原理,那我们可以试着防范这种攻击。
我们的根本目标,就是把用户输入的单引号和or过滤掉,这样就能在基本上杜绝SQL Injection攻击。但是,需要强调的是,SQL语句中,起作用的还有and,分号,--(两个减号)等等。
解释一下:and用于连接两个条件。;(分号)用于分隔两个语句。(如果把两个语句写在一行,就需要它。)--(双减号只在MS SQL Server中起作用,含义是忽略后面的内容。这个通常在繁琐的MS SQL注入中使用。)
回归主题。asp中为我们提供的字符转义函数:Replace。看代码:
<%
Dim Usr,Pwd
Usr=Request.form("username") '从表单获得数据
Pwd=Request.form("password") '同上
if (Usr<>"") and (Pwd<>"") then '判断数据为非空
Usr=Replace(Replace(Usr,"'",""),"or","") '嵌套了两个replace函数,过滤特殊字符
Pwd=Replace(Replace(Pwd,"'",""),"or","")
end if
%>
Repalce语法规则:
Replace(变量名称,"要过滤的字符","要替换的字符")
说明,“要替换的字符”那里,如果留空,就是把要过滤的字符直接删除。
密码字符串是什么例子:
Replace(Pwd,"'or","")
过滤Pwd变量中的or字符。
由于Replace函数,一次只能对一组字符进行转义,所以讲讲Replace的嵌套:
Replace(Replace(Pwd,"or",""),"'","")
代码中红的地方,被外面的replace函数看作一个变量,依此类推。
如果你还想过滤and,分号,--什么的,请看下面(完全过滤了在SQL注入中最关键的5个字符串。)
Replace(Replace(Replace(Replace(Replace(变量名称,"'",""),"or",""),"and",""),"--",""),";","")
上面只是防范从表单提交的数据,对于一些新闻系统,经常会出现诸如:
host/news/show.asp?id=1
之类的URL。
如果在那个1后面,加上一个单引号,一样会报错。我们往下看。
如果加上了单引号,SQL语句就变成了:
select * from news where id='1''
因为最后一个引号没有闭合,所以系统一定会报错。
防范如下(其实和上面的原理是一样D……)看代码:
<%
Dim id
id=Request("id")
if Not IsNumeric(id) then '------事先声明了变量,所以可以直接写进去。否则,就要写Request("id")
Response.write "Error!" '------反馈错误信息
end if
%>
因为,类似新闻ID之类的变量,是根本不需要有字母和符号存在的,所以用IsNumeric来判断是否为纯数字,确保万无一失。
如果一个变量,里面需要有字母和符号,那你就只好用Replace函数慢慢过滤了……:O)
最后,再说两种防止ASP页面暴出错误信息的方法。
众所周知,入侵者往往都是通过页面暴出的错误来得知一些额外的信息。比如你的系
统,SQL Server的版本,是否存在某数据库,SQL语句是否执行成功等……
防止入侵者看到错误信息,就是让入侵者变成了睁眼瞎,不到头绪。(骨灰级黑客除外~~~~)
方法1:打开你的IIS管理器(以IIS6.0为例),选择你的网站=》属性页面=》主目录选项卡=》点击配置按钮=》调试选项卡=》向客户端发送下列文本错误消息
这样,即使入侵者到了注入点,注入后,得到也只是服务器返回的固定的错误消息。不能得到任何有价值的错误信息。
方法2:在你的ASP语句中(一般是在最开头的地方),加上一句
On Error Resume Next
(注意,这句必须加在<%  %>里面,不然IIS可不认。)
这就是著名的容错语句,当ASP语句执行时发生错误,就跳过错误,继续向下执行,而且不会返回错误信息。
当然,入侵者看不到错误信息,调试人员也看不到。所以,你一定在把一个ASP程序调试完毕后,再把这个语句加到ASP语句的顶端。否则,调试的时候,会烦死你的~~~~~~:O)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。