<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>

    記一次某CMS代碼審計

    VSole2022-11-07 09:52:41

    前言

    無意中瀏覽到某小眾OA官網且可以下載到源碼,隨機審計一波,最后成功Getshell,大佬勿噴

    目錄結構

    環境搭建

    WIN11 + PhpStudy(Mysql) + Redis + IDEA(Tomcat 8.0)

    將sql文件導入到phpstudy(Mysql)中,同時啟動Redis服務,配置好數據庫環境

    采用白+黑進行審計,從功能點出發,在個人資料處圖像可以進行上傳

    開始抓包進行文件上傳,后綴和文件內容均沒有做校驗,且返回上傳的路徑和文件名,本以為可以直接getshell,但卻無法解析,且該文件并沒有落地

    代碼審計

    根據數據包的路徑(/func/upload/uploadImages)直接搜索路由,成功找到上傳函數

    首先會對db的值進行判斷,根據db的值來決定上傳文件的保存方式

    初始上傳的時候,db=1,而if的GlobalConstant.FILE_UPLOADER_SAVE_FILE=0,故直接進入到else if

    新的文件名 = 上傳時間 + 10位隨機數 + 原始上傳文件的后綴名

    String extend = FileUtils.getExtend(fileName);// 獲取文件擴展名String noextfilename = DateUtils.getDataString(DateUtils.SDF_YYYYMMDDHHMMSS) + StringUtil.random(10);//自定義文件名稱String myfilename= noextfilename+"."+extend;//自定義文件名稱
    

    文件存儲在數據庫中,并將文件名通過map保存,最后返回在數據包中

    db可控,在上傳的時候,將db=1改為db=0,進入到if

    會創建新的上傳目錄,新的目錄 = Web根目錄 + upload + 上傳時間(年月日),若不存在則進行新建


    String realPath = request.getSession().getServletContext().getRealPath("/") + "/upload/" + strYYYYMMDD + "/";// 文件的硬盤真實路徑String path = "upload/" + strYYYYMMDD + "/";File file = new File(realPath);    if (!file.exists()) {    file.mkdirs();// 創建根目錄}
    

    新的文件名的命名方式跟else if基本一致,在獲取文件的后綴名的時候,并未進行檢查和過濾,直接進行拼接,從而造成了文件上傳漏洞

    最后將上傳文件內容直接復制到新創建的文件


    FileCopyUtils.copy(mf.getBytes(), savefile);
    

    最后通過map進行存儲,且將文件上傳路徑和文件名分別存儲在 filePath、saveName


    Map<String, Object> map = new HashMap<String, Object>();map.put("filePath", GlobalConstant.CONFIG_FILE_SAVE_DB_URL + myfilename);map.put("saveName", noextfilename);
    

    上傳回顯的Jsp Webshell,將db在上傳的時候改為db=0,成功上傳,可執行命令

    string
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    如果你不是 Java8 的釘子戶,你應該早就發現了:String 類的源碼已經由 char[] 優化為了 byte[] 來存儲字符串內容,為什么要這樣做呢? 開門見山地說,從 char[] 到 byte[],最主要的目的是為了節省字符串占用的內存 。內存占用減少帶來的另外一個好處,就是 GC 次數也會減少。
    Adobe已經發布了一個名為Stringlifier的開源工具,該工具允許用戶識別任何純文本中隨機生成的字符串,該工具可用于清理日志。Stringlifier工具是用Python編寫的,它使用機器學習來識別插入普通文本中的隨機字符序列。開源工具可用于出于多種目的分析日志,例如研究意外暴露的憑證。Stringlifier能夠在源代碼或配置文件中查找API密鑰,哈希,隨機生成的字符串,包括密碼,日志。Adobe在Github上發布的描述中寫道。
    介紹Runtime 是一系列采用 C++ 語言編寫的功能方法,它實現了大量 JavaScript 運行期間需要的 native 功能。本文分析 Runtime_StringToArray 方法的源碼和重要數據結構,講解 Runtime_StringToArray 方法的觸發條件。
    介紹Runtime 是一系列采用 C++ 語言編寫的功能方法,它實現了大量 JavaScript 運行期間需要的 native 功能。
    通過common-collection相關gadget,想辦法調用org.mozilla.classfile.DefiningClassLoader這個類去加載字節碼。然后通過T3協議的反序列化漏洞發送給待攻擊weblogic服務器。
    舉個例子:但是對于64位的來說 ROPgadget預設的長度是不夠的。所以,我們可以使用ROPgadget --binary ./b --depth 100來加深他的搜索深度。2利用_libc_csu_init制造ROP常規方法我們前面說的利用ROPgadget來尋找,大多都是找到直接設置某個寄存器的rop,當然也可以使用--ropchain這個參數。
    一般情況下類與類之間是相互獨立的,內部類的意思就是打破這種獨立思想,讓一個類成為另一個類的內部信息,和成員變量、成員方法同等級別。「內部類的好處:」把一個類寫在外面和寫在里面最終達到的結果都一樣,那我們為什么還要使用內部類,豈不是多此一舉嗎?
    當被問及網絡間諜是否成功時,愛德華·斯金格表示,他非常有信心地確信,除了國防學院本身,沒有任何其他危害行為。斯金格接受采訪時透露,本次攻擊看起來不像是一次暴力攻擊,但有代價。國防學院立即意識到它可能已成為敵對國家在灰色地帶式網絡攻擊中的目標的可能性。官方迅速采取了行動,對更廣泛的國防部IT網絡沒有影響。
    java安全-02RMI
    2022-03-25 15:35:13
    基礎知識動態代理反射攻擊方式注冊端攻擊服務端java -cp .\ysoserial-master-8eb5
    MISC中常用python腳本
    2021-09-20 20:26:46
    MISC中常用python腳本總結
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类