Web 安全的知识向来繁多琐碎,此处仅按照自己的理解收录了一些技巧和CTF解题思路,可供日后参阅。
本博客内容仅供学习与防御研究使用,所有测试须在获得明确授权或在受控实验环境中进行,严禁将本文方法用于未授权入侵或违反当地法律的行为。
概述#
部分概念尚未学习,放在此处以供参考。
- 信息收集(Recon):DNS、子域枚举、端口扫描、指纹识别(server、框架、CMS)、公开泄露(github, pastebin)、证书透明度(cert.sh)等。
- HTTP 基础与 header 利用:Host, Origin, Referer, X-Forwarded-For(和 IP 绕过)、Cookie/Session 机制、CORS 原理与绕过思路、CSRF 概念与利用。
- 常见 Web 漏洞(分类化):XSS(反射/存储/DOM)、CSRF、IDOR(水平/垂直访问控制)、Auth Logic Flaws(逻辑缺陷)、SSRF、XXE、文件包含(LFI/RFI)、文件上传、命令注入、SQLi、NoSQLi、HTTP Desync、模板注入(SSTI)等。
- 检测/利用工具链:Burp Suite、ffuf/gobuster/dirsearch、sqlmap、nmap、curl、httpie、wfuzz、ffmpeg(解析文件)、jq(JSON)等。
- 防护与加固要点:输入校验、参数化查询、最小权限、禁止直接在 webroot 执行用户上传文件、正确配置 CORS、HTTP Security headers(CSP、HSTS、X-Frame-Options)、session 安全等。
- 常见绕过技巧(简短 cheat sheet):url 编码、双编码、大小写、注释(SQL)绕过、替换分隔符、使用
../../%2e%2e/、使用data:/file:/gopher:schema。
信息收集 / Recon#
- 通过遍历网站的各层目录,寻找其中是否包含:可直接访问的应用程序代码和数据、后端系统的入口和凭据、敏感的操作系统文件。
- 目录遍历常见思路:
- 直接使用字典暴力搜索,逐个访问。
- 可以从网站根目录下的
robots.txt文件中获取到一些线索和相关路径信息。 - 观察网页源代码中的
<script>标签,可能会暗含一些功能的路径或入口。
常见Web漏洞#
目录遍历(Path Traversal)#
定义
有的网站应用未能实现对请求中目录遍历操作的禁止,从而允许攻击者通过构造路径(如 ../)访问服务器上 web 根目录之外的文件或目录,导致敏感文件(配置、备份、凭证等)泄露。
常见触发点
- 接收文件名或路径参数的接口(
?file=,?path=,download=,load=,view=等)例如:https://insecure-website.com/loadImage?filename=../../../etc/passwd - 不当拼接文件路径并直接读取/返回文件的后端代码
Tips
- 许多服务器会对
..进行过滤或对../做规范化;因此需要用 URL 编码(%2e%2e%2f)等方式绕过过滤器。
认证与访问控制#
基础概念
- 垂直权限提升:使用户访问原本不被允许访问的功能,例如非管理员用户访问管理员页面。
- 水平权限提升:使用户能够访问属于其他用户的资源。
提权方式
- 通过身份验证机制,伪装成其他用户:
- 通过字典和脚本多次尝试登录,暴力获取用户登录凭证。但枚举账号时应先注意速率限制/锁定策略/等因素,盲目暴力登录会触发封禁。
- 在登录页面进行枚举,可以通过返回内容(
用户不存在or密码不正确)判断用户名是否有效。但现代应用常做“统一错误信息”来阻止枚举。 - 还有基于时间、响应码、副信息(JSON结构/HTML差异)的枚举方式(即侧信道/时间差异)。
服务端请求伪造 (SSRF)#
- SSRF 是一种由攻击者构造请求来利用的安全漏洞,可使服务器端应用程序向非预期位置发出请求。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。
- 例如,某服务器在一般情况下,根据用户的请求向指定的某后端API请求数据。如果用户构造恶意请求,将API链接修改为管理页面,则会导致服务器请求管理页面的内容并返回给用户。
文件上传漏洞#
- Web服务器可能允许用户将文件上传到其文件系统,而没有充分验证其名称,类型,内容或大小等内容。该功能便有可能会被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。
- 在文件上传漏洞中,最坏的情况是允许上传服务器端脚本(WebShell),例如PHP、Python、Java文件。WebShell是一种恶意脚本,攻击者只需向正确的路径发送HTTP请求,即可在远程Web服务器上执行任意命令。
- 有时,Web服务器的文件类型检查机制非常弱,可以简单地通过修改请求的
Content-Type(如修改为image/png)等方式绕过。- 因此后端不要仅依赖 Content-Type;应验证文件的“魔术字节”(magic bytes)和后缀、并将上传文件存放到不可执行目录。
操作系统命令注入#
- 当 Web 应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如 PHP 中的
system、exec、shell_exec等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。 - 在确定操作系统命令注入漏洞后,执行一些初始命令以获取有关系统的信息非常有用。下表是在Linux和Windows平台上有用的一些命令。
| 命令用途 | Linux | Windows |
|---|---|---|
| 当前用户名 | whoami | whoami |
| 操作系统 | uname -a | ver |
| 网络配置 | ifconfig | ipconfig /all |
| 网络连接 | netstat -an | netstat -an |
| 运行的进程 | ps -ef | tasklist |
- 用户可以构造请求,通过改变 Web 应用在执行外部 shell 时传递的参数,执行任意命令。例如,可以通过这一命令进行测试:
; echo testtesthello;字符是shell命令分隔符,而echo命令使提供的字符串在输出中回显。这是测试某些类型的操作系统命令注入的有用方法。若存在该漏洞,则用户能够在返回的信息中看到回显的字段和报错信息。- 通常检测/注入常用的分隔符包括
;、&&、|、||、`(反引号)或$()
SQL 注入#
- SQL注入(SQLi)是一个Web安全漏洞,允许攻击者干扰 Web 应用程序对其数据库的查询。这可能允许攻击者查看他们通常无法检索的数据,包括属于其他用户的数据,或应用程序可以访问的任何其他数据。在许多情况下,攻击者还可以修改或删除此数据,从而导致应用程序的内容或行为发生持久性更改。
- 常见的手动检测可注入点的方法:
- 发送单引号字符
',并查找错误或其他异常。 - 提交布尔条件(如
OR 1=1和OR 1=2),并查找应用程序响应中的差异。 - 提交可以在SQL查询执行时触发时间延迟的负载,并查找响应时间的差异。
- 发送单引号字符