Burp靶场:Server-side vulnerabilities

记录学习和题解

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=1OR 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 的话,也可以