目录
渗透的流程
- 信息收集:收集目标系统的相关信息,如 域名 、IP地址、开放端口、运行的服务等。
- 漏洞扫描:使用扫描工具对目标系统进行扫描,发现潜在的漏洞和弱点。
- 漏洞利用:尝试利用发现的漏洞,获取系统的访问权限。
- 权限提升:在成功获取访问权限后,尝试提升权限,以便进行更深入的探测。
- 数据提取:收集敏感数据,如用户信息、密码等。
- 后利用:维持访问权限,进行进一步的探测和攻击。
- 报告编写:整理测试结果,编写详细的渗透测试报告,提供修复建议和安全增强措施。
信息收集如何处理子域名爆破的泛解析问题
泛解析
域名泛解析是指利用通配符(星号)来做次级域名,以实现所有的次级域名均指向同一IP地址。例如,将.wolke.cn解析到10.10.10.10,这样访问子域名a.wolke.cn、b.wolke.cn等都会指向10.10.10.10。这种解析方式虽然方便,但在信息收集时会造成请求的所有子域名都能访问的假象,从而收集到一堆无效的子域名,为子域名爆破带来不便。
判断泛解析的存在
访问一个随机的、不存在的子域名,并观察其解析结果。如果解析结果返回一个IP地址,那么很可能该域名存在泛解析。
处理泛解析的策略
- TLL判断:在权威DNS中,泛解析记录的TTL通常是相同的。因此,可以通过比较不同子域名的TTL值来判断是否存在泛解析。
- 使用 amass、assetfinder 等工具,它们能自动处理泛解析问题。
- 将泛解析的IP地址添加到黑名单中。在进行子域名爆破时,如果解析出的IP地址在黑名单中,则默认跳过该子域名。
如何绕过CDN查找真实ip
- 查询历史DNS记录:目标可能在启用CDN前使用过真实IP,历史记录中可能保留这些信息。
- 查询子域名:并非所有子域名都经过CDN,可能直接解析到真实IP。
- SSL证书:扫描互联网获取SSL证书,进而找到服务器的真实IP。
- 邮件服务器查询:邮件服务器可能未经过CDN,直接暴露真实IP。
- 国外主机解析域名:由于一些CDN服务在国外地区可能无法提供完整的保护,使用国外的主机直接访问目标网站可能会获取到真实IP地址。
- 利用SSRF漏洞:如果目标网站存在SSRF漏洞,可以通过该漏洞获取真实IP。
- 利用CDN配置错误:某些CDN配置不当可能导致真实IP泄露。
- 解码负载均衡器:当服务器使用特定的负载均衡器(如F5 LTM)时,通过对特定关键字的解码(如set-cookie),可以获取到真实IP地址。
- ping一个不存在的二级域名
phpinfo中常见的敏感信息
- 绝对路径:_SERVER[“SCRIPT_FILENAME”]
- 支持的程序:可以看看服务器是否加载了redis、memcache、mongodb、mysql、curl,如果加载了,那么就可以适当往这几个方面考虑,还可以看看是否支持gopher、是否开启了fastcgi
- 查看真实IP:绕开 cdn 获取 C 段资产,旁站等重要信息
- 查看敏感配置:allow_url_include:远程文件包含,allow_url_fopen:远程文件读取,disable_functions:表示禁用的函数名,short_open_tag:允许<??>这种形式,并且<?=等价于<? echo,Loaded Configuration File:配置文件位置
权限维持
Windows 权限维持
- 注册表启动项:通过修改注册表,在系统启动时自动运行恶意程序。使用 reg add 命令添加启动项
- 计划任务:创建计划任务,定期执行恶意程序。使用 schtasks 命令创建任务。
- 服务创建:将恶意程序注册为系统服务。使用 sc 命令创建服务。
- WMI 事件订阅:利用 WMI(Windows Management Instrumentation)在特定事件触发时执行恶意程序。使用 wmic 或 PowerShell 创建事件订阅。
- 启动文件夹:将恶意程序放入用户的启动文件夹。将恶意程序复制到 C:\Users<Username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup。
Linux 权限维持技术
- Cron 任务:编辑 /etc/crontab 或用户级的 Cron 任务。
- SSH 后门:通过修改 SSH 配置或添加授权密钥维持访问。将攻击者的公钥添加到 ~/.ssh/authorized_keys。
修改 /etc/ssh/sshd_config,启用 PermitRootLogin 或 PasswordAuthentication。 - 系统服务:将恶意程序注册为系统服务。创建自定义的 systemd 服务文件。
- 动态链接库注入:通过 LD_PRELOAD 或 /etc/ld.so.preload 注入恶意库。将恶意库路径写入 /etc/ld.so.preload。
跨平台权限维持技术
- Web Shell:在目标服务器上放置 Web Shell,通过 HTTP 请求执行命令。
- 后门账户:在 Windows 中使用 net user 创建账户。
在 Linux 中直接编辑 /etc/passwd 和 /etc/shadow。 - 内存驻留:将恶意代码注入到系统进程内存中,避免写入磁盘。
检测和防御
5.1 检测方法
- 日志分析:检查系统日志、安全日志和网络流量。
- 文件完整性监控:使用工具(如 Tripwire)监控关键文件。
- 内存分析:使用 Volatility 等工具分析内存。
5.2 防御措施 - 最小权限原则:限制用户和服务的权限。
- 定期更新和打补丁:修复已知漏洞。
- 启用安全软件:使用防病毒、EDR 等工具。
输出到href的XSS如何防御
- 输入验证:对用户输入的数据进行严格验证,确保其符合预期的格式。
- 输出编码:在将用户输入输出到 HTML 属性时,对特殊字符进行编码,防止其被解析为 HTML 或 JavaScript 代码。
- 使用安全的 URL 协议:限制 href 属性中允许的 URL 协议,防止使用 javascript: 等危险协议。
- 内容安全策略(CSP):通过 HTTP 响应头配置 CSP,限制浏览器加载和执行外部资源。设置 Content-Security-Policy 头,禁止内联脚本和 javascript: URL。
- 使用安全的库和框架:使用经过安全验证的库或框架处理用户输入和输出。
- 限制用户输入长度:限制用户输入的长度,减少攻击者注入恶意代码的可能性。
- 避免直接拼接 HTML:避免直接将用户输入拼接到 HTML 中,使用安全的 DOM 操作方法。
samesite防御CSRF的原理
SameSite 是 Cookie 的一个属性,用于防御 CSRF(跨站请求伪造) 攻击。它的原理是通过限制 Cookie 的发送范围,防止恶意网站利用用户的身份发起未经授权的请求。当 SameSite 设置为 Strict 或 Lax 时,浏览器不会在跨站请求中自动携带 Cookie。
SameSite 的工作原理
- SameSite=Strict:仅当请求来自同一站点时,才会发送 Cookie。
完全禁止跨站请求携带 Cookie。 - SameSite=Lax:允许部分跨站请求携带 Cookie(如导航请求: 标签、GET 表单)。
禁止非导航请求携带 Cookie(如 POST 表单、AJAX 请求)。 - SameSite=None:允许所有跨站请求携带 Cookie。
必须与 Secure 属性一起使用(即仅适用于 HTTPS)。
CSRF防御
- 使用 CSRF Token
- SameSite Cookie 属性
- 验证 HTTP Referer 头
- 双重提交 Cookie:将 CSRF Token 同时存储在 Cookie 和请求参数中。服务器验证两者是否一致。
- 使用自定义请求头:在 AJAX 请求中添加自定义请求头(如 X-Requested-With)。服务器检查请求头是否存在。
- 限制敏感操作的 HTTP 方法:仅允许 POST、PUT、DELETE 等非幂等方法执行敏感操作。避免使用 GET 方法执行敏感操作。
- 用户交互验证:在执行敏感操作前,要求用户进行二次验证(如输入密码、验证码)。
json格式的CSRF如何防御
- 使用 CSRF Token
- 检查 Origin 和 Referer 头
- 使用 SameSite Cookie 属性
- 禁用 CORS(跨域资源共享)
- 使用自定义请求头:通过添加自定义请求头,可以防止简单的 CSRF 攻击。
- 验证 Content-Type:确保 JSON 请求的 Content-Type 为 application/json,防止浏览器自动发送简单请求。
浏览器解析顺序和解码顺序
解析顺序
- 接收数据:浏览器从服务器接收HTML文件的原始字节流。
- 字节流解码:根据HTML文件指定的字符编码(如UTF-8)将字节流转换为字符。
- 解析HTML:浏览器解析HTML字符流,生成DOM树。
- 解析CSS:解析CSS文件,生成CSSOM树。
- 构建渲染树:将DOM树和CSSOM树结合,生成渲染树。
- 布局(重排)
- 绘制(重绘)
- 执行JavaScript:在DOMContentLoaded事件后执行JavaScript代码,可能修改DOM或CSSOM,触发重排和重绘。
解码顺序
- HTML解码:浏览器首先对HTML文档进行解析,完成HTML解码,并创建DOM树。在解析HTML时,浏览器会对标签内的特定部分(如value属性、RCDATA元素等)进行HTML解码。同时,HTML解析器以状态机的方式运行,根据遇到的不同字符和标签状态进行解码。
- URL解码:URL解码通常在HTML解码之后进行,但主要针对a标签的href属性等特定场景。URL的协议部分(如http://、https://、javascript:等)不能被URL编码,否则会导致URL解析失败。在URL解码过程中,浏览器会将URL中的编码字符还原为原始字符。
- JS解码:对于HTML文档中的内联脚本和
过滤逗号的SQL注入如何绕过
- 使用JOIN代替逗号:id=1’ union select * from (select 1)a join (select 2)b join (select 3)c --+
- 利用FROM子句:在使用substr()或mid()函数时,可以使用from来指定起始位置和长度,select substr(database() from 1 for 1);
- 利用宽字节注入
- 使用CASE语句:SELECT * FROM users WHERE id = 1 UNION SELECT CASE WHEN 1=1 THEN 1 ELSE 2 END;
- 使用FROM子句中的子查询:SELECT * FROM (SELECT 1 AS a UNION SELECT 2 AS a) AS b;
- 使用BETWEEN和AND:SELECT * FROM users WHERE id BETWEEN 1 AND 10;
- 使用HEX和UNHEX:SELECT * FROM users WHERE username = UNHEX(‘61646D696E’);
- 使用LIMIT和OFFSET:SELECT * FROM users LIMIT 1 OFFSET 1;