六.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
- %>
漏洞利用:用火狐插件修改成asp163=UserName=asp设置Cookies后如下图所示
漏洞修复:可以加密Cookies,后台关键文件最好用Session去验证。
七.本地文件包含(Local File Inclusion)
概述:ASP Execute方法的作用是执行一个来自于其他ASP文件内部的ASP程序。
漏洞原理:当其他ASP文件内的程序被请求执行完毕之后,控制器将返回最初发出请求的原始ASP文件。与PHP包含漏洞不同的是Execute方法只能包含本地文件。
漏洞代码:
<%Server.Execute(Request.QueryString("file"))%>
Request方法获取的参数file没经过安全处理,被Execute方法执行了。
漏洞利用:若某个应用程序不存在上传漏洞,那么攻击者可以上传个正常图片格式的文件,文件中包换ASP脚本代码,这时候就可以用本地包含漏洞去执行图片中的ASP代码。如下图所示
漏洞修复:尽量系统指定执行文件,不要让客户端提交参数,实在需要动态改变参数,可以辅助一个匹配文件,若客户端提交的参数在文件中出现,则可以执行,否则不允许继续执行
八.路径操控(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
- sUploadDirsUploadDir = 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个上级目录下,攻击者可以删除任意文件和文件夹。如下图所示
九.表单提交欺骗(Spoofed Form Submit)
概述:表单提交是当前Web应用中的重要内容,用户可以通过这种方式与服务器进行数据传递。在通常情况下,会在提交表单之前在服务器上进行表单数据的验证,这样可以节省服务器资源,但同时也为服务器带来了安全漏洞。
漏洞原理:顾名思义Web程序只是在客户端用JavaScript验证了合法性,并没有在服务端验证数据的合法性。
漏洞代码:下面以上传页面做为案例分析
漏洞利用:攻击者只需要禁用浏览器中的活动脚本和Javascript脚本就可以发动一次攻击。禁用如下图所示:
漏洞修复:客户端和服务端都要做验证,客户端做验证能提高用户体验,服务端再验证能保证数据安全。
十.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 。如下图所示
十一.代码注入(Code Injection)
概述:许多现代编程语言都允许动态解析源代码指令。 如果程序员需要由用户提供的指令对数据操作,这种情况下可以应用这种功能。当然,我们更愿意利用底层语言构造,而不是通过执行代码来解析用户输入。 由用户提供的指令预期执行一些无害的操作,例如,对当前的用户对象进行简单计算或修改用户对象的状态,等等。然而,如果程序员不够细心,用户指定的操作范围可能会超出程序员最初的设想。
漏洞原理:ASP应用程序中若存在Eval ,Execute ,ExecuteGlobal 函数使用时,要格外注意它们的使用环境,若从外部获取参数,没有经过安全处理 就会造成安全隐患。Eval() 计算表达式的值,并且返回一个结果,Execute() 执行一个或多个指定的语句。多个语句间用冒号(:)隔开 ,ExecuteGlobal() 在全局名字空间中执行一个或多个指定的语句。
漏洞代码:
<%=Eval(Request("parma"))%>
上述代码用户提交parma的方法有GET,POST,COOKIE三种,攻击者可以精心构造出ASP的小马提交就可以执行,安全隐患相当大,在源码审计的过程中要额外注意它们的使用。
漏洞利用:
漏洞修复:谨慎使用此三个函数,若需要动态执行,则只让用户输入和本地文件中匹配的字符,若不匹配则不可以执行
十二.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对象获取来的数据没有经过安全过滤,导致了经典万能密码绕过漏洞。
漏洞利用:
漏洞修复:和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
- %>
漏洞利用:
0x03 总结:
ASP经过这么多年还能屹立不倒,除了本身易学易用性之外,还有搭配的ACCESS数据库方便移植的特性,让很多程序员在选择为中小网站做开发的时候首选ASP。掌握这些ASP漏洞对于开发者来说是相当有必要的,只有这样才能写出更强大安全的应用程序,才能促进整个互联网的安全与开放
文章点评