当前位置:主页 > 曾道人救世网 >

ZZCMS v82 代码审计

发布时间:2019-10-24   浏览次数:

  大家好,我是kn0sky,在此我将把我这一次进行的代码审计的发现与收获都记录分析分享一下,笔者初入代码审计不久,审计的方法也比较新手,本文有点倾向于面向代码基础薄弱的童鞋,如果有什么做的不好的地方或者有什么更好的建议,希望大家能够指出,欢迎大家与我私信交流,在此提前谢谢大家啦~

  这次在代码审计前,我了解到要学会追踪数据的流向,这有助于更好的理解漏洞形成的原理,这次我的审计策略是:

  这里先分享一个小技巧:当我们要测试sql注入的时候,通过实时查看mysql的日志可以帮助我们更方便的看到sql语句是否成功执行,下面简单讲解一下实时查看日志的操作流程:

  这样一来,每当执行sql语句之后,这个窗口都会实时显示sql执行情况,如果sql语句报错,则不会显示在日志中,这样来研究测试sql注入就方便多了

  这里验证码通过POST方法提交给logincheck.php页面,该程序处理验证码逻辑的流程非常简单就一行

  依然表达的非常简单,如果验证码和环境变量中的验证码不一样就弹提示框和退出

  这个环境变量是怎么来的呢,我们来看看生成验证码的页面code_math.php这里我省掉了一些无关的代码,我们来看关键部分:

  调用getCode函数的时候,会生成一个验证码的环境变量当我们点击刷新验证码的时候,才会调用此函数

  综上所述,我们可以得出结论:只要我们不刷新验证码,通过Burp拦截包,输入一个正确的验证码之后,可以一直使用该验证码进行发送各种请求

  这里通过getenv获取指定HTTP头信息,通过strcasecmp来进行字符串比较,如果指定HTTP头的长度比字符串unknown大,就返回0的值,然后直接赋值给变量ip

  程序将sql语句代入查询,如果查询成功了,则提示15分钟禁止登录,然后退出程序(showmsg函数会执行exit操作)如果我们再次发送登录请求呢,程序依然会进行sql查询ip登录次数,所以我们构造XFF头进行sql注入不受影响,sql执行报错也不会回显,但通过观察mysql日志可见sql语句确实执行了至于要如何利用,那就要看你的创造力了

  进行登录的时候,因为加了单引号引起sql语句报错,ip登录次数等信息就不会被记录到数据库,所以返回的页面信息一直不变,如下图所示:

  因为sql语句报错(sql报错不会出现在log信息中),所以没有返回结果,不会触发退出程序的操作,所以登录操作的查询依然会进行

  将验证码逻辑漏洞+sql语句报错导致可以无限进行登录的逻辑漏洞进行组合使用,这里可以进行账号密码爆破,当账号密码对了,就会返回一个不一样页面

  这个页面有一个功能,保存设置,当我们输入完成相关的设置之后,点击保存即可,保存请求会发送给siteconfig.php页面我们来看一下保存设置相关代码,可设置的内容很多,然而实际上能用得上的很少以下是保存设置的代码,中间我省略了一些无关的参数过滤的部分

  首先打开文件,然后将参数加到变量$fcontent里,然后作为常量保存到文件里,这里不涉及数据库,不存在SQL注入的问题

  主要我们能够有效控制的参数一部分来自基本信息设置,另一部分来自图片上传功能网站基本信息设置:

  这里除了网站统计代码,全都只是过滤了首尾的空格,我本来以为这里会有很多存储型XSS呢,结果发现,在这些常量被引用的地方,常量被当成字符串进行输出,所以不存在XSS,除了网站统计代码这个地方我们来看一下网站统计代码的过滤源码:

  去反斜杠,将尖括号转换成html实体,单双引号转换为空字符,看起来过滤很严格嘛

  这里程序又自己把尖括号给加上了,所以这里array的几个常量如果可控的话,都有可能变成一个标签插入网站中

  这一块信息设置除了网站统计代码那里,还有一个地方比较有趣,那就是网站logo地址这里我们可以自己上传图片,也可以输入网址引用网络图片例如:

  我们来看一下网站对logo地址进行处理的几个代码首先,当我们保存好logourl之后,打开主页的时候,网站会对logourl进行如下处理:

  当我们请求网站主页的时候,浏览器就会向这个图片的地址发起GET请求,我们将这个图片地址换成其他地址也一样:

  (居然在注释里写绕过方法,第一次见。。。。)这里可通过加文件头GIF89A上传图片木马,我不知道该能不能绕过扩展名检测,扩展名经过统一大小写处理取第一个.后面的内容获得,大小写绕过,00截断,pht后缀,都没用,希望有经验的大佬可以指点一二

  这里不管是新增还是修改,富文本编辑器的内容都会被HTML实体编码直接存入数据库,这里以展会信息管理为例,我们点击富文本编辑器的源码按钮,写入测试payload:

  其实除了这一个地方,在该页面上的其他信息发布的富文本输入框里也均存在此问题

  这个重置密码有两种方式可以实现,修改POST请求,和修改验证码检查响应包

  我之前注册了个账号test,密码是1111我现在突然忘了密码是1111,要去找回密码当我完成第一步的时候,点击下一步,我抓包看到请求是这样的:

  提交参数step为step1的请求的时候,网站会把用户名装到$_SESSION[username]里,然后检查一下其他信息

  这里我用的邮箱是编造的,自然不会收到邮件,当然,好像虚拟环境也没装发邮件的服务

  输入验证码正确了,founderr=0,否则等于1当founderr为0时,返回yes到前端,为1时,返回no到前端

  输入完信息点击下一步之后,Burp拦截数据包,将数据包发送到Repeater模块中备用,然后再发送当前拦截的数据包进入下一阶段

  这个时候我们回到Repeater模块中,将数据包里POST提交的参数进行简单的修改:

  至于为什么要先进入第二步再发包,因为进入到第二步的时候,服务器才会把用户名存到变量中,然后请求第三步让服务器改这个用户名的密码

  在注册页面,当我们输入一个用户名的时候,河北二级建造师合格分数线下调!合格标准重新发布!。会发送一个检查用户名是否被注册的请求:

  用户登录页面,这个登录请求和后台登录页面的请求是一样的,所以后台登录存在的问题这里也都存在,详情见文章开头

  在普通用户登录之后,会进到用户中心,左边那一栏有个群发消息功能,点击邮件/短信内容设置

  这时候我们会看到这个短信内容模板的富文本编辑框,我们随便输入点啥然后点击提交通过拦包我们可以发现,这个请求发给了msg.php文件

  当我们点击提交之后,我们提交的内容存在info_content参数里,这个参数被直接赋值给了$content变量,紧接着$content变量被直接带入sql语句执行

  我们来看看我们构造sql语句看是否能正常执行我们发送一个正常的参数(),然后查看mysql的日志:

  可见,数据库执行了插入操作,数据库执行报错的操作不会显示在日志里,我们构造一个会报错的参数(666′),然后查看日志:

  由此可见,加上单引号之后,sql语句报错,没有执行成功我们构造参数为66666666′)#再来验证一下,日志如下:

  普通用户登陆进去后的会员中心还存在一些小漏洞,这里就不一一列举了,有兴趣的童鞋可以自行探索交流

  SQL注入我本来想用DNSLOG注入来验证的,但是我发现通过tail -f命令去查看mysql日志更方便,所以就偷懒没用DNSLOG注入了

  不论是XSS还是SQL注入漏洞,皆来自对用户输入的过滤不充分,甚至有些地方都没有任何过滤,这个CMS在某些业务逻辑上也出现问题很大的漏洞,我前段时间在网上见到过这么一句话:“知识面决定攻击面,知识链决定攻击链”,光发现漏洞的存在是远远不够的,还需要思考实践漏洞是如何利用的,能用来做什么,会造成多大危害等问题

  所谓努力,是每一天的积累;所谓成长,是每一天的思考;在这次历时三天的代码审计练习中,虽然审计出来的漏洞很基础,但是收获很多,从刚开始看到这么多代码不知如何下手,到渐渐思考审计的思路与方法,也许,成长,就在于这一点一滴的思考中,在实践中思考,在思考中实践,逐渐积累经验,重视基础知识;学习最重要的不是效率,而是坚持,其次才是高效,哪怕走得很慢,也要不断前进啊,在过程中我们也许就会逐渐发现自己的问题并逐一改正,不浮躁,静下心慢慢来,不断迭代学习方法、思考方式,逐渐找到那个独一无二的自己。

Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms

东方心经波色| 免费最准平特四连肖| 香港马会挂牌彩图| 香港马会正版挂牌| 白小姐旗袍正版图纸| 九龙老牌图库彩图大全| 小龙人高手心水论坛| 小鱼儿心水论坛| 自创特马公式规律| 香港摇钱树发财富网站|