Web源码安全审计之ASP篇(下)

六.Cookies欺骗(Cookies Spoofing) 
概述:在只对用户做Cookies验证的系统中,通过修改Cookies的内容来得到相应的用户权限登录。Cookies欺骗在入侵中经常用到,通过修改Cookies的内容来得到相应的用户权限登录,从而达到攻击的目的。
漏洞原理:到底什么是Cookies,它有什么作用呢?Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。
漏洞代码:接下来还是以自由动力文章系统做案例,访问后台文件UploadSoft.asp必须通过授权验证,此程序通过Cookies验证造成了安全隐患。没设置Cookies之前如图所示

 

关键代码如下:

<%
if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then
        response.Write("请登录后再使用本功能!")
    else
        select case upload_type
            case 0
                call upload_0()  '使用化境无组件上传类
            case else
                response.write "本系统未开放插件功能"
                response.end
        end select
end if
%>

代码中IF语句判断有问题,如果Session和Cookies值都为空则不能继续执行,否则可以调用上传函数upload_0()。 那攻击者只需要做到满足Cookies值不为空就可以调用上传函数了,这个上传函数在上一节已经提到过存在变量继承上传漏洞,这两个漏洞一结合危害就很大了。

漏洞利用:用火狐插件修改成asp163=UserName=asp设置Cookies后如下图所示

这样就绕过了Cookies的验证,造成可以上传文件,为后来变量继承漏洞的成功实现创造了条件。

漏洞修复:可以加密Cookies,后台关键文件最好用Session去验证。

七.本地文件包含(Local File Inclusion) 

概述:ASP Execute方法的作用是执行一个来自于其他ASP文件内部的ASP程序。
漏洞原理:当其他ASP文件内的程序被请求执行完毕之后,控制器将返回最初发出请求的原始ASP文件。与PHP包含漏洞不同的是Execute方法只能包含本地文件。
漏洞代码:

<%Server.Execute(Request.QueryString("file"))%>

Request方法获取的参数file没经过安全处理,被Execute方法执行了。
漏洞利用:若某个应用程序不存在上传漏洞,那么攻击者可以上传个正常图片格式的文件,文件中包换ASP脚本代码,这时候就可以用本地包含漏洞去执行图片中的ASP代码。如下图所示

 

如果jpg里写入的ASP小马,那就可以轻松得到一个WebShell。
漏洞修复:尽量系统指定执行文件,不要让客户端提交参数,实在需要动态改变参数,可以辅助一个匹配文件,若客户端提交的参数在文件中出现,则可以执行,否则不允许继续执行。

八.路径操控(Path Manipulation) 
概述:用户输入控制 file system 操作所用的路径,借此攻击者可以访问或修改其他受保护的系统资源。
漏洞原理:当满足以下两个条件时,就会产生path manipulation 错误:
1. 攻击者能够指定某一 file system操作中所使用的路径。
2. 攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。
漏洞代码:下面以经典的Ewebeditor编辑器做分析,在编辑器文件管理处存在一个路径操控漏洞,攻击者可以指定路径的读取范围,造成安全隐患。

<%
Function InitParam()
    sStyleID = Trim(Request("id"))
    sUploadDir = ""
    If IsNumeric(sStyleID) = True Then
        sSql = "select S_UploadDir from eWebEditor_Style where S_ID=" & sStyleID
        oRs.Open sSql, oConn, 0, 1
        If Not oRs.Eof Then
            sUploadDir = oRs(0)
        End If
        oRs.Close
    End If
    If sUploadDir = "" Then
        sStyleID = ""
    Else
        sUploadDir = Replace(sUploadDir, "", "/")
        If Right(sUploadDir, 1) <> "/" Then
            sUploadDir = sUploadDir & "/"
        End If
    End If
    sCurrDir = sUploadDir

    ' 样式下的目录
    sDir = Trim(Request("dir"))
    If sDir <> "" Then
        If CheckValidDir(Server.Mappath(sUploadDir & sDir)) = True Then
            sCurrDir = sUploadDir & sDir & "/"
        Else
            sDir = ""
        End If
    End If
End Function
%>

若攻击者想利用此漏洞需要满足2个条件,第一sStyleID这个值不能为空,并且是数据库中存在的ID号。第二 sDir 这个变量没有经过任何安全处理,带入到 sCurrDir 变量中,只是最后不需要输入“/”。
漏洞利用:admin_uploadfile.asp?id=22&dir=../.. 执行后将跳转到2个上级目录下,攻击者可以删除任意文件和文件夹。如下图所示

漏洞修复:针对此漏洞建议用Replace函数过滤掉“..” 。
九.表单提交欺骗(Spoofed Form Submit) 
概述:表单提交是当前Web应用中的重要内容,用户可以通过这种方式与服务器进行数据传递。在通常情况下,会在提交表单之前在服务器上进行表单数据的验证,这样可以节省服务器资源,但同时也为服务器带来了安全漏洞。
漏洞原理:顾名思义Web程序只是在客户端用JavaScript验证了合法性,并没有在服务端验证数据的合法性。
漏洞代码:下面以上传页面做为案例分析
漏洞利用:攻击者只需要禁用浏览器中的活动脚本和Javascript脚本就可以发动一次攻击。禁用如下图所示:

第二种方法制作个HTML页面,只需将JS脚本删除,再将Action值改成需要攻击的目标网址即可。
漏洞修复:客户端和服务端都要做验证,客户端做验证能提高用户体验,服务端再验证能保证数据安全。
十.Http请求伪造(Spoofed HTTP Request) 
概述:一个比欺骗表单更高级和复杂的攻击方式是HTTP请求欺骗。这给了攻击者完全的控制权与灵活性,它进一步证明了不能盲目信任用户提交的任何数据。看到大多数浏览器会包含一个来源的URL值,你可能会试图使用Request.ServerVariables("HTTP_REFERER")变量去防止欺骗。确实,这可以用于对付利用标准浏览器发起的攻击,但攻击者是不会被这个小麻烦给挡住的。通过编辑HTTP请求的原始信息,攻击者可以完全控制HTTP头部的值,GET和POST的数据,以及所有在HTTP请求的内容。
漏洞原理:通过Request.ServerVariables 去验证数据来源的合法性,依旧不可靠,毕竟一切从Request获取的值都可以被伪造出来的。
漏洞代码:下面以ASP中经典验证来源的代码做分析

    <%
Dim From_url , Serv_url
    From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))
    Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))
    If Mid(From_url,8,Len(Serv_url)) <> Serv_url then
        Response.Write "非法链接!"
        Response.End
    End if
%>

 

上述代码中2个判断的值均来自客户端环境变量,判断思路是目标地址和来源地址的域名是否一致,不一致则认为是非法访问,这段代码常用于防盗链模块中。

漏洞利用:用法HTTP代理软件构造一个特定的数据包,在HTTP头加上Referer 。如下图所示

漏洞修复:验证数据来源的真实性还是应该放在服务端,Request变量获取的值都是不可靠的。
十一.代码注入(Code Injection) 
概述:许多现代编程语言都允许动态解析源代码指令。 如果程序员需要由用户提供的指令对数据操作,这种情况下可以应用这种功能。当然,我们更愿意利用底层语言构造,而不是通过执行代码来解析用户输入。 由用户提供的指令预期执行一些无害的操作,例如,对当前的用户对象进行简单计算或修改用户对象的状态,等等。然而,如果程序员不够细心,用户指定的操作范围可能会超出程序员最初的设想。
漏洞原理:ASP应用程序中若存在Eval ,Execute ,ExecuteGlobal 函数使用时,要格外注意它们的使用环境,若从外部获取参数,没有经过安全处理 就会造成安全隐患。Eval() 计算表达式的值,并且返回一个结果,Execute() 执行一个或多个指定的语句。多个语句间用冒号(:)隔开 ,ExecuteGlobal() 在全局名字空间中执行一个或多个指定的语句。
漏洞代码:

    <%=Eval(Request("parma"))%>

上述代码用户提交parma的方法有GET,POST,COOKIE三种,攻击者可以精心构造出ASP的小马提交就可以执行,安全隐患相当大,在源码审计的过程中要额外注意它们的使用。
漏洞利用:

若攻击者给parma参数值等于VB里的Now()函数,就会把当前的时间输出出来,这里代码用Eval函数执行的,若是Execute 和 ExecuteGlobal函数则不会输出到网页中。

漏洞修复:谨慎使用此三个函数,若需要动态执行,则只让用户输入和本地文件中匹配的字符,若不匹配则不可以执行。

 

十二.XML中的XPATH注入(Xpath Injection) 
概述:Xml文档存储数据时,若查询数据不经过安全过滤也会和关系型数据库一样,产生注入漏洞,在这里我们总结成XPATH注入漏洞,在这里它更像是ACCESS数据库。
漏洞原理: 如同Access数据库一样,XML文档只是保存数据用的,若程序对用户提交的数据没有经过安全处理,则会导致安全问题,在这里最常见的莫过于经典的万能密码。
漏洞代码:

<%
function SelectXmlNodeText(elementname,elementpass)
    On Error Resume Next
    elementname="//"&"root/row[name='"&elementname&"' and password='"&elementpass&"']"
    temp =  XMLMorntekDocument.selectSingleNode(elementname).text
    If temp <> "" Then
        Session("UserName") = "asp163"
        Response.Write("Welcome , Sysadmin")
    Else
        Response.Redirect("/admin/Login.asp")
    end if
end function  
ConnectXml("../admin.xml")
Call SelectXmlNodeText(Request("name"),Request("pass"))
%>

上述代码实现的是一个后台管理验证的功能,admin.xml文件位于站点根目录之外,无法用Http方式下载。程序对Request对象获取来的数据没有经过安全过滤,导致了经典万能密码绕过漏洞。
漏洞利用:

攻击者提交Name和Pass都是“'or '1'='1”时候,XML查询节点就变成 “//root/row[name=''or '1'='1' and password=''or '1'='1']” OR语句 发挥了重大作用,只要一个条件为真就可以满足绕过的条件。
漏洞修复:和SQL注射一样,需要对客户端提交过来的数据进行过滤,在本案例中可以过滤掉单引号即可。
十三.SQL注射(SQL Injection)
概述:目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述:
(1) 脚本注入式的攻击
(2) 恶意用户输入用来影响被执行的SQL脚本
SQL注入攻击利用的是SQL语法,这使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言标准的数据库软件包括SQL Server,Oracle,MySQL, ACCESS,DB2,Informix等以及与之连接的网络应用程序包括Active/Java Server Pages, PHP或Perl等都是有效的。当然各种软件有自身的特点,实际的攻击代码可能不尽相同。
漏洞原理: 通过客户端发送SQL语句,可以查询,更新,删除 数据库中的数据,此漏洞是ASP下最为流行的漏洞。攻击者可以通过GET,POST,COOKIE,SERVER提交任意数据,若数据库是SQL Server数据库,则漏洞危害性更大。
漏洞代码:

<%
Set rs = Server.CreateObject("ADODB.RecordSet")
sqlString="SELECT * FROM News WHERE Id=" & Request.QueryString("id")
rs.Open sqlString, Conn, 1, 1
%>

漏洞利用:

漏洞修复:对获取的数字型变量用Clng函数转换,对于字符型用Replace函数过滤单引号。
0x03 总结:
ASP经过这么多年还能屹立不倒,除了本身易学易用性之外,还有搭配的ACCESS数据库方便移植的特性,让很多程序员在选择为中小网站做开发的时候首选ASP。掌握这些ASP漏洞对于开发者来说是相当有必要的,只有这样才能写出更强大安全的应用程序,才能促进整个互联网的安全与开放。

本文转自:http://loudong.360.cn/blog/view/id/12

原文作者:合肥滨湖虎子

标签: 无
返回文章列表 文章二维码
本页链接的二维码
打赏二维码