E创网络CMS代码审计过程分析

正好最近对代码审计比较感兴趣,因此写个看代码找漏洞的过程。
代码审计我也是初学,还未入门,我只是希望找到如下漏洞(文章内容讲的很多不是专业术语,比较口语化,大牛别介意:) ):

常见问题

  • 命令执行 比如php的system等函数
  • 代码执行 比如 eval这些函数
  • 文件操作 目标是获得webshell

上传、文件修改、文件读(下载)、文件列举等问题

  • 权限判断 越权操作 往往是危害比较大
  • 水平和垂直权限提升,cookie欺骗绕过验证。
  • sql注入 根据sql命令关键字 进行搜索

所有进入到sql中的变量(直接输入或者多阶注入)

  • xss 这种基本上不再考虑范围内了,我不会用…
  • 逻辑漏洞 这种比较难于发现

其它问题

  • 暴力破解
  • 破坏性的攻击 导致当机 有些时候也是非常危险的
  • 配置问题
  • 错误信息未屏蔽

由于只能看懂点asp代码,因此找一个asp的一套程序:(E创网络出品的代码)

      学习几天,发现目前的源码审计都是搜索危险函数,好像还没有见过那种动态执行的源码审计工具,如果就是搜索函数。
那就是在文件中搜索字符串了,这个我会notepad++这个工具不错呀,但是搞了一会发现,不如人意,notepad++好像只能搜索一个字符串,不能批量搜索,这有点麻烦,而且有点盲目,坐在电脑前想了半天,觉得还是自己写个搜索字符串的吧,可以根据指定的字符串(正则)列表,在一个文件夹里面搜索所有符合的。

因此首先要有个列表,但是怎么搞出来列表呢? 那要根据漏洞产生的原因来搞吧…

  • 能够产生漏洞的就是用户输入吧(一切输入的都是有害的).
  • 关键函数对应的关键操作(一切进入函数的输入都是有害的,多阶输入)

基于以上两点我想了半天整理出来一个列表:

暂时就想到这些,以后再补充吧,这里很好理解了,我使用#做分隔符,前面是要匹配的变量,后面是说明。

      有了列表就需要一个工具,根据列表去匹配了。好像有人写过,但是我感觉还是要自己写好点,以后改起来容易。也锻炼一下写代码,为了以后找一个好点的工作…

使用c#简单写了一个粗糙的界面:

基本功能:

  • 从文件中读取待匹配列表
  • 可以选择一个文件夹,遍历所有文件,然后进行匹配,挑选出,所有满足的结果
  • 可以指定匹配的文件后缀,比如asp cms我就不用去匹配php后缀了吧,而且很多图片文件也不需要匹配
  • 可以只查找一个关键字,(有两种模式,一种是匹配,一种是不匹配)主要原因,当我们只要一个文件做权限检查的时候,如果一个文件夹下有一个文件未包含该文件,那就是未授权访问了,这点其实是很好。至少我这么想的。

基本上就想到这些,开始了…经过数天,修修改改,终于可以用了,离好看还有十万八千里…

测试一下,选择下载的源代码,和上面的字符串列表:

11

获得如下结果。然后我就开始看…。发现有问题,代码执行那个里面都是js的eval悲剧了(只能忽略)一个文件上传,但是没有服务器处理文件悲剧了。在看看输入input吧。

13

选择notepad++打开,(因为我没有写出来它的那个选择高亮功能哎)

14

发现里面包含好多的include,仔细一看是验证吧,判断用户是否登录。Chkuser.asp源码如下:

15

获得cookie中的用户名和密码:而且用户名使用checkstr进行了处理,将单引号进行了转义.虽然password没有被处理,但是并没有进入到查询语句,因此不能注入绕过了。

有权限绕过的都是后台功能,对于我来说,怎么从前台搞进后台才是关键,因此,首先应该看那些没有做权限检查的页面是否存在漏洞。即不包含include file=”chkuser.asp”这个的代码。

一、cookie注入

因此重新配置:

16

 

查找所有.asp文件不包含checkuser.asp的文件。即查询所有前台页面。很快结果出来了:

18

开始查看,打开文件才发现好悲剧,原来我下载的是测试版,好多页面都没有内容哎,悲剧的要命,但是不能放弃,在搜索的列表中看一下。

19

当访问到ChkManageLogin.asp时,使用notepad++打开,发现问题了。

 

从上面的代码很容易看出来,Request.cookies(eChsys)(“username”)未作任何过滤导致cookie注入,但是前面有一个验证码,要想注入需要通过验证码验证才可以。使用session保存验证码的,而且验证出错与否并没有更新验证码,就是说明只要我浏览网页抓到一次验证码,那么我下次继续访问只要带上cookieid就是可以保证session中的验证码是正确的,因此就可以验证通过。验证码问题解决了。

如果验证成功后直接跳转找admin_index.asp,但是改页面被加密了。真是不厚道,还得搞个解密工具,解密后如下:

20

解密之后发现这个页面更直接,cookie注入太明显了,而且都没有了验证码限制,如果sql执行失败,就会跳转到login.asp页面,如果执行成功就不跳转,根据这点就可以搞定了,可以确定sql执行是否成功。一个盲注点。由以上两个注入点中的任何一个就可以获得管理员的用户名和密码了。还有一个问题就是cookie前缀,发现访问login.asp就泄露了cookie前缀。

万事具备了,只欠东风。就是一个猜测用户和密码的工具了。都想想完全猜测真的好麻烦,继续看代码发现还有这样一个页面

E_alluser.asp,会把所有的注册会员显示出来,唉得来全部费工夫,知道了用户名,就只猜测对应的密码就可以了。由于表结构等都已知很容易写出来猜测密码的小程序如下所示:

21

二、cookie欺骗绕过身份验证

但是密码都是md5加密的,如果破解不出来密码那岂不是悲剧,因此看一下程序的验证方法。还是两级验证,两个验证文件。Chkuser.asp和ChkManage.asp两个代码基本类似,只是判断表名不同,一个是普通用户,一个是管理用户验证。

可以看出,其实就是从cookie中获得值,用户名和密码,而且用户名进行了处理导致无法注入,根据用户名查询获得对应的密码,这个密码是md5加密的,跟提交的cookie中的密码进行比较如果相等,就通过了验证,这说明根本就不用破解md5,就可以了,太好了可以省一角钱。

三、文件操作获得shell

进了后台往往不是最终目的,一般都是为了去获得一个webshell。因此我们的目标就是查找有文件操作的地方。

其实分为几类:文件上传,文件修改,文件备份等。大家都懂这里就不多写了,很容易就可以搞到shell利用后台的db_compact.asp文件。

四、结束

末了,洞主成功演示了使用编写的工具获得网站管理员账号和加密密码,并且发现此系统使用量还是很大的,批量XXX的同学有福啦!

91ri.org小编语:这个漏洞的整个过程思路清晰,很适合刚开始接触代码审计的同学观看的。洞主的查找字符串工具功能类似“search and replace”这款软件,功能很强大,同样支持正则、文件夹匹配等功能。洞主发现的javascript的eval函数,可是去尝试是否存在用户输入被输出在当时的js环境中,eval可是xss漏洞成因的一个因素。由于小编不懂C#,如果是用PHP来写的话,exp可以使用一个中转脚本注入来测试洞主的cookie注入点也是可以的。

本文为转载文,但是文章分析详细,较优秀的代码审计科普文。根据本站积分规则给予日币奖励共1枚。

[via@在路上]