Path traversal 路径穿越
路径遍历(又称目录遍历)漏洞允许攻击者读取运行应用程序的服务器上的任意文件,可能包括:
- 应用程序代码与数据
- 后端系统的凭证信息
- 敏感的操作系统文件
在某些情况下,攻击者还可能向服务器的任意文件写入内容,进而修改应用程序数据或行为,最终完全控制服务器。
示例
<img src="/loadImage?filename=218.png">
网站中有这样一个链接,如果在 Linux 系统中,一般 218.png 储存在 /var/www/images/218.png
想要测试路径穿越,就用:https://insecure-website.com/loadImage?filename=../../../etc/passwd 来读取
如果是 Windows,改用:https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini 即可
Lab
比较简单,是一个商城页面,和上面类似。注意不能直接在浏览器访问,不然会被当成图片解析
Acess Control 访问控制
在 Web 应用场景中,访问控制依赖于身份验证(Authentication)和会话管理(Session Management):
- 身份验证:确认用户是否为其声称的身份(即 “验明正身”)。
- 会话管理:识别后续哪些 HTTP 请求来自同一用户。
- 访问控制:判定该用户是否被允许执行其尝试的操作。
访问控制失效(Broken Access Controls)是常见且通常具有严重危害的安全漏洞。访问控制的设计与管理是一个复杂的动态问题 —— 需将业务、组织及合规约束融入技术实现中。由于访问控制的设计决策需人工制定,因此出错风险较高。
- 垂直权限提升
- 若用户能够访问其无权限访问的功能,则构成垂直权限提升。例如,非管理员用户若能访问可删除用户账户的管理页面,即属于垂直权限提升。
未受保护的路径
最基础的纵向越权,源于应用对敏感功能完全未加保护。
- 举例:某网站的敏感功能(如
https://insecure-website.com/admin),可能被所有用户访问,而非仅限管理员。这类管理 URL 可能通过robots.txt等途径泄露,即便未公开,攻击者也可能用字典攻击猜解到位置。 - 可能通过 js 代码泄露
- 判定是否为管理员的参数在路径里
- 或者 cookie 等地方
Lab1 robots.txt 泄露
先看下 /robots.txt,找到不可访问的路径,访问即可
Lab2 js 泄露
看 js 代码,找到泄露的路径
Lab3 cookie 泄露
进到 /login,发现不能注册。进到 /admin,发现不是管理员看不了。回到 /login 随便填,抓包看一下,发现 cookie 里泄露了 Admin = false
不知道哪里出了问题,没有看到 cookie 里有 Admin
水平越权
发生在某用户能违规读取其他用户的信息时
Lab userid 泄露
在 user 的 blog 路径中可以看到 uid,然后在 myaccount 的地址中更换 uid 即可。
垂直越权
用户可以通过更改已知路径,从而访问、修改 admin 的信息。
Lab 访问 admin
其实是 administrator……
登录已有账号后,抓包主页,改 id 为 administrator,就可以看到回显的密码,登录即可。
身份验证漏洞
身份验证是确认用户身份真实性的过程。授权则涉及验证用户是否被允许执行特定操作。
暴力破解
暴力破解并非总是单纯地对用户名和密码进行完全随机的猜测。攻击者还能结合基本逻辑或公开可得的知识,对暴力破解攻击进行精细调整,从而做出更具针对性的猜测。只有密码认证的网站容易被如此攻击。
可以看 user 的主页,抓包的返回信息等内容;可以通过已知的用户名来枚举未知用户名;
Lab1 Intruder 的使用
题目给了 username 和 password,直接用 intruder 爆破就可以了。
Tips:非必要情况下,先用 Sniper 限定范围效率更高。
这里补充一下 intruder 的模式:
| 需求场景 | 选哪个模式 |
|---|---|
| 测多个参数,逐个参数灌 Payload | Sniper |
| 多个参数同时灌相同 Payload | Battering ram |
| 多个参数一一对应灌不同 Payload | Pitchfork |
| 多个参数的 Payload 全组合测试 | Cluster bomb |
Lab2 二次验证无效
比较奇怪的题,没有想到二次认证是没用的……登录已给的账户后,可以在邮箱中接收到验证码,然后登录。记下 URL,然后登录另一个给的账号(没有给邮箱),在验证界面直接跳转 URL,就可以到主页了。限制条件有点多,没什么用?
SSRF 服务端请求伪造
服务器端请求伪造是一种网络安全漏洞,允许攻击者诱使服务器端应用程序向非预期位置发送请求。
可能会被用来对内网服务发送请求,导致信息泄露。
比如本来用于请求后端指定信息的 URL:stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1 ,可以被利用为 stockApi=http://localhost/admin ,由于是内网发出的请求,所以不会被按规则拦截。
漏洞成因:
- 访问控制为额外组件,对后端请求不做拦截
- 为 admin 的遗失留后门,所有本地 user 都可以访问
Lab SSRF
先找注入点,在查询时,出现了 stockApi,改成 http://localhost/admin 测试,成功,删除即可
Lab 本地IP扫描
还是上一题的注入点,但是本地的 admin IP 和 stockApi 的 IP 不同了,所以扫描 192.168.0.X:8080/admin,找到异常 IP
文件上传
有时候上传一个文件本身已经很危险了,如果再加上让这个文件执行呢……
漏洞成因:
网站通常不会对用户上传文件完全无限制,但开发者所做的文件上传验证常存在缺陷或易被绕过:
-
黑名单机制可能遗漏危险文件类型,或未考虑文件扩展名解析差异;
-
依赖可被攻击者(通过Burp等工具)篡改的文件属性进行类型校验;
-
验证措施在网站的多主机、多目录间应用不一致,存在可被利用的漏洞。
WebShell:上传到网站上的,使攻击者获得几乎对网站所有控制权的文件,常见形式类似:
<?php echo system($_GET['command']); ?>
Lab1 普通的文件上传
上传了 <?php echo system($_GET['command']); ?> 后访问,改一下 cmd 读取密码就可以了。结果 echo + cat 了两遍……有回显时不需要外层的 echo。
Lab2 MIME 绕过
改一下 MIME 类型就可以了
命令注入
| 命令用途 | Linux 命令 | Windows 命令 |
|---|---|---|
| 当前用户名 | whoami | whoami |
| 操作系统信息 | uname -a | ver |
| 网络配置 | ifconfig | ipconfig /all |
| 网络连接情况 | netstat -an | netstat -an |
| 正在运行的进程 | ps -ef | tasklist |
在注入的命令后添加额外的命令分隔符 & 很有用,因为它能将注入的命令与注入点之后的内容分开,用于测试注入点。
Lab 命令注入
找到的注入点是 productId=2&storeId=1
先尝试最常用的命令分隔符,优先级一般是:| > ; > & > && > ||
于是 payload 为:productId=2&storeId=1|whoami
SQL注入
手动检测 SQL 注入,需对应用的每个输入点进行系统性测试,通常要提交这些内容:
- 单引号
',观察是否出现错误或异常; - 能让输入点返回原值 / 不同值的 SQL 语法,看应用响应是否有规律差异;
OR 1=1、OR 1=2这类布尔条件,观察响应变化;- 会触发 SQL 查询延迟的载荷,对比响应耗时差异;
- 能触发带外网络交互的 OAST 载荷,同时监控交互情况。
另外,用 Burp Scanner 可以快速、可靠地发现大部分 SQL 注入漏洞。
-- 是注释符,后面的语句会被省略
使用
OR 1=1时要小心,如果时删除或更新语句,会造成觉察不到的错误。
Lab SQL闭合
题目给的语句:SELECT * FROM products WHERE category = 'Gifts' AND released = 1
注入点:/filter?category=Clothing%2c+shoes+and+accessories
先把查询的拼进去,就是:...WHERE category = 'Clothing <...>' AND released = 1 ,然后再想怎么注入。
把引号闭合,再把后面的 and 注释掉,payload 为:'+OR+1=1--
在 URL 中,空格不能直接传输(会被解析为参数分隔符),因此需要用
+或%20做 URL 编码,后端接收到后会自动解码为空格。
Lab 用户名-密码校验
password payload:' OR 1=1--
注意,如果要注入在 username 的话,也可以