最近爆了個通達 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
:
可以發現這裡的codeuid
和type
都是可控的。現在就可以利用了。
首先訪問/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.漏洞描述 該漏洞型別為任...