使用的软件:
- Visual Studio
- ILSpy
使用的编程语言
- ASP.NET
前言
黑盒测试即在无源代码的情况下进行测试,大部分时候是凭借师傅们的经验和技术进行猜测,在测试结束后也未必能拿到代码文件进行复盘。最近也是在某几次渗透过程中,简单扒了一下代码,然后进行简单的分析,记录一下过程,从而从黑盒到白盒对漏洞产生的原因有一个认知。以下过程均未已在黑盒状态下完成测试,拿到代码后的复盘结果,但我还是从代码审计的角度来阐述,不然看起来有点像是对着答案写过程的感觉。
能力和能力有限,本篇文章主要针对以下几个漏洞点分析。
任意文件上传、任意文件下载(读取)
文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
1.任意文件上传GetShell
某高校学工管理系统某文件中存在一个upload函数,如下图所示,相信熟练的师傅已经一眼任意文件上传了,我还是简单分析如下代码中的上传步揍。
首先函数接收一个传参token,后续会使用GetTokenInfo函数解码传入的token,并将解码的数据赋值给一个UploadToken类型的uploadToken。然后通过“.”的位置从uploadToken.name中取一个后缀,这里不知道是不是程序员漏掉了,虽然取了后缀给变量houzhui,但是后续并没有对这个变量做任何的过滤操作。
根据上述的代码,所有的文件信息诸如name、size、upsize等信息都被加密在了token中。
那么我们如何构造token呢,翻找代码发现了一个tk函数,接收传参name和size,并把name+size的值进行md5加密赋值给token,最后序列化为json数据。
接下来只需要触发这个tk函数或自己构建一个token生成函数即可。我因为tk函数可以直接通过Method参数调用,直接调用tk函数,传入name和size即可。
调用upload函数,传入token,上传成功getshell
2.任意文件上传GethShell修复后利用
我将文章第一部分所提到的漏洞提交后,学校进行了修复,一下是修复后和修复前的对比。
左为修复前,右为修复后
在upload函数和tk函数中都加入了对后缀名的黑名单过滤
所谓黑名单过滤,即不允许**,当然相对应的还有白名单过滤,即只允许**
可以看到之前的payload在在这个时候已经不行了,提示“文件格式非法”
此处对上传的后缀名进行黑名单过滤,将提取的后缀名大写化,再使用Indexof函数在黑名单中寻找是否有匹配的名称。
如果如果此处不先对后缀进行大写化再进行过滤,那可以构造aSpx或者AsHx的后缀进行绕过。
此处利用Windows重命名特性(Windows不允许在确认后缀名后,出现空白后缀名,例如:123.aspx….,这样命名之后aspx后面带的….会被清除,回车完成重命名后,文件名依然为123.aspx)由于CheckFileExt函数的过滤规则是黑名单过滤,即上传123.aspx….并不会命中过滤规则,当文件落地后会被windows更名为123.aspx,从而完成后门上传Getshell
2.任意文件下载/读取
取了上半部分关键代码用QQ写了几段注释
实际上在程序有队fileName做过滤,但是过滤的是“/”,如果过滤的是"..",效果会好很多。
所以针对此处只过滤“/”的情况,可以将payload中“/”改为“\”
构造payload:..\..\web.config
之前还碰到过一个同时过滤“../../”和“..\..\”的,实际代码实现和上述代码大差不差。允许跨,但是只能跨一级目录。
碰到这种其实只要用“./”或者“.\”将两个“../(..\)”分开即可
构造payload:..\.\..\web.config