'or'='or'经典漏洞原理分析

 

'or'='or'漏洞是一个比较老的漏洞了,主要是出现在后台登录上,利用这个漏洞,我们可以不用输入密码就直接进入系统的后台。它出现的原因是在编程时逻辑上考虑不周,同时对单引号没有进行过滤,从而导致了漏洞的出现。先给大家简单介绍下漏洞的原理吧,只要大家搞懂了原理,就可以自己去找这样漏洞的系统了。
1:语句:''or'='or'    a'or'1=1--    'or1=1--    "or1=1--    or1=1--    'or"="a'='a    ') or ('a'='a等等,
2:分析利用:我从站长网站下载了"织梦工作室企业全站程序(原良精)修正美化版"源代码,从中找到后台登录的页面"login。asp"其中有以下一段代码:
<%
(1)pwd = request。form("pwd") "获取客户端输入的密码,再把值赋给pwd"
(2)name = request。form("name")    "获取客户端输入的用户名再把值赋给name"
都没有进行任何过滤
(3)Set rs = Server。CreateObject("ADODB。Connection") "利用Server对象的CreateObject方法创建ADO组件的Connection对象"
(4)sql = "select * from Manage_User where UserName='" & name & "' And PassWord='"&encrypt(pwd)&"'"    "将用户名和密码放入查询语句中查询数据库"
(5)Set rs = conn。Execute(sql) "执行SQL语句"

(6)If Not rs。EOF = True Then    "当前的记录位于Connection对象的最记录之后一个前"
(7)Session("Name") =    rs("UserName")    "将UserName的属性赋给Name的Session自定义变量"
(8)Session("pwd") =    rs("PassWord")     "将PassWord的属性赋给pwd的Session自定义变量"
(9)Response。Redirect("Manage。asp")了    "利用Response对象的Redirect方法重定向"Manage。asp"
(10)Else
(11)Response。Redirect "Loginsb。asp?msg=您输入了错误的帐号或口令,请再次输入!"
(12)End If
(13)end if
%>
  从这段代码中,我们可以看到后台是采用"Session"验证的,大家知道,还有一种是采用"cookie"验证的,不过原理相同,从分析中,我们可以看到后台登录没有对客户输入的用户名和密码进行任何过滤,就交给了SQL语句查询,如果查询的记录是位于最后一条记录之前,刚设置Session变量UserName,PassWord的值分别为Name,pwd,并重定向到"Manage。asp"。
  从以上分析中。出现了很大的安全漏洞,问题就出现在第一,第二句,它们的功能是获得客户端输入的用户名和密码却没有进行任何的过滤, 也不会去检查我们输入的数据,这样,我们就可以对其实行攻击,要实行攻击这种漏洞的问题关键就是使SQL语句的查询结果为真,这里我们又要用到or和and的逻辑运算的知识,我这里不详细的说,就讲二点,第一,优先原则:出现or同时又出现and时,则先运算and运算符,第二,and运算符意思,是"且"就是对二个表达式进行逻辑"与"运算(我这儿说的是"且"),而or运算符意思,是"或"就是对二个表达式进行逻辑"或"运算,下面是二个运算符的运算结果:
  and逻辑运算的结果"真----真===真;假----真===假;    真----假===假; 假----假===假。
  or逻辑运算的结果:真----真===真;假----真===真;    真----假===真; 假----假===假。
  大家自己可以体会下
  下面我们先来看代码中的SQL查询语句"sql = "select * from Manage_User where UserName='" & name & "' And PassWord='"&encrypt(pwd)&"'"    ,要使这条语句执行为真,我们就要构造一个特殊的用户名,就可绕过程序的验证,进入后台,我们只要在用户名处输入'or'='or',密码处随便输入字符(我们就输入000吧),这样上面的SQL语句就变成了sql = "select * from Manage_User where UserName=''or'='or''and PassWord='000'"那么where后的语句转换成逻辑语句后为假or真or假and假,通过简单的运算,则最终为真,而SQL语句的查询结果也变成真了,这样大家可能还不怎么听得懂,我换成另一条语句:1' or 1=1 or '1'='1,那么SQL语句就变成了sql = "select * from Manage_User where UserName='1'or1=1or'1'='1'and PassWord='000'"大家知道,在逻辑表达式中'1'是为假,1=1总为真吧,'1'='1'也为真,而密码我们是随便输入的所以为假,那么where后的语句转换成逻辑语句后为假or真or真and假,最终的运算结果也为真.这些大家自己慢慢的去实践,去体会,我相信大家都会搞懂的,大家还可以自己构造一些语句去验证下.
  对于Session验证的,我们还可以进行Session欺骗(大家都知道cookie欺骗登录了吧,呵呵),假设我们知道这个系统的管理员的用户名为admin,那么我们只需在密码处输入的语句使它的运算结果为真就行了,这儿留给大家自己构造,当做作业吧(晕,看教程还布置作业,我可不是小学生了啊)
  coolie验证的登录原理和Session"验证的相同,只要大家构造的语句使的SQL的执行为真就行了,这是关键哟,大家可记住了!
  说到这儿,我们去实践下吧,我在自己的机子搭好了这套系统,进入后台登录,我们就在用户名处输入'or'='or',密码我就输入000,再点登录,看进去了吧。

posted @ 2008-04-18 12:13  天涯海客  阅读(1000)  评论(0编辑  收藏  举报