【渗透日记】黑盒测试中部分典型案例的代码分析(1)

发布于 2024-03-27  74 次阅读


使用的软件:

  1. Visual Studio
  2. ILSpy

使用的编程语言

  • ASP.NET

前言

黑盒测试即在无源代码的情况下进行测试,大部分时候是凭借师傅们的经验和技术进行猜测,在测试结束后也未必能拿到代码文件进行复盘。最近也是在某几次渗透过程中,简单扒了一下代码,然后进行简单的分析,记录一下过程,从而从黑盒到白盒对漏洞产生的原因有一个认知。以下过程均未已在黑盒状态下完成测试,拿到代码后的复盘结果但我还是从代码审计的角度来阐述,不然看起来有点像是对着答案写过程的感觉

能力和能力有限,主要针对以下几个漏洞点分析。

任意文件上传、任意文件下载(读取)

文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!


1.任意文件上传GetShell

某高校学工管理系统某文件中存在一个upload函数,如下图所示,相信熟练的师傅已经一眼任意文件上传了,我还是简单分析如下代码中的上传步揍。

首先函数接收一个传参token,后续会使用GetTokenInfo函数解码传入的token,并将解码的数据赋值给一个UploadToken类型的uploadToken。然后通过“.”的位置从uploadToken.name中取一个后缀,这里不知道是不是程序员漏掉了,虽然取了后缀给变量houzhui,但是后续并没有对这个变量做任何的过滤操作

根据上述的代码,所有的文件信息诸如name、size、upsize等信息都被加密在了token中

那么我们如何构造token呢,翻找代码发现了一个tk函数,接收传参namesize,并把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