今天早上到Pj的官方论坛一看,看到置顶主题赫然写着pjblog170重要安全补丁发布,到网上转了转找到了漏洞利用工具,实际上是一个XSS,可以获得管理员的sha1密码。有人给出了php和VBS的利用脚本,因为本地没有装php,就用VBS跑了一下自己的博客,果然爆出了sha1密码~~
然后就是按照论坛上的方法打补丁,因为之前我的代码自己改过,没有完全按照官方的来,所以不能直接覆盖文件升级,而要手动修改代码升级。共计4个文件,虽然不懂一点asp,但以前也依葫芦画瓢的改过代码,有些信心的。因为论坛上有很多人都出错,所以很小心,一口气把9页回复都看完,综合了一下意见才用Ultracompare对比新旧文件改的。不想还是出问题了,先是检测防xss的函数放错了地方,我说在emeditor里面怎么不能自动高亮呢;改好之后以为OK了,前后台都没有问题,试着发表日志时来了问题。日志发表完毕之后内容并不能写入数据库,因此返回文章时得不到文章ID,当时想着真崩溃,检查了好多地方也没找出原因,后来看了blogpost.asp里包括的文件,确定文件是出在class/cls_logAction.asp上,因为里面改的地方很多,就从服务器上把原来没改过的拉到本地覆盖再改。这一次不跟新的补丁文件对比修改了,直接按照论坛上的要求改了一个地方,保存,然后OK,将更改文件全部再传到服务器上,也没有问题,再用那个VBS利用脚本一检测,本地和服务器都没有漏洞了,这才松了口气。这前后大约用了3个小时。
附上从官网copy过来的补丁修补方法(注:适用于157-170版本的Pj):
需修改文件:根目录Action.asp
将 request("cname") 改成 Checkxss(request.QueryString("cname"))
将 request("mainurl") 改成 Checkxss(request.QueryString("mainurl"))
将 request("main") 改成 Checkxss(request.QueryString("main"))
需修改文件:common/function.asp,在文件中增加一个函数:

'防XSS注入函数 更新于2009-04-21 by evio
'与checkstr()相比, checkxss更加安全
'*************************************
Function Checkxss(byVal ChkStr)
Dim Str
Str = ChkStr
If IsNull(Str) Then
CheckStr = ""
Exit Function
End If
Str = Replace(Str, "&", "&")
Str = Replace(Str, "'", "´")
Str = Replace(Str, """", """)
Str = Replace(Str, "<", "<")
Str = Replace(Str, ">", ">")
Str = Replace(Str, "/", "/")
Str = Replace(Str, "*", "*")
Dim re
Set re = New RegExp
re.IgnoreCase = True
re.Global = True
re.Pattern = "(w)(here)"
Str = re.Replace(Str, "$1here")
re.Pattern = "(s)(elect)"
Str = re.Replace(Str, "$1elect")
re.Pattern = "(i)(nsert)"
Str = re.Replace(Str, "$1nsert")
re.Pattern = "(c)(reate)"
&
nbsp; Str = re.Replace(Str, "$1reate")
re.Pattern = "(d)(rop)"
Str = re.Replace(Str, "$1rop")
re.Pattern = "(a)(lter)"
Str = re.Replace(Str, "$1lter")
re.Pattern = "(d)(elete)"
Str = re.Replace(Str, "$1elete")
re.Pattern = "(u)(pdate)"
Str = re.Replace(Str, "$1pdate")
re.Pattern = "(\s)(or)"
Str = re.Replace(Str, "$1or")
re.Pattern = "(\n)"
Str = re.Replace(Str, "$1or")
'———————————-
re.Pattern = "(java)(script)"
Str = re.Replace(Str, "$1script")
re.Pattern = "(j)(script)"
Str = re.Replace(Str, "$1script")
re.Pattern = "(vb)(script)"
Str = re.Replace(Str, "$1script")
'———————————-
If Instr(Str, "expression") > 0 Then
Str = Replace(Str, "expression", "e", 1, –1, 0) '防止xss注入
End If
Set re = Nothing
Checkxss = Str
End Function
修改文件:class/cls_logAction.asp
找到:

oldcate = request.form("oldcate")
oldctype = request.form("oldtype")
替换为:

oldcate = Checkxss(request.form("o
ldcate"))
oldctype = Checkxss(request.form("oldtype"))
修改文件:GetArticle.asp
找到:

替换为:

转载请尊重版权,出处:秋天博客 本文链接: https://www.cfresh.net/web-security/243