PJBlog安全性分析

PJBlog2是PuterJam开发的一款免费的ASP + Access的个人blog系统,这几天偶想弄个blog来玩玩,经过比较选中了功能、界面都相对较好的PJBlog2。经过试用,感觉这blog还不错,也发现几个安全方面的小问题,就把我的一点点见解发出来。我分析的版本是05年12月11日发布的PJBlog2 v2.4.1211版本。

一、 密码加密算法
PJBlog2没有采用常用的MD5算法对用户密码加密,而是使用的SHA1算法。SHA1算法跟MD5类似,也是单向散列函数,不过它对任意长度的数据进行处理输出160位的数值。
PJBlog2在创建新用户的时候会随机生成一个6位的字符串Salt,用户的明文密码加上这个Salt值再进行hash才得到加密后的密码。即:Password = SHA1(user_pwd & Salt)。这样子做的好处是即使两个一样的密码hash后的结果也完全不同。这个稍微“另类”的算法给破解密码带来了点难度。
呵呵,有难度不等于不能破解,网上没有现成的程序,需要自己动手写个才是。因为.NET提供了SHA1的类所以最初用VB.Net写的,由于狂耗资源的问题一直解决不了,只好换C了。用C实现SHA1的源代码我找了好久才在一个老外的站找到,还不错,呵呵,有兴趣的可以看下老外的SHA1类:http://www.codeproject.com/cpp/csha1.asp
程序可以在这里( http://www.0x54.org/lake2/program/PJBlogCracker.exe )下载,是命令行下的,功能比较弱,单线程速度超级慢,可能还有bug,诸多问题以后再改咯。

二、 登陆认证
PJBlog2的认证方式是用的Cookies加IP。当用户登陆成功,系统随机产生一个Hashkey写入Cookies并记录到数据库中,然后通过Cookies里的Hashkey、Username还有IP来判断用户。Cookies好办,可以用跨站、下数据库等方式拿,可以这IP就难办了,看来进行Cookies欺骗的可能性很小啊。呵呵,那就不看这个咯。

三、 几个地方过滤不严
第一个就是统计访问的referer过滤不严。看:
 

代码如下:

Guest_Refer=Trim(Request.ServerVariables("HTTP_REFERER"))
         Conn.ExeCute("INSERT INTO blog_Counter(coun_IP,coun_OS,coun_Browser,coun_Referer) VALUES ('"&Guest_IP&"','"&Guest_Browser(1)&"','"&Guest_Browser(0)&"','"&CheckStr(Guest_Refer)&"')")

呵呵,只是把referer过滤后用CheckStr检查之,看CheckStr代码:
 

代码如下:

'*************************************
'过滤特殊字符
'*************************************
Function CheckStr(byVal ChkStr) 
         Dim Str:Str=ChkStr
         Str=Trim(Str)
         If IsNull(Str) Then
                   CheckStr = ""
                   Exit Function 
         End If
    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)"
    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")
         Set re=Nothing
         CheckStr=Str
End Function

过滤了单引号、双引号、连接符等,不过最重要的“<”和“>”却没有过滤。呵呵,跨站脚本攻击又有用武之地了。注意只显示前面40个字符在页面,要好好构造哦。
第二就是游客评论输入用户名也是用的CheckStr过滤,用户名数据库有限制,24个字符,这里构造CSS就更有难度了,不过可以有别的用处,具体的嘛,呵呵,后文详述。
有些blog主人禁止了游客评论,所以就只好注册后再评论了,但是注册后评论的名字文本框被设成了注册名而且只读,怎么办?呵呵,没关系,可以外部提交数据的。
再一个就是blog的留言板插件,还是用户名没过滤好,这个更难利用,只有20个字符哦。

四、 数据库的问题
PJBlog2的默认数据库名为pblog.asp,虽然数据库里面有个貌似防下载的blog_Notdownload表,呵呵,访问数据库试试,可以下载的哦。
既然可以下载,当然可以插入asp代码运行咯。有些地方(比如游客评论内容)插入asp代码会被扯开,不知道原因,郁闷。
经测试评论的姓名里是可以插ASP代码的。前面说了这里过滤不严,这样插入数据库的asp不会被显示出来的,看到的只是个没名字的家伙在唧唧歪歪,呵呵。这个可要好好构造哦,24个字符而且"被过滤了,想了一下,正好找到一个最短的,恰好24个字符:<%eval request(chr(9))%>
留言版的内容也可以插入asp代码,不过管理员看留言时看得到的哦。
呵呵,当然大多数站长应该都是改了数据库名称的,但是测试时还是发现少数人不改……

五、 上传文件
出于安全的考虑,PJBlog2限制了上传文件类型,包括asp、asa、aspx、cer、cdx、htr。其实现在很多虚拟主机不仅支持asp,还会支持aspx、php、perl的,而且也可以上传shtml等格式,所以如果既然要限制最好是把所有服务器执行文件的类型一起限制才是。
上传文件这里还有点问题,看attachment.asp里的代码:
 

代码如下:

Dim F_File,F_Type
Set F_File=FileUP.File("File")
F_Name=randomStr(1)&Year(now)&Month(now)&Day(now)&Hour(now)&Minute(now)&Second(now)&"."&F_File.FileExt
F_Type=FixName(F_File.FileExt)
IF F_File.FileSize > Int(UP_FileSize) Then
         Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件大小超出,请返回重新上传</a></div>")
ElseIF IsvalidFile(UCase(F_Type)) = False Then
         Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件格式非法,请返回重新上传</a></div>" )
Else
         F_File.SaveAs Server.MapPath("attachments/"&D_Name&"/"&F_Name)
         response.write "<script>addUploadItem('"&F_Type&"','attachments/"&D_Name&"/"&F_Name&"',"&Request.QueryString("MSave")&")</script>"
         Response.Write("<div style=""padding:6px""><a href='attachment.asp'>文件上传成功,请返回继续上传</a></div>")
End IF

保存文件的后缀是F_File.FileExt,而检查的是经过FixName()函数处理的后缀,那就看看fixname函数定义,在function.asp中:
 

代码如下:

'*************************************
'过滤文件名字
'*************************************
Function FixName(UpFileExt)
         If IsEmpty(UpFileExt) Then Exit Function
         FixName = Ucase(UpFileExt)
         FixName = Replace(FixName,Chr(0),"")
         FixName = Replace(FixName,".","")
         FixName = Replace(FixName,"ASP","")
         FixName = Replace(FixName,"ASA","")
         FixName = Replace(FixName,"ASPX","")
         FixName = Replace(FixName,"CER","")
         FixName = Replace(FixName,"CDX","")
         FixName = Replace(FixName,"HTR","")
End Function

呵呵,它把危险后缀过滤了的,如果我的文件后缀是asp(0x00)gif,那么检查的时候过滤chr(0)和asp,后缀就成了gif,通过,保存的时候就是asp(0x00)gif。从理论上来说是对的啊,我搞了半天也不行,郁闷。有知道的大侠告诉我啊。
不过我们可以利用这个上传aspx格式。呵呵,我们上传aspx文件,fixname函数过滤asp,于是后缀就成了x。只要把x设为可以上传的格式,就可以传aspx文件了。

六、 附件管理问题
管理员登陆后有个附件管理功能,看他参数类似于http://localhost/blog/ConContent.asp?Fmenu=SQLFile&Smenu=Attachments&AttPath=attachments/month_0512,可以通过指定AttPath浏览web目录的哦。
但是系统限制了站外提交数据,所以不能直接改url,那就“曲线救国”吧。找到友情链接添加功能,url就填上我们构造的url,保存,然后点查看,就绕过站外的限制了。注意构造的AttPath的第一个字符不能是“.”和“/”哦,程序有检查的。我们这样构造就可以跳到blog根目录:http://localhost/blog/ConContent.asp?Fmenu=SQLFile&Smenu=Attachments&AttPath=attachments/..

呵呵,最后还是希望大家支持PJBlog2,真的是很好用的啊。希望作者再接再厉,把这套blog系统做得更好,造福众多网民J
PS:作者真是勤快啊,补丁已经出来了,呵呵

(0)

相关推荐

  • PJBlog安全性分析

    PJBlog2是PuterJam开发的一款免费的ASP + Access的个人blog系统,这几天偶想弄个blog来玩玩,经过比较选中了功能.界面都相对较好的PJBlog2.经过试用,感觉这blog还不错,也发现几个安全方面的小问题,就把我的一点点见解发出来.我分析的版本是05年12月11日发布的PJBlog2 v2.4.1211版本. 一. 密码加密算法 PJBlog2没有采用常用的MD5算法对用户密码加密,而是使用的SHA1算法.SHA1算法跟MD5类似,也是单向散列函数,不过它对任意长度的

  • 安全技术—RSA公钥密码体制安全性分析

    引言  RSA密码系统是较早提出的一种公开钥密码系统.1978年,美国麻省理工学院(MIT)的Rivest,Shamir和Adleman在题为<获得数字签名和公开钥密码系统的方法>的论文中提出了基于数论的非对称(公开钥)密码体制,称为RSA密码体制.RSA是建立在"大整数的素因子分解是困难问题"基础上的,是一种分组密码体制.  介绍公钥密码体制(背景)  1.对称密码体制  对称密码体制是一种传统密码体制,也称为私钥密码体制.在对称加密系统中,加密和解密采用相同的密

  • CI框架的安全性分析

    本文分析了CI框架的安全性.分享给大家供大家参考,具体如下: 用过ci框架的人都知道,ci框架能大大缩短你的代码.其实,ci框架更能提高你网站的安全性. 防止对数据库的攻击 数据输入可能引发许多问题.因为 HTML 和数据库的限制,数据中总包含特定的符号-举例来说,省略符号和引号-可能导致你的数据库遭到攻击,最终得到你无法预料的结果. 解决方案是在把这些数据存入数据库前对这些数据进行相关处理.这样做会浪费一些系统时间,增加一些额外编码. CI 的表单辅助函数会自动地完成这些工作.因此,当你编写一

  • PHP临时文件的安全性分析

    一.简介 临时文件,顾名思义是临时产生的文件,且文件的生命周期很短. 然而,很多应用的运行都离不开临时文件,临时文件在我们电脑上无处不在,主要有以下几种形式的临时文件: 1.文件或图形编辑程序,所生成的中间文件 2.数据库查询时,生成的临时缓存文件,提供之前的结果数据而,以减少再次访问数据库的代价:通常用于远程数据库或远程xml的服务 3.文件被上传后在服务端的临时储存,其文件名为php的全局变量$_FILES['userfile']['tmp_name']的值 4.在http请求中,用于存放s

  • PHP中散列密码的安全性分析

    本文实例讲述了PHP中散列密码的安全性.分享给大家供大家参考,具体如下: php的基本哈希函数已经不再安全? php手册中有专门的一个部分来介绍这个问题 http://php.net/manual/zh/faq.passwords.php 很多应用,都是将用户的密码都是直接通过md5加密直接存储到数据库中的,包括我最近在用的开源项目zabbix的web管理界面. $password = "1234"; $hash = md5($password); echo $res; php常用的哈

  • Spring中如何获取request的方法汇总及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等.由于在Spring MVC中,处理请求的Controller.Service等对象都是单例的,因此获取request对象时最需要注意的问题,便是

  • 浅析ASP.NET安全性分析(加强asp.net 1.1/2.0安全性)

    ASP.NET安全性是Web 应用程序中一个非常重要的方面,它涉及内容非常广泛,不能在一篇文章内说明所有的安全规范,本文讲述如何利用IIS以及Forms 身份验证构建安全的 ASP.NET 应用程序,它是目前被使用最多最广的验证/授权方式. 本文分别以ASP.NET1.1与ASP.NET2.0在Forms 身份验证上的实现方法,以及ASP.NET2.0较上一版本有哪些改进或变化进行说明.相信读者都己经看过许多类似这样的文章,不伦是在网上或是某些专业书籍上,最近又有模式&实践小组成员发布WCF安全

  • 青创文章系统安全性分析

    最近受到了点打击,精神恍惚,所以被请到精神病院兼职做研究工作去了,研究什么?嘿嘿,当然是被人家研究!每天都被研究很是不爽,而且好久没写Blog了,所以今天我也得来研究点东东才是. 研究对象偶找的是青创网络文章系统(QcNews),这是一套 ASP + Access 的文章系统,它的最新版是去年2月出的1.5.2.23.7.0,呵呵,看来作者好久没有更新了. 一不小心发现了几个洞洞,估计有人早就发现了的,哇,大哥啊这样你就不对了嘛,发现了漏洞不公布出来还要自己玩,那多不好,偶帮你发布了哈. 估计本

  • PHP session会话的安全性分析

    从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号.信用卡事务或档案记录等.这就要求在编写代码的时候必须采取安全措施来减少攻击成功的可能性. 主要的安全措施有以下两个方面. 1.防止攻击者获取用户的会话ID. 获取会话ID的方式很多,攻击者可以通过查看明文通信来获取,所以把会话ID放在URL中或者放在通过未加密连接传输的Cookie中是很危险的:还有在URL中(作为_get()参数)传递会话ID也是不安全的,因为浏览器历史缓存中会存储

  • C语言new操作的安全性分析

    对于学习过C语言的朋友应该都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为"空指针"(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的.但是,如果你简单地把这一招应用到new上,那可就不一定正确了.我经常看到类似这样的代码: int * p = new int [MAXSIZE] if (p == 0) // 检查p指针是否为空 return -1; //other code 其实,这里的 if ( p == 0 )

随机推荐