我们直接进入正题:该漏洞位于 Example\NewsSystem\delete.asp 文件内。这是 eWebEditor 的一个测试页面,最严重的问题是——无需登录即可直接访问。查看代码便能一目了然:
' 将包含"|"的字符串转换为数组
Dim aSa vePathFileName
aSa vePathFileName = Split(sSa vePathFileName, "|")
' 从文件夹中删除与新闻相关的文件
Dim i
For i = 0 To UBound(aSa vePathFileName)
' 根据路径文件名删除文件
Call DoDelFile(aSa vePathFileName(i))
Next
那么 aSa vePathFileName 的数据来源是什么?它直接从数据库中读取:
sSa vePathFileName = oRs("D_Sa vePathFileName")
接着,D_Sa vePathFileName 是如何存入数据库的?在 addsa ve.asp(或 modifysa ve.asp)文件中:
sSa vePathFileName = GetSafeStr(Request.Form("d_sa vepathfilename"))
...
oRs("D_Sa vePathFileName") = sSa vePathFileName
注意,这里调用了 GetSafeStr 函数!看起来像是做了安全过滤。我们立即查看该函数的实现,它位于 Startup.asp 中:
Function GetSafeStr(str)
GetSafeStr = Replace(Replace(Replace(Trim(str), "'", ""), Chr(34), ""), ";", "")
End Function
坦白说,看到这个函数我几乎忍不住笑了——这分明是用于防御字符型注入的过滤函数!它仅仅替换了单引号、双引号和分号。然而,这里处理的是文件路径,路径中根本不需要这些特殊字符,因此过滤等于形同虚设。换句话说,路径没有任何实质性限制,攻击者可以随意指定想要删除的文件路径。
既然路径没有有效过滤,利用方式便极为简单:构造一个提交页面,将 d_sa vepathfilename 字段的值修改为你想要删除的文件路径(如需删除多个文件,用竖线 | 分隔即可)。例如,填入 ../../eWebEditor.asp,然后提交表单,再调用删除新闻的操作——主目录下的 eWebEditor.asp 就会立即被删除。
下面提供一个演示用的 HTML 表单,你可以直接拿来测试(注意修改 action 地址):
eWebEditor删除文件
新闻列表 | 增加新闻
增加新闻
这个漏洞单独使用效果有限,但若结合目录遍历等其他漏洞,便可形成一套组合攻击。例如,先通过目录遍历获取服务器上重要文件的路径,再利用此删除漏洞将其清除。
如何修复?
最直接的方案:彻底删除测试文件目录。同时,务必修改默认的登录密码——如果管理页面仍在线且密码为默认值,等于给攻击者敞开了大门。更彻底的做法是:直接删除整个管理页面。因为 eWebEditor 配置完成后基本不再需要改动,后台文件完全没必要留在服务器上,压缩备份到本地才是最佳安全实践。
