青创文章系统安全性分析
最近受到了点打击,精神恍惚,所以被请到精神病院兼职做研究工作去了,研究什么?嘿嘿,当然是被人家研究!每天都被研究很是不爽,而且好久没写Blog了,所以今天我也得来研究点东东才是。
研究对象偶找的是青创网络文章系统(QcNews),这是一套 ASP + Access 的文章系统,它的最新版是去年2月出的1.5.2.23.7.0,呵呵,看来作者好久没有更新了。
一不小心发现了几个洞洞,估计有人早就发现了的,哇,大哥啊这样你就不对了嘛,发现了漏洞不公布出来还要自己玩,那多不好,偶帮你发布了哈。
估计本文发布的时候,漏洞补丁已经出来了,使用这套系统的朋友快去打补丁吧。
另:在官方下的exe里面默认安装模式带了一个浏览器插件,不爽。
1、 任意会员登陆/资料修改漏洞
系统只是通过cookies的username值判断用户的,看代码:
if Request.Cookies("qcdn")("user_name")="" then
呵呵,但是cookies我们是可以伪造的,所以呢现在我们能够以任意前台帐号登陆了。同理,在前台用户修改资料那里也是根据cookies的username判断的,我们也可以随便修改任何人的资料的哦。
2、 SQL注入漏洞
第一个地方是用户评论那里,也就是 remarkList.asp 这个文件。 Unid 没有过滤危险字符就直接带入了 SQL 语句,直接可以用工具注射。当条件为真就会有评论,为假就没有评论,所以你得找一个有评论的文章注射。
第二个地方有点隐蔽,是在每篇文章的“推荐好友”那里( SendMail.asp 文件)。这里不可以直接注射,但是它的 Unid 会放到页面的隐藏域,当你填上好友邮箱提交的时候 Unid 就会被带入 SQL 语句,同样没有过滤危险字符。条件为真就会弹出“邮件发送失败”(因为我没有装JMail的),假的条件页面就会报错。
这个SQL注射漏洞将导致后台用户名及其 MD5 加密密码泄漏,如果密码不是很复杂,那么入侵者将很快暴破。
3、 后台普通帐户修改任意后台帐户密码漏洞
我们先看看 admin_EditPass.asp 的关键代码:
if request("method") = 1 then
Unid = Request.Form("Unid")
if Trim(Request.Form("username")) = "" then
Errmsg = "<li>请输入用户名。"
FoundErr = true
else
username = Qcdn.checkStr(Trim(Request.Form("username")))
end if
if Trim(Request.Form("pass1")) = "" or Trim(Request.Form("pass2")) = "" then
Errmsg = Errmsg + "<li>请输入密码及确认密码。"
FoundErr = true
elseif Trim(Request.Form("pass1"))<>Trim(Request.Form("pass2")) then
Errmsg = Errmsg + "<li>输入的密码和确认密码不符。"
FoundErr = true
else
password = Qcdn.checkStr(Trim(Request.Form("pass1")))
password = md5(password,16)
end if
if FoundErr then
Call Qcdn.Err_List(Errmsg,1)
Response.end
end if
sql = "Update article_admin set username = '"& username &"',[password] = '"& password &"' where id = " & Unid
conn.execute(sql)
Response.write("<script>alert(""修改成功"");location.href=""admin_EditPass.asp"";</script>")
Response.end
end if
注意 SQL 语句“"Update article_admin set username = '"& username &"',[password] = '"& password &"' where id = " & Unid”,Unid、username、password都是通过表单提交的,而且都没有验证,所以我们只要知道后台用户的 id ,然后更改密码修改隐藏域中的unid,就可以修改他的密码了。
4、 后台帐户删除网站任意文件漏洞
在后台有个“上传文件管理”功能,可以删除上传的文件。观察其 URL ,形式是:http://localhost/QcNews/admin_picmang.asp?Action=Del&FileName=2003121162475.jpg
FileName就是要删除的文件名了,文件在 Upfiles 文件夹。试试构造 FileName跳出这个目录。作者也考虑到了这个问题,所以有这样一段判断代码:
if left(trim(arrFileName(i)),3)<>"../" and left(trim(arrFileName(i)),1)<>"/" then
虽然过滤了跳出目录的一种情况,不过我们可以构造类似http://localhost/QcNews/admin_picmang.asp?Action=Del&FileName=lake2/../../index.asp的 URL 来删除任意文件。
5、 后台普通帐户直接获取管理员权限漏洞
这套系统的后台有3种不同权限的帐户:管理员、录入员、审核员。管理员有所有的权限,录入员只能发帖子,审核员审核帖子。但是作者最大的疏忽却是:录入员和审核员具有管理员一样的权限。
虽然普通帐户看不到其他管理功能的链接,但是我们直接在浏览器里面输入实现相应功能的文件地址就能像管理员一样管理了。比如说备份数据库,我以录入员登陆系统,然后直接在浏览器里输入 http://localhost/QcNews/admin_backupdata.asp ,呵呵,怎么样,可以备份数据库了哦。其他的功能亦然。
6、 后台数据库备份漏洞
嗯,从 SQL 注射到后台,现在我们可以利用数据库备份得到 webshell 了。
还是老规矩,改 asp 为 gif ,然后上传、备份。但是上传图片那里系统会首先检查文件是不是图片格式,单纯的改 asp 为 gif 是不行的了。怎么办?
你一定还记得那个把 asp 代码 copy 到一个图片文件末尾的图片 ASP 法吧,呵呵,就是传这样的图片然后备份之。
由于偶在被人家研究空闲时间有限,勉强就找了这么几个 bug ,不过足够对使用大网站造成威胁了,当然我写此文章的目的不是教大家去黑站,而是希望我们的网络更安全一些……
阁下如有什么要给我交流的,来精神病院聊聊吧,拨打电话120 找胡主席^_^