這個是9.3-9.5舉行的一個比賽。上個鏈接https://score.ctf.westerns.tokyo/problems?locale=en
不過我這一段時間都在忙着做一個智障的項目,大的比賽都沒時間做,也就只能賽後來補補題,發現自己還是太菜了,菜的摳腳。
還好題目還開着。不過補題花了不少時間,學了不少姿勢。
現在貌似還開着的,不知道會開多久。
web 50 Global Page
比賽的時候做的,抓包試驗了幾次就摸清規律了,修改請求頭,GET的page參數設置爲php:/
,然後在Accept-Language
參數設置爲/filter/convert.base64-encode/resource=**
,就可以使用php://
配合文件包含讀取任意文件了。
拿到了flag,base64解碼得到flag是TWCTF{I_found_simple_LFI}
web 100 Get the admin password!
一道mdb注入,不多解釋了,比較簡單,這裏就不對mongodb注入做太多說明了,回頭有空寫個博客來詳細總結下好了。
直接寫個腳本盲注下就可以了,截圖如下:
因爲忙着上廁所,所以懶得寫二分了,上完回來就跑完了,所以就不貼了代碼了,截圖如下:
所以最後的flag就是TWCTF{wasshoi!summer_festival!}
web 100 Poems
web 150 rotten uploader
題目提示如下:
進入之後發現可以直接通過這樣子http://rup.chal.ctf.westerns.tokyo/downloader.php?f=../index.php
下載到index.php
和download.php
的源碼,但是下file_list.php
下不下來,先讀另外兩個的源碼吧,index.php
如下:
<?php
/**
*
*/
include('file_list.php');
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Level 2//EN">
<html>
<head>
<title>Uploader</title>
</head>
<body>
<h1>Simple Uploader</h1>
<p>There are no upload features.</p>
<h3>Files</h3>
<table width="100%" border="1">
<tr>
<th>#</th>
<th>Filename</th>
<th>Size</th>
<th>Link</th>
</tr>
<?php foreach($files as $file): ?>
<?php if($file[0]) continue; // visible flag ?>
<tr>
<td><?= $file[1]; ?></td>
<td><?= $file[2]; ?></td>
<td><?= $file[3]; ?> bytes</td>
<td><a href="download.php?f=<?= $file[4]; ?>">Download</a></td>
</tr>
<?php endforeach;?>
</table>
</body>
</html>
download.php
如下:
<?php
header("Content-Type: application/octet-stream");
if(stripos($_GET['f'], 'file_list') !== FALSE) die();
readfile('uploads/' . $_GET['f']); // safe_dir is enabled.
?>
閱讀之後發現index.php
裏面沒啥信息,只是包含了下file_list.php
,而download.php
直接把這個過濾了,所以目的就是如何繞過過濾。
這裏也是經過別人提示學到了一個新的姿勢,這裏通過wireshark抓包可以分析出服務器的操作系統是windows,之前我的博客也有說怎麼判斷操作系統,這裏我是根據TTL=128得到服務器操作系統是windows的,
而windows是有長文件名和段文件名的區別。
給個鏈接http://blog.csdn.net/oathevil/article/details/5717341
所以最後payload就是
file_list.php
源碼如下:
<?php
$files = [
[FALSE, 1, 'test.cpp', 1135, 'test.cpp'],
[FALSE, 2, 'test.c', 74, 'test.c'],
[TRUE, 3, ' ', 35, 'flag_c82e41f5bb7c8d4b947c9586444578ade88fe0d7'],
[FALSE, 4, 'test.rb', 1446, 'test.rb'],
];
這樣就得到提示了,直接又去獲取flag_c82e41f5bb7c8d4b947c9586444578ade88fe0d7
源碼即可拿到flag,flag是TWCTF{Hotto_Smile}
web 200 ZIP cracker
這裏首頁存在備份文件,如下:
<?php
if(!empty($_FILES['zip']['tmp_name']) and !empty($_FILES['dict']['tmp_name'])) {
if(max($_FILES['zip']['size'], $_FILES['dict']['size']) <= 1024*1024) {
// Do you remember 430387 ?
$zip = $_FILES['zip']['tmp_name'];
$dict = $_FILES['dict']['tmp_name'];
$option = "-D -p $dict";
if(isset($_POST['unzip'])) {
$option = "-u ".$option;
}
$cmd = "timeout 3 ./fcrackzip-1.0/fcrackzip $option $zip";
$res = shell_exec($cmd);
}
else {
$res = 'file is too large.';
}
}
else {
$res = 'file is missing';
}
?>
<!doctype html>
<html>
<head>
<meta charset=utf-8>
<title>ZipCracker - Crack Your Zip Online</title>
<link rel="stylesheet" href=""http://cdn.foundation5.zurb.com/foundation.css">
<link rel="stylesheet" href="/zipcracker.css">
</head>
<body>
<div class="main">
<div class="top-bar">
<div class="top-bar-title">ZipCracker</div>
</div>
<div class="container-wrapper">
<div class="container">
<h1 class="container-head">
Crack Your ZIP Online
</h1>
<p class="container-subhead">
Only dictionary-based crack is available.<br>
Both zip and dictionary file must not exceed 1MB.
</p>
<form action="" method="POST" enctype="multipart/form-data">
<label for="zip" class="button">ZIP file</label>
<input id="zip" type="file" name="zip" class="show-for-sr">
<label for="dict" class="button">Dictionary file</label>
<input id="dict" type="file" name="dict" class="show-for-sr">
<input id="unzip" type="checkbox" name="unzip">
<label for="unzip">use unzip</label>
<button type="submit" class="success button">Crack</button>
</form>
<p>file is missing</p>
</div>
</div>
</div>
</body>
</html>
然後知道目錄下有一個工具fcrackzip,能夠訪問並且下載其所有的源文件和工具,看完wp知道應該是工具裏面寫法有問題,這裏時間也不很夠就沒有去看工具源碼,直接給出做法,有興趣的可以自己去看看。
首先是創建一個以aaa";ls /#
爲密碼的zip文件,然後在把密碼寫進pass.txt
然後上傳就可以了,記住勾選use unzip
看源碼發現命令執行了:
那就可以直接cat flag.php
了
提交
成功拿到flag
web 300 Tsurai Web
這道題的主要考點就是
例如用的是__import__('a')
而當前目錄如下:
---
|-a
|--|-__init__.py
|-a.py
它會引用文件夾a下的__init__.py
而這裏題目的源碼可以下下來自己跑起來,就是flask框架寫得,不懂得可以看看我的博客裏面有關於flask的介紹,嘿嘿
自己跑起來的時候,每創建一個用戶,就會在data下創建如下
漏洞點在這裏
就是最開始說的,它會優先引用同名文件夾的__init__.py
,當時前提是得有,但是這裏我們上傳的所有文件都以原文件名存在該文件夾下。
所以我們就可以手動上傳一個__init__.py
,
本地如圖:
跟隨重定向可以看到
把本地目錄所有都讀取出來了。
現在上題目操作,其實都是一樣的,讀取出
目錄下存在一個flag,接下來直接讀取flag文件內容即可
這裏我不知道咋回事報500error,所以我重新註冊一個賬戶,上傳py執行命令讀取flag文件就可以了
所以flag就是TWCTF{TH1S_Challange_was_BORN_AT_2016-09-04_13:03_JST}