网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。
目录
LAST(日志分析安全技术)与RASP(运行时应用自保护)区别
欧科云链-安全开发
sql注入如何判断数据库类型 xss除了打cookie还有什么利用思路 代码审计流程 filter的作用域 哪些业务场景可能会出现反序列化漏洞 除了readobject,还有哪些反序列化漏洞 反序列化失败吗,可能有哪些原因 AST是? 代码如何生成AST 有没有不经过IR阶段(比如借组LLVM),直接生成AST的方法,与前者相比有何缺陷 抛开exp,如何提权(烂土豆、suid、mysql提权) suid提权的生命周期 Windows烂土豆提权 免杀相关:webshell免杀、静态免杀、动态免杀、shellcode免杀 HIDS的流程是什么 LAST与RASP的区别 俩者在埋点深浅上有何区别(同类漏洞、如何做埋点处理) 埋点的深浅对于检出率有何影响 log4j做埋点,直接在log4j的Class里做hook,和直接hook jndi的initial和lookup有什么区别(算上对和上面哪个问题的提示) 百度的IAST是怎么做的,主动式和被动式的区别 俩种方法是否会产生脏数据 符合执行如何做约束求解 哪些漏洞可以直接fuzz检测到
SQL注入如何判断数据库类型
核心判断方法
- 错误信息特征
- MySQL:错误信息包含
You have an error in your SQL syntax
,版本查询可通过SELECT @@version
。- Oracle:错误信息常包含
ORA-
前缀(如ORA-00933: SQL command not properly ended
),版本查询用SELECT * FROM v$version
。- MSSQL:错误信息可能包含
Microsoft SQL Server
标识,版本查询用SELECT @@VERSION
。- 函数与语法差异
- 注释符:
- MySQL:
#
或--
(需空格)- MSSQL:
--
- 字符串拼接:
- MySQL:
CONCAT()
- Oracle:
||
操作符- 时间盲注函数:
- MySQL:
SLEEP(5)
- MSSQL:
WAITFOR DELAY '0:0:5'
- 联合查询列数探测
通过ORDER BY
递增列数观察报错,不同数据库的默认列数可能不同。例如:
- MySQL:联合查询需列数一致,否则报错
The used SELECT statements have a different number of columns
。- PostgreSQL:报错显示为
each UNION query must have the same number of columns
。扩展思路
- 版本函数探测:通过注入
version()
、db_name()
等函数获取数据库标识。- 系统表查询:
- MySQL:
information_schema.tables
- MSSQL:
sysobjects
- Oracle:
all_tables
- 协议与端口辅助判断:结合服务端口(如MySQL默认3306、MSSQL默认1433)缩小范围。
XSS除了打Cookie还有什么利用思路
其他利用方向
- 钓鱼与社交工程
- 伪造登录页面:通过XSS注入
<iframe>
加载钓鱼页面,诱导用户输入账号密码。- 劫持用户操作:通过JavaScript模拟点击(如
document.forms[0].submit()
)实现自动转账。- 浏览器漏洞利用
- 结合浏览器0day(如CVE-2021-21224)执行系统命令或下载恶意软件。
- 利用WebRTC获取内网IP,辅助内网渗透。
- 资源滥用与破坏
- 挖矿脚本:注入加密货币挖矿代码(如Coinhive脚本)。
- DDoS攻击:通过
fetch
或XMLHttpRequest
发起大量请求攻击第三方站点。- 数据篡改:修改页面内容(如商品价格、公告信息)造成业务影响。
高级攻击场景
- 结合CSRF:通过XSS窃取CSRF Token,绕过同源策略发起跨站请求。
- 键盘记录:监听
onkeypress
事件窃取用户输入。- 界面伪装:覆盖页面元素(如“支付成功”弹窗)欺骗用户。
代码审计流程
核心步骤
- 信息收集与准备
- 确定审计目标(如Java Spring、PHP Laravel)。
- 获取代码仓库、依赖库列表及配置文件(如
pom.xml
、composer.json
)。- 白盒静态分析
- 工具辅助:使用
SonarQube
、Semgrep
扫描常见漏洞(如SQL注入、硬编码密钥)。- 敏感函数追踪:搜索
eval()
、Runtime.exec()
等危险函数调用链。- 动态调试与验证
- 黑盒测试:结合Burp Suite拦截请求,验证输入点是否可控。
- 断点调试:通过IDE(如IntelliJ、VS Code)跟踪数据流,确认漏洞触发路径。
扩展实践
- 依赖库漏洞检测:使用
OWASP Dependency-Check
扫描第三方库(如Log4j 2.x)。- 架构风险分析:检查认证逻辑(如JWT实现)、权限控制(如RBAC)是否合理。
- 历史漏洞复现:针对已知CVE(如Fastjson反序列化)检查修复情况。
Filter的作用域
作用域分类
- 全局过滤器(Global Filter)
- 应用于所有请求(如Spring的
@WebFilter("/*")
)。- 典型场景:统一编码设置、日志记录、XSS防御。
- 局部过滤器(Local Filter)
- 通过URL模式匹配特定请求(如
@WebFilter("/admin/*")
)。- 应用场景:权限校验、API限流。
- 类/方法级过滤器
- 通过AOP实现(如Spring的
@Around
注解)。- 示例:事务管理、性能监控。
扩展说明
- Servlet与Spring对比:
- Servlet Filter:通过
web.xml
配置,作用域由<url-pattern>
定义。- Spring Interceptor:基于HandlerMapping,支持更细粒度控制(如排除静态资源)。
- 优先级控制:通过
@Order
注解或web.xml
中的<filter-mapping>
顺序定义执行链。
可能产生反序列化漏洞的业务场景
- 远程通信协议
- RPC框架:Dubbo、gRPC 使用Hessian、Protobuf序列化,若未校验数据来源可能导致RCE。
- HTTP接口:接收JSON/XML数据的接口使用
ObjectMapper
反序列化(如Jackson的enableDefaultTyping
开启多态)。- 会话管理
- Session存储:部分框架将会话数据序列化后存储(如Redis),攻击者可篡改Session实现身份伪造。
- Cookie反序列化:Java的
CookieHelper
直接反序列化用户可控的Cookie值。- 配置文件与数据传输
- YAML/XML配置解析:SnakeYAML、XStream解析恶意配置导致代码执行。
- 消息队列:Kafka、RabbitMQ消费者反序列化消息时触发漏洞。
防御建议
- 使用安全反序列化库(如JSON的
JsonReader
替代ObjectMapper
)。- 禁用多态类型(如Jackson的
@JsonTypeInfo
注解需谨慎使用)。
除了readObject,其他反序列化触发点
- XMLDecoder反序列化
- Java中通过
XMLDecoder.readObject()
解析XML数据,可执行任意代码(如<java> <void class="java.lang.ProcessBuilder">...</void> </java>
)。- YAML解析漏洞
- SnakeYAML的
yaml.load()
支持构造恶意对象(如!!javax.script.ScriptEngineManager
触发SPI机制)。- JSON多态利用
- Fastjson的
@type
指定恶意类(如com.sun.rowset.JdbcRowSetImpl
触发JNDI注入)。扩展案例
- Groovy反序列化:通过
MethodClosure
执行系统命令。- PHP反序列化魔术方法:
__destruct()
或__wakeup()
中调用危险函数。
反序列化失败的可能原因
- 数据格式不兼容
- 序列化与反序列化的类版本不一致(如
serialVersionUID
变更)。- 字段类型或结构变更(如新增字段未被处理)。
- 依赖缺失或冲突
- 反序列化所需的类未在ClassPath中(如第三方库未引入)。
- 类加载器隔离(如Tomcat的Web应用类加载机制)。
- 安全限制触发
- JVM安全管理器(
SecurityManager
)禁止某些操作(如文件读写)。- 反序列化过滤器(
ObjectInputFilter
)拦截恶意类。调试方法
- 查看堆栈跟踪确认类加载失败位置。
- 使用
-Dsun.io.serialization.extendedDebugInfo=true
输出详细序列化信息。
AST(抽象语法树)
核心概念
- 定义与结构
- AST是源代码的树状表示,每个节点对应语法结构(如函数声明、循环语句)。
- 示例:
if (x > 0) { print(x); }
解析为IfStatement
节点,包含条件表达式和代码块。- 应用场景
- 编译器:用于语法检查、代码优化(如删除无用代码)。
- 静态分析:检测代码缺陷(如空指针引用)。
- 代码转换:Babel将ES6+代码转换为ES5。
- 生成工具
- Java:JavaParser、ANTLR。
- Python:
ast
模块。扩展分析
- 与CFG的区别:控制流图(CFG)关注执行路径,AST关注语法结构。
- IDE集成:VS Code的语法高亮和代码提示依赖AST解析。
代码生成AST的方法
核心步骤
- 词法分析(Lexical Analysis)
- 将源代码分割为Token(如标识符、关键字、运算符)。
- 语法分析(Parsing)
- 根据语法规则(如BNF)将Token组合为语法树节点。
- 树形结构构建
- 递归下降、LL/LR算法生成AST。
工具示例
- ANTLR:通过
.g4
语法文件定义规则,自动生成解析器。- Roslyn(C#):提供API直接操作AST。
不经过IR直接生成AST的缺陷
直接解析的局限性
- 优化难度大
- 缺乏中间表示(IR)难以实现跨平台优化(如LLVM的IR支持多种后端)。
- 代码复用性低
- 每种语言需独立实现解析器,无法复用通用优化逻辑。
- 性能损耗
- 直接生成机器码需处理复杂细节(如寄存器分配),易产生低效代码。
对比LLVM的优势
- LLVM通过IR层实现语言无关的优化,提升编译效率。
提权方法(除EXP外)
- SUID提权
- 查找具有SUID权限的文件:
find / -perm -4000 2>/dev/null
。- 利用条件:文件属主为root且存在漏洞(如旧版
pkexec
)。- 环境变量劫持
- 通过
LD_PRELOAD
注入恶意动态库,劫持合法进程。- MySQL提权
- 利用
FILE
权限写WebShell或SSH密钥。- 通过UDF执行系统命令(需插件目录写入权限)。
防御措施
- 定期检查SUID/SGID文件,删除不必要的权限。
- 限制MySQL用户权限,禁用
FILE
和PROCESS
。
SUID提权生命周期
- 发现阶段
- 枚举SUID文件,筛选属主为root的可执行文件。
- 利用阶段
- 通过路径劫持(如
PATH
环境变量)或参数注入执行恶意代码。- 清理阶段
- 删除临时文件,清除日志(如
/var/log/auth.log
)。经典案例
- CVE-2021-4034(PwnKit):
pkexec
的SUID提权漏洞。
Windows烂土豆提权
原理与步骤
- 令牌模拟攻击
- 利用Windows的令牌模拟机制,将服务账户权限提升至SYSTEM。
- 操作流程
- 使用
JuicyPotato
或RogueWinRM
触发COM对象加载。- 监听本地端口,捕获SYSTEM权限的令牌。
- 防御建议
- 禁用非必要的COM组件,限制服务账户权限。
免杀技术分类
- WebShell免杀
- 混淆:使用Base64、异或加密绕过正则检测。
- 动态加载:通过
eval($_POST['code'])
分离恶意代码。- 静态免杀
- 修改特征码:重写函数名、删除敏感字符串。
- 加壳保护:使用UPX或自定义壳加密二进制。
- 动态免杀
- 内存加载:反射注入或Process Hollowing不落地执行。
- API混淆:动态解析函数地址(如
GetProcAddress
)。对抗检测
- 使用合法证书签名恶意文件。
- 利用合法进程(如
msiexec.exe
)加载恶意模块。
HIDS(主机入侵检测系统)流程
- 数据采集
- 收集进程、文件、网络、日志等数据(如Auditd、Sysmon)。
- 行为分析
- 基于规则(YARA)或机器学习检测异常(如可疑进程链)。
- 响应与阻断
- 隔离主机、终止恶意进程、修复漏洞。
工具示例
- Osquery:通过SQL查询实时监控主机状态。
- Wazuh:集成威胁情报和自动化响应。
LAST(日志分析安全技术)与RASP(运行时应用自保护)区别
- 部署位置
- LAST:基于日志分析,部署在独立服务器。
- RASP:嵌入应用运行时(如Java Agent)。
- 检测能力
- LAST:依赖日志完整性,可能漏报。
- RASP:实时监控代码执行流,精准检测漏洞。
- 性能影响
- LAST:低延迟,仅日志存储开销。
- RASP:可能增加应用响应时间(5%-10%)。
埋点深度影响
- 深埋点:在框架底层(如Servlet)拦截,覆盖所有请求但实现复杂。
- 浅埋点:在业务代码层检测,易实现但可能遗漏底层漏洞。
Log4j埋点策略对比
- Log4j类Hook
- 优势:覆盖所有日志输出,拦截漏洞触发前的恶意输入。
- 缺陷:无法防御绕过日志的JNDI注入(如直接调用
InitialContext.lookup
)。- JNDI API Hook
- 优势:直接阻断JNDI请求(如禁用
ldap://
协议)。- 缺陷:需修改JVM参数或核心库,兼容性风险高。
安全建议
- 升级Log4j至2.17.0+,默认禁用JNDI。
- 使用Security Manager限制JNDI协议。
百度IAST实现与主动/被动式区别
- 主动式(插桩)
- 原理:在应用中插入探针,跟踪数据流(如污点分析)。
- 优势:高检出率,支持复杂漏洞(如业务逻辑错误)。
- 脏数据问题:通过请求标记区分测试流量与实际用户数据。
- 被动式(流量分析)
- 原理:镜像流量解析,匹配漏洞模式(如SQL注入特征)。
- 优势:无侵入性,支持多语言。
- 脏数据风险:测试流量可能污染生产数据(如写入测试订单)。
百度实践
- 混合模式:主动插桩结合流量分析,平衡覆盖率和性能。
- 数据隔离:测试环境与生产环境隔离,避免脏数据。
符号执行与约束求解
- 符号执行流程
- 路径探索:遍历程序分支,生成路径条件(如
if (x > 0)
)。- 约束生成:将路径条件转换为数学表达式(如
x > 0 ∧ y = x + 1
)。- 求解输出:使用SMT求解器(如Z3)生成具体输入值。
- 应用场景
- 漏洞检测:发现整数溢出、缓冲区溢出。
- 代码验证:证明程序满足特定安全属性。
- 挑战
- 路径爆炸:循环和递归导致路径数量指数增长。
- 复杂约束:浮点数运算、非线性方程难以求解。
可直接Fuzz检测的漏洞类型
- 输入验证漏洞
- SQL注入/XSS:通过模糊测试触发数据库报错或脚本执行。
- 协议解析漏洞
- 缓冲区溢出:发送超长或畸形数据包(如Heartbleed漏洞)。
- 文件解析漏洞
- PDF/Office漏洞:构造恶意文件触发解析器崩溃(如CVE-2017-0199)。
工具推荐
- AFL(American Fuzzy Lop):基于覆盖率的模糊测试工具。
- Boofuzz:网络协议模糊测试框架。