通達OA前台任意使用者登入分析

2022-09-15 12:21:12 字數 4020 閱讀 2600

最近爆了個通達 oa 任意使用者登入漏洞,正好分析分析,順便師傅一起學習。

首先我們找到檔案根目錄的檔案logincheck_code.php,這個檔案是沒有許可權驗證的。

我們會發現在 180 行附近有兩行**:

$login_uid = $uid;

$login_user_id = $user_id;

...$_session["login_uid"] = $login_uid;

$_session["login_user_id"] = $login_user_id;

驗證登入時就是判斷的這兩個session

往上翻翻$uid哪來的:

可以發現是直接從$_post中獲取的,也就是任意控制即可。

但是15行附近有個判斷,如果快取裡沒有code_login.$codeuid$codeuid也是可以任意控制的) 就退出程式了,我們可以全域性搜尋一下這個快取在**設定了。

很快找到一處:ispirit\login_code.php

<?php 

include_once "inc/utility_all.php";

include_once "inc/utility_cache.php";

include_once "inc/phpqrcode.php";

$codeuid = $_get["codeuid"];

$login_codeuid = td::get_cache("code_login_pc" . $codeuid);

if (empty($login_codeuid))

$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);

//將 codeuid 存入快取

td::set_cache("code_login_pc" . $login_codeuid, $login_codeuid, 120);

//輸出 codeuid

echo json_encode(td_iconv($databacks, myoa_charset, "utf-8"));

echo "\r\n\r\n\r\n";

?>

這裡給重要的三句話寫了注釋。我們只要直接訪問一次這個檔案就可以偽造了。

首先訪問一次/ispirit/login_code.php

存下這個codeuid。然後訪問/logincheck_code.php

uid設定成1,這個id預設是管理員。然後codeuid設定成:_pc+codeuid

隨便訪問個需要驗證的url/pda/main.php

一樣的思路,我們全域性搜尋會找到在檔案\ispirit\login_code_check.php處有類似的**:

我們往上翻:

會發現$uid來自$code_info$code_info又來自快取code_info_pc+$login_codeuid

這裡的$code_info[type]需要等於confirm.

再上面一點有這樣的**:

//$codeuid 可控

$login_codeuid = td::get_cache("code_login_pc" . $codeuid);

這裡和之前一樣得。

然後我找找**有設定code_info_pc的**,在檔案general\login_code_scan.php

可以發現這裡的codeuidtype都是可控的。現在就可以利用了。

首先訪問/ispirit/login_code.php獲取codeuid

訪問/general/login_code_scan.php提交post引數:

source=pc&type=confirm&codeuid=&uid=1&

最後訪問/ispirit/login_code_check.php?codeuid=***

這樣$_session裡就有了登入的資訊了。

第一處修復logincheck_code.php

這裡從redis中獲取了資料,判斷了$uid不等於0的話才能下一步,相當於做了個許可權驗證吧。

如果我們能找到一處設定oa:authcode:token:***的地方,或者找到一處可以控制鍵值的快取,即可繞過。

第二處修復\general\login_code_scan.php

在設定code_info_pc前進行了許可權驗證,這裡根據傳入的session查詢此session是否登陸過,如果沒登陸過就退出程式

這個漏洞其實挺簡單的,但是到現在才發現,看來挖掘這樣的洞更需要一些耐心和細心。由於這個程式用了全域性覆蓋,我們可以直接覆蓋_session裡的資料,但是_session是存在redis中的。所以如果有一處先開啟session_start然後引入了session.php檔案,即可直接覆蓋_session裡的資料。

通達OA的前台任意使用者登入漏洞

提一下那個poc 通達 oa 任意使用者登入漏洞 首先我們找到檔案根目錄的檔案logincheck code.php,這個檔案是沒有許可權驗證的。我們會發現在 180 行附近有兩行 login uid uid login user id user id session login uid login...

通達OA任意使用者登入

漏洞簡介 在 logincheck code.php 檔案,變數 uid 為攻擊者可控,攻擊者可改變 uid 引數,從而控制該 sql 語句返回 user 表中指定 uid引數的使用者資訊,便可通過偽造引數來達到登入任意使用者的目的。該漏洞可獲取任意使用者session,包括系統管理員 影響版本 通...

漏洞復現 通達OA前台任意使用者偽造登入漏洞

0x01.漏洞簡介 通達oa採用基於web的企業計算,主http伺服器採用了世界上最先進的apache伺服器,效能穩定可靠。資料訪問集中控制,避免了資料洩漏的可能。提供資料備份工具,保護系統資料安全。多級的許可權控制,完善的密碼驗證與登入驗證機制更加強了系統安全性。0x02.漏洞描述 該漏洞型別為任...