前言:
此漏洞来源于先知社区某DL的代码审计,由于他不小心漏点了,导致我能跟在后面复现也一起分析一下
拿到源码后,反编译.net相关语言的工具我们常见的有Net Reflector (收费) ILSpy/dnSpy(免费)
我们随便选择一个用就好了
WEB应用程序会把我们写的代码编译为DLL文件存放在Bin文件夹中,在ASPX文中基本就是一些控件名,所以需要反编译他的DLL来进行审计
一般审计的时候思路会是先找找有无Upload的功能,于是找到了AJAX/upload.ashx这个文件
打开后发现存在发现class给出了为NewWeb的ajax.upload下
这里值得一提的是Class和Inherits都是引用DLL的意思。
在bin目录下找到该文件,拖入dnSpy里
找到processRequest,知道了调用的方法为action=方法名
任意文件上传没找到,倒是找到了别的漏洞
1、任意文件删除
首先是在deleteAttachFile和deleteBackground中存在任意文件删除,获取Name参数,然后判断是否存在,如果存在,调用Delete方法进行删除。
跟进file.delete,发现调用的是FileSystem.DeleteFile方法,这方法为aspx删除文件的自带方法。
但是这里找网上测试payload失败了,可能是因为权限原因吧
2、下载文件处的注入1
DownLoadFieldAttch方法下的获取trueFileName直接带入Sql语句中进行查询,如果查到不为空,那么进入下一步再进入getFileName寻找路径进行拼接,然后下载指定某些路径下的文件
非常明显的注入
3、登陆口的注入2
在Ajax/AjaxMethod类进入时,有方法processrequest获取请求,然后进入callMethod方法下
CallMethod方法的第72行会获取一个getEmpByname值进入getEmpByname方法,并将name进行一次base64带入其中
对方法进行跟进,可以看到又是一个简单的注入,使用{0}将传入的参数带入其中,并将其进行大写转换。
4、随机寻找的sql注入3
Ajax.AjaxMouldSet.TreeLoad方法
传入两个参数,并且第二个参数id经过一层处理,使用split以~的形式来对其进行切割,否则会进行报错,然后再将MouldId直接带入sql查询语句中,很显然的一个注入。
5、忘记密码处注入
在根目录下有一个文件叫做Initpwd.aspx
ok看代码,可以看到在加载这个页面的时候会先UserCookie参数里进行json Decode,获取值loginuser,如果loginuser有值,那么就不set cookie,否则自己给他set一个cookie
接下来看Initpwd.aspx里的代码,可以看到修改密码的时候,传入的值post到了/AJAX/AJAXMethod.ashx里
抓包如下列代码所示
POST /Ajax/AjaxMethod.ashx HTTP/1.1
Host: xxxxxx
Content-Length: 27
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,th;q=0.5
Cookie: ASP.NET_SessionId=q0xtxrgv1bgt0kgzteowzchw; UserCookie={"haschangeEmpid":"1","haschange":""}
Connection: close
action=confirmpwd&oldpwd=aa
跟进confirmpwd方法中,可以看到getCookieValue获取haschangeEmpid的值赋值给cookies,
然后将cookies赋值给empidnow,
接着将其带入sql语句中进行查询 select * form bfemp where empid=’”empidnow …..
产生了Sql注入。
总的来说,这个CMS存在非常多的注入。 未完待续。。。
XSS
xss的代码其实非常简单,关键点在于两个
response.write(param)和request(param),只要param参数可控且直接通过write直接输出,那么就是个XSS,简单的代码示例如下
修复前:
<%
xss=request("xss")
response.write(xss)
%>
修复后:
<%
xss=request("xss")
xss=Server.HTMLEncode(xss)
response.write(xss)
%