今天无聊来看看他们的站,打开网站 asp 的企业站 ,点了几个链接看了下,看不出来什么程序 于是扫扫目录 扫出来个 upload_photo.asp 这个文件一般使用的是无惧无组件上传 ,存在双文件上传的漏洞 ,尝试 cookies 欺骗绕过登录检测 遗憾的是不行 看来这个洞被补
今天无聊来看看他们的站,打开网站 asp 的企业站 ,点了几个链接看了下,看不出来什么程序 于是扫扫目录 扫出来个 upload_photo.asp 这个文件一般使用的是无惧无组件上传 ,存在双文件上传的漏洞 ,尝试 cookies 欺骗绕过登录检测 遗憾的是不行 看来这个洞被补了。。虽然是老程序 ,但是用了这么多年 ,经过无数次被黑之后 一些洞洞也被补的差不多了。。去网上找了个差不多的企业站程序下载下来研究了下 ,发现其 downloadshow.asp 的防注入是通过 check_sql.asp 文件来实现的 ,好的我们来看看这个程序 看看能不能绕过 ,本地搭建了个测试环境,下面是check_sql.asp 的内容
<%
Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name
'------定义部份 头----------------------------------------------------------------------
Err_Message = 1 '处理方式:1=提示信息,2=转向页面,3=先提示再转向
Err_Web = Err.Asp '出错时转向的页面
Query_Badword='∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)∥=
'在这部份定义get非法参数,使用∥号间隔
Form_Badword='∥%∥&∥*∥#∥(∥)∥= '在这部份定义post非法参数,使用∥号间隔
'------定义部份 尾-----------------------------------------------------------------------
'
On Error Resume Next
'----- 对 get query 值 的过滤.
if request.QueryString<> then
response.write QueryString : & request.QueryString &
Chk_badword=split(Query_Badword,∥)
FOR EACH Query_Name IN Request.QueryString
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))<>0 Then
response.write request.QueryString(Query_Name) & 出现关键词 & Chk_badword(i) &
Select Case Err_Message
Case 1
Response.Write 传参错误!参数 &name& 的值中包含非法字符串!\n\n请不要在参数中出现:and update delete ; insert mid master 等非法字符
Case 2
Response.Write
Case 3
Response.Write
End Select
Response.End
End If
NEXT
NEXT
End if
'-----对 post 表 单值的过滤.
if request.form<> then
Chk_badword=split(Form_Badword,∥)
FOR EACH name IN Request.Form
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.form(name)),Chk_badword(i))<>0 Then
response.write request.form(name) & 出现关键词 & Chk_badword(i) &
Select Case Err_Message
Case 1
Response.Write 出错了!表单 &name& 的值中包含非法字符串!\n\n请不要在表单中出现: % & * # ( ) 等非法字符!
Case 3
Response.Write 出错了!参数 &name&的值中包含非法字符串!\n\n请不要在表单中出现: % & * # ( ) 等非法字符!
End Select
Response.End
End If
NEXT
NEXT
end if
%>
可以看出其对GET请求发送的参数 过滤的非常的严格 ,但是对于POST发送的参数却只过滤了几个符号 ,这个很好绕过的 ,但是downloadshow.asp 只接受GET 发送过来的参数啊 ,这该如何绕过?这里就要使用 asp 和 aspx 的Request对象的包解析漏洞,即像下面的形式发送的内容 ,使用 request对象仍然可以获取正确的值
GET /Downloadshow.asp HTTP/1.1
HOST:XXXXXXXXXXXXXXXX
Content-Length: xx
Content-Type: XXXXXXXXXXXXXXXXXX
ID=111
然后 downloadshow.asp 中 使用request(ID)仍然可以获取正确的ID值 ,和直接 GET /downloadshow.asp?ID=111 的效果是一样的,但是这样的话 对于上面的那个 sql 注入检测程序 ,却会把这样的数据当作是POST提交的数据 ,再加上不到位的检测 ,sql注入漏洞就产生了,如下图所示: