0x01 起因
在一次授权项目当中遇到的,感觉还是挺有意思。写个过程记录一下。看代码找漏洞还是很有趣的。特别是自己不熟悉的开发语言。万法归一,思路和其他开发语言都差不多,在这里分享一下我的思路。
0x02 过程
扫目标端口发现一个特殊的端口,打开后发现存在列目录漏洞。目录内文件如下,service.aspx是我添加的。除去这两个文件好像没啥利用的。看到有个asmx接口,于是好奇打开看了看。
打开后存在两个接口。似乎也没啥利用点
回过头发现目录下有个App_Code.zip压缩包,App_Code是.net平台下类的存放位置,接口调用的实现代码会不会放在这里么呢。下载下来看看。nice、运气不错,看来这应该是接口的实现代码和调用类,那么就进入到我稍微擅长一丁点的代码审计过程了。先打开WebService2019看看代码
我们先来看Web_SubString函数的逻辑,很简单,先调用CsSubDes.DESDeCode方法对传进来的数据进行解密。意味着如果我们要调用下面的函数得先加密我们传入的值,使其满足解密过程。解密之后再调用CsPublicSub.SubProcessSqlStr方法来清除非法字符,从字面上来看应该是过滤SQL注入关键字一类的,这是否意味着我们需要绕过这个函数呢,继续往下看
可以看到下面就进入具体的实现函数了。
随便找了个函数跟进去全是拼接SQL语句,看起来有戏。
那么我们回到最开始,先来解决加密的问题,我们来看看解密函数中是否有加密过程可以直接调用。运气不错,直接提供了一个CsSubDes.DESEnCode函数,那么我们直接调用它加密我们的值就行。由于不熟悉.net开发,写这一段小小的代码踩了不少坑,不过问题不大。
能正常构造数据以后我们来到第二个拦路虎,CsPublicSub.SubProcessSqlStr函数,根据之前的猜测我们跟进去看看
果不其然是过滤sql关键字,我们看看这段代码是否无懈可击呢。通过正则可以看到并没有匹配大小写,那么通过大小写是可以绕过正则的,但是事情没有那么简单,继续看发现使用了new Regex(str_Regex, RegexOptions.IgnoreCase); 用了IgnoreCase这个参数,通过查阅信息了解到使用这个参数在匹配时是不区分大小写的,意味着我们无论传入大写小写都会匹配出来关键字。好像并没有什么好的方法可以绕过这个过滤函数了(个人见解,这里应该是有一些办法可以绕过的)。
那么怎么办,只能硬着头皮继续看,寻找转折点。这时候我想起好像还有个方法,我们来看看这个方法咋写的
看到逻辑后吁了一口气。Web_SubStringA方法并没有用解密方法和过滤方法来过滤值,这里直接可以传值进入存在漏洞的一些相关逻辑函数,那么我们长驱直入,直接调用sub000试试
看起来应该是调用成功了,为何没有数据回显呢,试试延时函数 WAITFOR DELAY ‘0:0:20’— 但是返回时间还是10秒,继续尝试了几次,一直返回10秒左右。怀疑有两种情况,1.注入失败 2.数据库连接失败。但是根据代码逻辑看这里百分百是存在注入的,那么就剩下第二种可能性了,数据库有问题。之前我们是下载了App_code里的所有源码,那么数据库配置信息也一定在里面,我们跟进去看看。
数据库配的是个外网IP,ping了一下没通 ,telnet了1031端口也是关闭,怀疑数据库已经关闭或者废弃。那么数据查询功能肯定是不可用的。前面一堆工作白干了,这时候想这个接口是否会提供一些文件上传和下载的服务呢,其实为了getshell一开始就应该找这些点。挨个看了下函数
跟进SubUpLoadImage看看
可以看到逻辑很清晰,先对值进行base64解码,然后判断文件夹是否存在,是否有同名文件之类的,然后就写入文件了。全程无过滤。很明显这里可以上传任意文件。我们构造一下请求试试
成功getshell
同理,调用901对应的SubDownLoadImage函数也可以下载任意文件
0x03 结语
很简单的一个实战过程中挖漏洞的一个小过程,没有什么奇淫技巧,胜在真实。但是过程却是很有趣,个人非常享受每次在实战时解决各类问题的过程,能够学习很多知识。通过这种以小见大的方式踏寻安全的未知之旅。
最后再附上一句我很喜欢的话,与诸君共勉
我不敢下苦功琢磨自己,怕终于知道自己并非珠玉;然而心中又存着一丝希冀,便又不肯甘心与瓦砾为伍。 —— 中岛敦《山月记》