1. 程式人生 > >1009.CTF 題目之 WEB Writeup 通關大全 – 3

1009.CTF 題目之 WEB Writeup 通關大全 – 3

系統 新的 靜態 ctype bool hint have uac direction

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

,就可以直接獲取到flag。
題目的意思就是通過改變地址欄訪問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)&amp;&amp;!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&gt;0){
        echo $flag;
    }else{
        echo "失敗了呀";
    }
}

這段源碼就給出了如何拿到flag,有兩個條件:
1. token,長度必須等於10。
2. token要和0相等,這裏又用到了php弱類型比較,只要用0000000000就可以繞過這兩條限制。

得到payload : http://ctf5.shiyanbar.com/10/upload/[email protected]&amp;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截斷漏洞。

  1. strlen($_GET[‘password‘]) 9999999,限制字符串長度小於8,值大於9999999。
  2. 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代碼審計
hintsha1函數你有認真了解過嗎?聽說也有人用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&amp;password[]=b
技術分享圖片
Flag: CTF{t3st_th3_Sha1}

1009.CTF 題目之 WEB Writeup 通關大全 – 3