使用的软件:
- Visual Studio
- ILSpy
使用的编程语言
- ASP.NET
前言
黑盒测试即在无源代码的情况下进行测试,大部分时候是凭借师傅们的经验和技术进行猜测,在测试结束后也未必能拿到代码文件进行复盘。最近也是在某几次渗透过程中,运气好能有机会扒了一下代码,然后进行简单的代码审计漏洞挖掘,最后提交了SRC分享出来给交加交流一下经验。
本文将主要包含以下案例
任意文件上传、任意文件下载(读取)、数据库备份逻辑漏洞、任意用户登录逻辑漏洞
文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
1.任意文件上传(一)
某高校学工管理系统某接口中存在一个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.任意文件上传(二)
再提交了上面一个漏洞后,厂商做出了修补,那这很明显是一个黑名单验证的任意文件上传
左为修复前,右为修复后


在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

3.数据库备份逻辑漏洞
这个实际上是一个thinkphp的MVC框架,但是感觉挺奇特的,值得详细说说,放进来一起写
它这里面有一个叫Database的Controller,其中index函数一进来就调用了backup和deleteBackup函数

重点观察一下backup,没有可控参数,但是不代表不能利用,同时此处也是一个未授权的功能点

可以看的出来backup函数主要的功能是将Config下的database中填写的数据库进行备份,备份位置在Data路径下
已知此处未授权,功能点可以正常调用,无任何传参,要确定此处数据库备份功能存在敏感信息泄露的当务之急就是确定备份位置Data文件夹是否可访问。一旦确定可访问,那么大概率我们能通过该功能点创建备份文件,然后下载目标的数据库文件造成泄露。

此处回显403代表该目录是在Web路径下的,那么我们可以先分析一下代码构成,确定目标具体是在Data下的什么路径
其实这里就能很明显的看出来,毕竟别人已经打好了备注。path变量负责计算一个路径,然后最后放入url中结合$file['name']和$file['part'],$file['part']应该是考虑到有多个表,通过-1、-2的方式来区分
最终路径是:/Data/{数据库名}{发包年份}/{数据库名}{发包年份日期}-{发包时间精确到秒}/{发包年份日期}-{发包时间精确到秒}-1.sql

那么稍微确定一下重要的变量值即可
$database.date('Y')
= 数据库名+年份
$database.date('Ymd-His')
→ 数据库名+精确时间(精确到毫秒)
有了上述值就可以开始构建路径
因为这里的$database.date('Ymd-His')
会获取精确到毫秒的值,这里在发包的时候需要记录一下时间,因为不知道具体的毫秒是多少,待会儿需要在这个发包时间内进行爆破

构造一下路径
Data/***************2025/***************20250415-2030{爆破后两位毫秒}
然后爆破这个路径,如果找不到路径则会返回404,找到则会返回403,注意403的值。由此可以推测出具体路径

那么拼接最终的URL
https://*****.cn/data/*******2025/*******20250415-203030/20250415-203030-1.sql
泄露将近20W的学生信息

4.任意用户登录逻辑漏洞
这一块其实没什么好说的,此处的登录login函数接收一个iswxlogin,估摸着应该是允许微信一键登录啥的功能,接收前端传输的参数,参数可控。如果iswxlogin不为空,则直接进入if调用setLoginSession函数创建Session回话登录成功。

直接可以构造payload来进行任意用户登录了,当然此处位置需要提前知晓studentid,不然登录进去会是空账号。studentid这里则是直接进行的遍历

带入返回的Cookie进入/index/home
此处可遍历所有的用户信息,泄露数十万敏感信息

Comments NOTHING