seacms v6.64 最新漏洞分析
最近seacms 更新了版本,直接從6.61更新到了6.64, 小版本之間的時間間隔比較短,但是在新版本釋出沒有多久,已經有不少最新版本的漏洞被挖掘出,今天我們就來總結分析一下這些漏洞。
CVE-2018-16445
後臺sql注入漏洞,這個漏洞在提交cve的報告中,只列出了sqlmap的掃描結果,並沒有寫明漏洞產生的原因,作者在第一次溯源的時候也是因為疏忽,竟然沒有找到漏洞點。
- 相信很多童鞋在做審計的時候,phpstorm的全域性搜尋也是和作者一樣設定的吧,預設搜尋的範圍是php檔案,一些沒有用的檔案是不去搜索的,因為這樣確實是可以加快搜索的速度和進度,不用去看很多js和css等樣式檔案,以及html等模板檔案,但是這個漏洞呢,問題就出在了htm模板檔案之中,常規做審計的過程中,還真的是容易忽略!
- 在利用cve報告中提供的payload進行注入的時候,預設會進行跳轉,這樣對於漏洞追蹤也產生了一點困難。
基礎知識
要理解這個漏洞,首先要知道一個基礎的問題,就是關於php的include機制,我們來做個實驗:
- 首先建立一個php檔案,內容如下:
- 然後建立一個htm檔案,檔案內容如下:
- 然後我們執行php檔案,結果如下:
- 結果中我們可以看到,htm檔案中的符合php語法的部分被正確解析執行了,當然這算是一個常識,例如我們有一個情景,有一個任意檔案包含漏洞,我們怎麼才能getshell呢,就可以利用這個知識點,我們首先汙染apache或者nginx的日誌檔案,然後將其包含進來,這個時候其中符合php語法的部分,就會被解析執行,從而我們就能獲取webshell,這在滲透中是非常常見的思路,在ctf中也是遇到過很多次了。
漏洞分析
經過溯源,漏洞產生的位置是:/admin/templets/admin_video_main.htm的42行附近。
先看一下seacms的全域性過濾以及偽全域性機制:
這種防禦方法有一個弱點,就是如果sql變數沒有引號包圍,那就相當於沒有過濾,是十分危險的。
下面我們來看一下整個的漏洞邏輯部分:
乍一看,整個的處理替換邏輯十分複雜,很難通過肉眼直接看出來,這裡可以用一個小技巧,我們既然知道了是sql注入漏洞,那我們可以著重看進入sql查詢的過程,我們這裡在其中加幾個var_dump,就能很明顯的看出來了:
經過簡化,我們的程式碼可以抽象成:
然後我們就可以開始測試:

可以清楚的看到,報錯注入是可以直接回顯結果的,這裡我們測試發現cve提交的payload有點小問題,是不用加repeat和allrepeat這兩個引數的。
/admin_video.php?order=v_name and (extractvalue(1,concat(0x7e,(select user()),0x7e))) -- 1
提取資料的過程就不累述了,有回顯的注入比較好辦。
CVE-2018-17062
這是一串xss漏洞的cve集合,產生問題的檔案是admin_video.php
作者給出的利用連結有:
admin_video.php?action=keoiw"><script>alert(1)</script>c7dkw
其餘可以利用的引數有:
area type yuyan jqtype v_isunion v_recycled v_ismoney
具體的利用可以參考具體 ofollow,noindex" target="_blank">連結 。
我們去看一下這個程式碼層:
首先這裡我們傳入的action是不滿足任何一個if條件的,所以就進入最後一個else語句,然後我們跟進模板htm檔案,檢視一下變數的輸出是否經過過濾。
可以明顯的發現,傳入的變數沒有經過任何的過濾,就直接輸出,上面的引數基本都是這樣的模式,所以這個漏洞發現的難度不是很大,但是需要及時跟進業務邏輯的更新操作。
CVE-2018-17321
同樣是新業務點的xss漏洞,利用payload如下:
/admin_datarelate.php?action=dorandomset&maxHit=1000&time=1000</script><script>alert(1)</script>&submit=1
/admin_datarelate.php?action=dorandomset&maxHit=1000</script><script>alert(1)</script>&time=1000&submit=1
原理和上面的cve類似,這裡就不重複講解。
CVE-2018-17365
一枚任意檔案刪除漏洞,產生問題的檔案是/admin/admin_template.php的114行附近。
有關的程式碼邏輯為:
可以看到,接受到引數以後,對其進行了簡單的過濾,我們只要繞過就可以進行任意檔案的刪除:
$dirTemplate="../templets"; substr(strtolower($filedir),0,11)!=$dirTemplate
過濾簡單的截取了傳入變數的前11個字元,然後與模板檔案的開頭對比,但是這裡忽略了作業系統中的../上跳操作,即bypass payload為:
../templets/../install/install_lock.txt
這樣我們就可以刪除安裝產生的install鎖檔案,從而重新安裝seacms,拿到webshell。
實際演示一下刪除index.php.bak:
刪除之前:
執行刪除操作:admin_template.php?action=del&filedir=../templets/../install/index.php.bak
刪除完:
可以發現,確實成功刪除了檔案,這個過濾其實是十分不安全的,所以很容易就可以bypass。
總結
對於cms的cve挖掘,需要及時的跟進業務邏輯的更新,很可能新增加的業務就會有漏洞的產生。