<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    記一次對wuzhicms的審計

    VSole2022-03-14 10:23:03

    前言

    在網上漫游發現的一個cms cnvd也是有提交的

    也是初次審計這種

    官網:https://www.wuzhicms.com/

    現在也已經好像沒更新了

    也是先看了一會代碼 才知道這是MVC的 之前由于也沒有了解過MVC 就很懵

    開始啥都沒看懂

    后來經過百度 和 求助了一波團隊的時候 總算是有一點點明白了 能把代碼走動

    MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用于映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。(百度的)

    而在之后的路徑中會看見m f v這幾個參數

    m就是文件夾 f就是文件 v就是方法

    就先大概介紹這些

    下面開始審計

    sql注入肯定是容易找的 就先找sql注入了

    工具:seay phpstorm phpstudy

    第一處 sql注入(可惜是后臺的)

    先直接全局搜索select

    這個函數 展示沒有發現有過濾

    然后找哪里調用了這個函數

    通過全局搜索 在這個地方 發現調用了這個函數

    然后查看傳遞的參數

    主要傳遞的是55行這個$where參數 傳到了函數

    然后我們看$where參數的組成 里面有兩個變量$siteid $keywords

    我們是可能可控的

    先看$keywords 因為這個沒調用函數 但是調用了一個$GLOBALS來獲取值

    這里就又要介紹下$GLOBALS 因為剛開始我也沒懂這個是怎么用來獲取值的 知道我百度一陣之后

    和代碼翻翻之后 在一個文件中發現了

    這個cms用$GLOBALS來獲取全部的變量 直接把GET POST代替了

    具體怎么代替的就不跟進解釋了 一句話 就是$GLOBALS可以取到get post的傳的值

    那么這個keywords 前面又沒有定義變量啥的 大概率是 傳參的 (后面經過驗證 也的確如此)

    那另一個參數就不用看了 就先控制這個參數才進行注入了

    有了可控參數 現在就需要找到整個payload了

    可能熟悉MVC的師傅 就知道該怎么構造payload了 但我沒學過MVC 也不了解 就只能用其他方式來找了

    在這個文件看見了廣告管理的注釋

    那我就去后臺找這個功能了

    又因為調用的函數是search嘛 那就是這個搜索框 八九不離十了

    直接輸入1 然后搜索 但是這樣看不出來

    就輸入1然后抓包 看看包了

    好了 這樣路徑參數什么的也出來了

    就全部復制到url

    然后構造

    payload :SELECT COUNT(*) AS num FROM wz_promote_place WHERE siteid=’1’ AND name LIKE ‘%1%’ or extractvalue(1,concat(0x7e,(select database())))%23

    閉合%‘%23

    這里我嘗試了下 盲注 和報錯都是可以的


    如果現在到過頭來看 就一個簡單的搜索框的注入沒什么花里胡哨的 過濾也沒 但審計來看 還是繞了一大圈子

    第二處 前臺sql注入

    還是在搜索select的時候 發現在mysql.class文件下有一個函數里面有select 并且后面的拼接也沒有任何的過濾

    然后我們搜索哪里調用了這個函數

    首先是在api目錄下的sms_check文件中發現調用了get_one函數 并且參數是通過前面的$code拼接

    我們可以看到code 先是通過$GLOBALS來獲取參數param的值 從前面的介紹可以知道 $GLOBALS是可以獲取post get的值 這個文件前面沒有定義param變量 那么 這個param應該就是post 或者get 就是我們可控的 這也是導致注入的點

    code還通過strip_tags() 函數 而這個函數的作用是剝去html標簽 應該是過濾xss吧大概

    之后就直接傳入了函數 繼續更進函數 因為這個文件前面還引入了db類

    這個函數應該是調用的這個文件里面的

    來到這個文件

    可以看到這個get-one函數里面 還調用了一個array2sql函數來處理$where

    那先來看看這個函數的作用

    可以看到這個函數是用來過濾的

    如果是數組 這進入if 把括號 單引號這些過濾掉

    不是則走else 過濾 %20 %27

    然后返回參數

    但也就是這個過濾的地方 沒有防護到位

    我們傳的參數不是數組 所以就沒有走if

    而else里面過濾的卻是 %20 %27

    我們傳參的時候盡管是經過url編碼的 但是web服務器會自動解碼一次 所以 我們傳到后端代碼處的時候是沒有進行url編碼 相當于

    但是二次編碼的就不一樣了 因為web服務器只解碼一次

    如果是二次編碼這里的else過濾就起效果

    return 調用的get_one 則是最開始看見的mysql.class文件里面了

    下面就可以開始直接構造payload了 這里通過代碼分析可以看到是單引號閉合


    單引號報錯

    閉合顯示正常頁面

    就進行盲注

    我用的報錯

    payload:[http://192.168.1.7/wuzhicms/api/sms_check.php?param=1%27+or%20extractvalue(1,concat(0x7e,(select%20database())))%23](http://192.168.1.7/wuzhicms/api/sms_check.php?param=1'+or extractvalue(1,concat(0x7e,(select database())))%23)

    第三處 后臺sql注入

    從前面兩個分析 我發現的注入的地方就存在兩個函數中get_list get_one

    然后直接全局搜索這兩個函數 看看什么地方調用

    可以看到 在copyfrom.php中listing函數下調用了這個函數

    然后我們網上分析 看看什么是可控的

    主要傳進去的就一個$where 和 $page

    可以看到page會被intval()函數 轉化為整數 所以我們不考慮它

    我們看看where 在if內部 想要進入if 就需要通過GLOBALS獲取到keywords

    相當于就要傳參嘛

    然后在看里面 就沒有過濾這些 直接拼接

    這里也可以看出 閉合方式是百分號單引號 %’

    我們在來到mysql文件中定義的這個函數 也可以看到 是對where沒有過濾處理的

    那么 有了前面的基礎 直接來構造

    payload:http://192.168.1.7/wuzhicms/index.php?m=core&f=copyfrom&v=listing&_su=wuzhicms&keywords=%27

    報錯了 直接插入報錯注入的

    payload:http://192.168.1.7/wuzhicms/index.php?m=core&f=copyfrom&v=listing&_su=wuzhicms&keywords=1%%27%20or%20extractvalue(1,concat(0x7e,(select%20database())))%23

    第四處 后臺任意文件刪除

    通過全局搜索unlink函數 來找文件刪除

    在這個文件下找到一個刪除文件的函數 然后我們繼續找哪里調用了這個函數

    還是在這個文件 找到了一個del函數 里面調用了刪除文件的函數

    然后來分析調用的過程 調用刪除的時候通過把$path和ATTACHMENT_ROOT 拼接

    而ATTACHMENT_ROOT是前面定義的一個默認路徑

    path則是前面的$url 來的

    在看前面的if 如果path有值則進入到if里面 然后經過的數據庫的get_one查詢操作 應該這里是要查出一個東西

    但是因為我數據庫是空的 則進入的是第一個if里面 哪怕是查出1條 也是可以的

    這里也沒有其他過濾

    然后網上看url的來源

    GLOBALS 那就可以直接通過傳參的 前面也介紹了 id為空的話 也就進入到了else里面

    到這里也就可以構造payload了

    先在根目錄下創建一個文件

    然后構造

    http://192.168.1.7/wuzhicms/index.php?m=attachment&f=index&v=del&_su=wuzhicms&url=../1.txt

    這里我把最終刪除的路徑 打印了出來

    文件也是成功刪除

    第五處 后臺任意文件上傳

    直接搜索file_put_contents函數

    在set_cache函數下發現寫入文件的函數 $data并且沒有過濾是直接通過參數傳過來的

    然后全局搜索 在哪里調用了這個函數

    這個set函數下調用了這個函數

    并且寫入文件的內容是可控的

    通過打印 知道了 寫入的路徑 文件名

    并且這里也沒有過濾

    直接構造payload

    然后訪問文件

    后面又發現一個函數調用的set_cache

    過程是一樣的 基本上 就沒有演示了

    這里還要注意一點 這里是寫入的緩存文件 不是一直存在的 我重啟之后 寫入的內容就還原了

    應該是還有的 就沒有繼續找這個了

    第六處 信息泄露

    最后在后臺頁面發現一出phpinfo

    一個垃圾的信息泄露

    最后

    肯定還有審漏的

    經過這個cms的審計過后 對MVC這種框架的也有了基本的認識了 以后遇到也不至于這樣的無厘頭 不知道怎么搞路由 怎么調用的

    有了一個新的開始

    如果此文有什么不對點 師傅們指出 學習學習 這也是繼前面幾篇之后新的一次嘗試把 但回過頭來看這個cms 也就因為mvc 所以調用的時候不同 其他的點 漏洞的地方還是規規矩矩 大差不差的和以前的比較的話

    函數調用payload
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Latte-SSTI-Payloads總結
    2021-12-14 16:56:16
    TL;DR最近西湖論劍有一道使用Latte的題目,當時我也是用的偷雞辦法做的,當時時間限制就沒有仔仔細細的去尋找逃逸的辦法。直到賽后我發現逃逸的辦法很簡單{="${system}"}. 這里使用的是php的基礎語法,我就不過多贅述了。這個復雜變量網上也有很多文章。賽后我無聊的時候簡單看了下Latte,找了點后續的利用,比如獲取$this變量,還有任意代碼執行。
    就需要了解一下名稱空間python的名稱空間,是從名稱到對象的映射,在python程序的執行過程中,至少會存在兩個名稱空間。python中一切均為對象,均繼承于object對象,python的object類中集成了很多的基礎函數,假如我們需要在payload中使用某個函數就需要用object去操作。
    利用該漏洞可能會授予對 MOVEit Transfer 數據庫的未經授權的訪問,從而允許攻擊者操縱和泄露敏感信息。變量,則很容易受到 SQL 注入攻擊。有了這種理解,研究人員重點轉向尋找一種繞過清理并以未經清理的方式操縱 Arg01 參數的方法,因此了解 MOVEit 軟件如何處理請求非常重要。由于與未經身份驗證的操作相關而脫穎而出。
    BurpCrypto在Web滲透測試中有一個關鍵的測試項:密碼爆破。使用方法BurpCrypto安裝完成后會在BurpSuite中添加一個名為BurpCrypto的選項卡,打開選項卡可進入不同加密方式的具體設置界面。找的密文對應的明文BurpSuite中有一個飽受詬病的問題,在測試器的測試結果中,無法顯示原始Payload,也就是字典內容。因為Java內置的JavaScript不包含瀏覽器中的window、document、console等API,不過好在此類組件一般不會對加密的核心功能造成影響,但是還是需要將調用此類組件的相關代碼進行刪除或者調整。
    CVE-2021-24086漏洞分析
    2022-07-19 16:41:30
    漏洞信息2021年,Microsoft發布了一個安全補丁程序,修復了一個拒絕服務漏洞,編號為CVE-2021-24086,該漏洞影響每個Windows版本的IPv6堆棧,此問題是由于IPv6分片處理不當引起的。
    惡意軟件為了規避沙盒檢測使用了各種各樣的方法,API Hammering 不會是最后一個,以后也會有各種各樣的變種。
    CS-Shellcode分析(一)
    2021-10-18 08:21:57
    本文是CS的shellcode分析的第一篇文章,該系列文章旨在幫助具有一定二進制基礎的朋友看懂cs的shellcode的生成方式,進而可以達到對shellcode進行二進制層面的改變與混淆,用于免殺相關的研究。執行后可以得到shellcode的原始文件然后我們再用IDA打開這個文件進行分析:先看第一個call的內容這里pop rbp?
    WebSocket 測試入門篇
    2023-02-08 15:56:52
    這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而 HTTP 請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。瀏覽器通過 JavaScript 向服務器發出建立 WebSocket 連接的請求,連接建立以后,客戶端和服務器端就可以通過 TCP 連接直接交換數據。
    最近寫了點反序列化的題,才疏學淺,希望對CTF新手有所幫助,有啥錯誤還請大師傅們批評指正。php反序列化簡單理解首先我們需要理解什么是序列化,什么是反序列化?本質上反序列化是沒有危害的。但是如果用戶對數據可控那就可以利用反序列化構造payload攻擊。
    一般情況下,SSRF針對的都是一些外網無法訪問的內網,所以需要SSRF使目標后端去訪問內網,進而達到我們攻擊內網的目的。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类