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控制网站服务器