最近听说burpsuite有一个靶场,以前一直不知道打着试试,按照他提供的路线一步一步的来,因为他这里有比较详细的帮助的按钮,所以很适合新手练习
路径遍历
网址 路径遍历路径遍历(也称为目录遍历)漏洞使攻击者能够与服务器上的任意文件进行交互,从而使他们能够访问敏感数据。如果他们还可以写入这些文件,他们就有可能修改应用程序数据或行为,最终完全控制服务器。
进入后
-
使用 Burp Suite 拦截并修改获取产品图像的请求。
-
-
修改
filename
参数,为其指定值:../../../etc/passwd
-
页面会提示通关
访问控制
垂直提权
如果用户可以获得对他们无权访问的功能的访问权限,那么这就是垂直权限提升。例如,如果非管理用户可以访问管理页面并在其中删除用户帐户,那么这就是垂直权限提升。最基本的是,当应用程序不对敏感功能实施任何保护时,就会出现垂直权限升级。例如,管理功能可以从管理员的欢迎页面链接,但不能从用户的欢迎页面链接。但是,用户可以通过浏览相关的管理 URL 来访问管理功能。
例如,网站可能在以下 URL 托管敏感功能:
https://insecure-website.com/admin
任何用户都可以访问它,而不仅仅是在其用户界面中具有该功能链接的管理用户。在某些情况下,管理 URL 可能会在其他位置公开,例如文件robots.txt
:
https://insecure-website.com/robots.txt
即使 URL 没有在任何地方公开,攻击者也可能能够使用单词列表来暴力破解敏感功能的位置。
robots.txt
通过附加实验室 URL 转到实验室并查看/robots.txt
。请注意,该Disallow
行公开了管理面板的路径。
- 在 URL 栏中,替换
/robots.txt
为/administrator-panel
以加载管理面板。 - 删除
carlos
。
在某些情况下,通过提供不太可预测的 URL 来隐藏敏感功能。这是所谓的“默默无闻的安全”的一个例子。但是,隐藏敏感功能并不能提供有效的访问控制,因为用户可能会通过多种方式发现混淆的 URL。
想象一个在以下 URL 托管管理功能的应用程序:
https://insecure-website.com/administrator-panel-yb556
攻击者可能无法直接猜测到这一点。但是,应用程序仍可能会将 URL 泄露给用户。URL 可能会在 JavaScript 中公开,根据用户的角色构建用户界面:
如果用户是管理员用户,此脚本将添加一个指向用户 UI 的链接。但是,包含 URL 的脚本对所有用户都是可见的,无论其角色如何。
根据他的提示,我们发现这个很可能地址藏在前端中,打开后按f12检查,发现一个地址
成功进入到仪表界面
基于参数的访问控制方法
某些应用程序在登录时确定用户的访问权限或角色,然后将此信息存储在用户可控的位置。这可能是:
- 一个隐藏字段。
- cookie
- 预设的查询字符串参数。
应用程序根据提交的值做出访问控制决策。例如:
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
这种方法是不安全的,因为用户可以修改值并访问他们未授权的功能,例如管理功能。
要求:
直接尝试用/admin不行
发现登陆口更具提示登录
看到要求是仿造cookie,使用burp suite抓包
发现直接定义了admin类型,改为true发送回去
发现出现了admin panel,后续一直改admin的类型就可以了,按照步骤删除carlos即可
水平提权
如果用户能够访问属于另一个用户的资源,而不是他们自己的该类型资源,则会发生水平权限提升。例如,如果一名员工可以访问其他员工以及自己的记录,那么这就是水平权限提升。
水平权限升级攻击可以使用与垂直权限升级类似的利用方法。例如,用户可以使用以下 URL 访问自己的帐户页面:
https://insecure-website.com/myaccount?id=123
如果攻击者将id
参数值修改为其他用户的参数值,他们可能会获得对其他用户的帐户页面以及相关数据和功能的访问权限。
笔记
这是不安全的直接对象引用 (IDOR) 漏洞的示例。当用户控制器参数值用于直接访问资源或功能时,就会出现此类漏洞。
在某些应用中,可利用的参数没有可预测的值。例如,应用程序可以使用全局唯一标识符 (GUID) 来识别用户,而不是递增的数字。这可以防止攻击者猜测或预测另一个用户的标识符。然而,属于其他用户的 GUID 可能会在应用程序中引用用户的其他地方公开,例如用户消息或评论。
要求:
根据提示我们先登录,再看看报文是什么样的。发现没有什么特殊的地方,
去看了一下,官方的解决办法
- 查找 的博客文章
carlos
。 - 单击
carlos
并观察 URL 包含他的用户 ID。记下此 ID。 - 使用提供的凭据登录并访问您的帐户页面。
- 将“id”参数更改为保存的用户 ID。
- 检索并提交 API 密钥。
点击carlos的账户出现了
id:7c400002-b17c-4713-a6de-d89173c69f30
打开个人账户抓包拦截后,改id提交发现已经移动过去了。
水平到垂直的权限提升
通常,通过损害更有特权的用户,水平权限升级攻击可以转变为垂直权限升级。例如,水平升级可能允许攻击者重置或捕获属于另一个用户的密码。如果攻击者以管理用户为目标并危害其帐户,那么他们可以获得管理访问权限,从而执行垂直权限升级。
攻击者可能能够使用已经描述的水平权限升级参数篡改技术来访问另一个用户的帐户页面:
https://insecure-website.com/myaccount?id=456
如果目标用户是应用程序管理员,那么攻击者将获得对管理帐户页面的访问权限。此页面可能会泄露管理员的密码或提供更改密码的方法,或者可能提供对特权功能的直接访问。
要求
登录后抓包
发现下面有一个id=,想到要求将其改为administrator,发送。返送2xnhfzlzrdtfqlpg7m62
复制登陆即可
身份验证漏洞
从概念上讲,身份验证漏洞很容易理解。然而,由于身份验证和安全性之间的明确关系,它们通常至关重要。
身份验证漏洞可能使攻击者能够访问敏感数据和功能。它们还暴露了额外的攻击面以供进一步利用。因此,了解如何识别和利用身份验证漏洞以及如何绕过常见的保护措施非常重要。
在本节中,我们解释:
- 网站最常用的身份验证机制。
- 这些机制中存在潜在的漏洞。
- 不同身份验证机制中固有的漏洞。
- 由于实施不当而引入的典型漏洞。
- 如何使您自己的身份验证机制尽可能强大。
身份验证和授权有什么区别?
身份验证是验证用户是否是其所声称的身份的过程。授权涉及验证是否允许用户执行某些操作。例如,身份验证确定尝试使用该用户名访问网站的人是否Carlos123
确实是创建该帐户的同一人。一旦Carlos123
通过身份验证,他们的权限就决定了他们被授权执行的操作。例如,他们可能被授权访问其他用户的个人信息,或执行删除其他用户帐户等操作。
暴力攻击
暴力攻击是指攻击者使用试错系统来猜测有效的用户凭据。这些攻击通常是使用用户名和密码的单词列表自动进行的。自动化此过程,尤其是使用专用工具,可能使攻击者能够高速进行大量登录尝试。
暴力破解并不总是只是对用户名和密码进行完全随机的猜测。通过使用基本逻辑或公开可用的知识,攻击者可以微调暴力攻击,以做出更有根据的猜测。这大大提高了此类攻击的效率。依赖基于密码的登录作为唯一的用户身份验证方法的网站如果没有实施足够的强力保护,可能会非常容易受到攻击。
暴力破解用户名
如果用户名符合可识别的模式(例如电子邮件地址),则特别容易被猜到。例如,常见的格式是企业登录信息firstname.lastname@somecompany.com
。然而,即使没有明显的模式,有时甚至会使用可预测的用户名创建高权限帐户,例如admin
或administrator
。
在审核过程中,检查网站是否公开披露潜在的用户名。例如,您是否可以在不登录的情况下访问用户个人资料?即使配置文件的实际内容被隐藏,配置文件中使用的名称有时也与登录用户名相同。您还应该检查 HTTP 响应以查看是否泄露了任何电子邮件地址。有时,响应会包含高权限用户(例如管理员或 IT 支持人员)的电子邮件地址。
暴力破解密码
密码也可以类似地被暴力破解,其难度根据密码的强度而变化。许多网站采用某种形式的密码策略,迫使用户创建高熵密码,至少在理论上,仅使用暴力破解更难破解这些密码。这通常涉及通过以下方式强制使用密码:
- 最少字符数
- 小写和大写字母的混合
- 至少一个特殊字符
然而,虽然高熵密码很难仅靠计算机来破解,但我们可以利用人类行为的基本知识来利用用户无意中引入该系统的漏洞。用户通常不会使用随机的字符组合来创建强密码,而是使用他们能记住的密码并尝试将其破解以适应密码策略。例如,如果mypassword
不允许,用户可以尝试类似Mypassword1!
或 的操作Myp4$$w0rd
。
如果策略要求用户定期更改密码,则用户通常只对其首选密码进行较小的、可预测的更改。例如,Mypassword1!
成为Mypassword1?
或Mypassword2!.
了解可能的凭据和可预测的模式意味着暴力攻击通常比简单地迭代每种可能的字符组合更加复杂,因此也更加有效。
用户名枚举
用户名枚举是指攻击者能够观察网站行为的变化,以确定给定的用户名是否有效。
用户名枚举通常发生在登录页面上(例如,当您输入有效的用户名但密码不正确时),或者在注册表单上(当您输入已使用的用户名时)。这大大减少了暴力登录所需的时间和精力,因为攻击者能够快速生成有效用户名的候选列表。
在尝试暴力破解登录页面时,您应该特别注意以下方面的任何差异:
- 状态码:在暴力攻击期间,返回的 HTTP 状态码对于绝大多数猜测来说可能都是相同的,因为大多数猜测都是错误的。如果猜测返回不同的状态代码,则强烈表明用户名是正确的。无论结果如何,网站始终返回相同的状态代码是最佳实践,但并不总是遵循这种做法。
- 错误消息:有时返回的错误消息会有所不同,具体取决于用户名和密码是否不正确或仅密码不正确。网站的最佳做法是在这两种情况下使用相同的通用消息,但有时会出现小的打字错误。只要一个字符不合适,就会使两条消息截然不同,即使该字符在呈现的页面上不可见。
- 响应时间:如果大多数请求都以相似的响应时间处理,则任何偏离此时间的情况都表明幕后发生了不同的事情。这再次表明猜测的用户名可能是正确的。例如,如果用户名有效,网站可能只会检查密码是否正确。此额外步骤可能会导致响应时间略有增加。这可能很微妙,但攻击者可以通过输入过长的密码来使这种延迟变得更加明显,而网站需要更长的时间来处理。
要求:
发现一个平平无奇的登录界面,先试试最简单的administrator
突然发现它提供了单词列表,点击候选人用户名就可以 看到,那么直接拦截登录报,发送到intruder里面,尝试注入
选择cluster bomb—添加变量符号—payloads,
这里的变量2就是第几个变量的位置,点击就可以切换到变量1,配置好字典后,点击start attack
接下来通过报文长度和响应状态码来进行筛选判断
登录成功
绕过双因素身份验证
有时,双因素身份验证的实施存在缺陷,以至于可以完全绕过它。
如果首先提示用户输入密码,然后提示用户在单独的页面上输入验证码,则用户在输入验证码之前实际上处于“登录”状态。在这种情况下,值得测试一下在完成第一个身份验证步骤后是否可以直接跳到“仅登录”页面。有时,您会发现网站在加载页面之前实际上并没有检查您是否完成了第二步。
要求:
先测试一下发现登录报文明文传输账号和密码,然后登录后需要4位验证码,考虑尝试使用拦截登录包更改为要求中的账户名和密码
发现一段加密后key,尝试了一些主流的算法解密,不行。说明不是这个。查看官方的解释。
- 登录您自己的帐户。您的 2FA 验证码将通过电子邮件发送给您。单击电子邮件客户端按钮访问您的电子邮件。
- 转到您的帐户页面并记下 URL。
- 退出您的帐户。
- 使用受害者的凭据登录。
- 当提示输入验证码时,手动更改 URL 以导航到
/my-account
。当页面加载时,实验室就解决了。
原来这里还有一个邮件客户端
发现邮件登陆后。
发现上面url直接是格式,按照要求更换账号登录,在切换url,完成
服务器端伪造请求
什么是 SSRF?
服务器端请求伪造是一种 Web 安全漏洞,允许攻击者导致服务器端应用程序向非预期位置发出请求。
在典型的 SSRF 攻击中,攻击者可能会导致服务器连接到组织基础设施内的仅供内部使用的服务。在其他情况下,他们可能能够强制服务器连接到任意外部系统。这可能会泄露敏感数据,例如授权凭据。
针对服务器的 SSRF 攻击
在针对服务器的 SSRF 攻击中,攻击者会导致应用程序通过环回网络接口向托管该应用程序的服务器发出 HTTP 请求。这通常涉及提供带有主机名的 URL,例如127.0.0.1
(指向环回适配器的保留 IP 地址)或localhost
(同一适配器的常用名称)。
例如,想象一个购物应用程序,它允许用户查看特定商店中是否有商品的库存。为了提供股票信息,应用程序必须查询各种后端 REST API。它通过前端 HTTP 请求将 URL 传递到相关后端 API 端点来实现此目的。当用户查看商品的库存状态时,他们的浏览器会发出以下请求:
POST /product/stock HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 118 stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1
这会导致服务器向指定的 URL 发出请求,检索库存状态,并将其返回给用户。
在此示例中,攻击者可以修改请求以指定服务器本地的 URL:
POST /product/stock HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 118 stockApi=http://localhost/admin
服务器获取/admin
URL 的内容并将其返回给用户。
攻击者可以访问该/admin
URL,但管理功能通常只有经过身份验证的用户才能访问。这意味着攻击者不会看到任何感兴趣的内容。但是,如果对 URL 的请求/admin
来自本地计算机,则会绕过正常的访问控制。应用程序授予对管理功能的完全访问权限,因为请求似乎源自受信任的位置。
为什么应用程序会以这种方式运行,并隐式信任来自本地计算机的请求?出现这种情况的原因有多种:
- 访问控制检查可以在位于应用程序服务器前面的不同组件中实现。当重新连接到服务器时,检查将被绕过。
- 出于灾难恢复的目的,应用程序可能允许来自本地计算机的任何用户无需登录即可进行管理访问。这为管理员提供了一种在丢失凭据时恢复系统的方法。这假设只有完全信任的用户会直接来自服务器。
- 管理界面可能侦听与主应用程序不同的端口号,并且用户可能无法直接访问。
这种信任关系(其中源自本地计算机的请求的处理方式与普通请求不同)通常使 SSRF 成为严重漏洞。
要求:
根据题目推测,我们需要重点观察使用库存检查的时候的报文变化。
更具要求,我们尝试直接用stockApi=http://localhost/admin
,发现直接400
看了半天,发现原来是自己打错了,前面还在用原本的网址
找到了地址,复制发送即可
针对另一个后端系统的基本 SSRF
要求:
先看看报文
我们看到要求,是需要扫描那个网段找到具体是多少。利用intruder功能
发现36很可疑,右键发到repeater中看看
找到了连接后,复制发送,ok过了
文件上传漏洞
什么是文件上传漏洞?
文件上传漏洞是指 Web 服务器允许用户在未充分验证文件名称、类型、内容或大小等信息的情况下将文件上传到其文件系统。如果未能正确执行这些限制,可能意味着即使是基本的图像上传功能也可以用来上传任意且具有潜在危险的文件。这甚至可能包括启用远程代码执行的服务器端脚本文件。
在某些情况下,上传文件的行为本身就足以造成损害。其他攻击可能涉及对文件的后续 HTTP 请求,通常是为了触发服务器执行该文件。
文件上传漏洞是如何产生的?
考虑到相当明显的危险,野外网站很少对允许用户上传的文件没有任何限制。更常见的是,开发人员实施了他们认为稳健的验证,但这些验证要么存在固有缺陷,要么很容易被绕过。
例如,他们可能尝试将危险文件类型列入黑名单,但在检查文件扩展名时未能考虑到解析差异。与任何黑名单一样,也很容易意外地忽略可能仍然危险的更模糊的文件类型。
利用不受限制的文件上传来部署 Web shell
从安全角度来看,最糟糕的情况是网站允许您上传服务器端脚本(例如 PHP、Java 或 Python 文件),并且还配置为将它们作为代码执行。这使得在服务器上创建您自己的 Web shell 变得非常简单。
web shell
Web shell 是一种恶意脚本,攻击者只需将 HTTP 请求发送到正确端点即可在远程 Web 服务器上执行任意命令。
如果您能够成功上传 Web shell,则您实际上可以完全控制服务器。这意味着您可以读取和写入任意文件、窃取敏感数据,甚至使用服务器对内部基础设施和网络外部的其他服务器进行攻击。例如,以下 PHP 单行代码可用于从服务器的文件系统读取任意文件:
<?php echo file_get_contents('/path/to/target/file'); ?>
上传后,发送对此恶意文件的请求将在响应中返回目标文件的内容。
更通用的 Web shell 可能如下所示:
<?php echo system($_GET['command']); ?>
该脚本使您能够通过查询参数传递任意系统命令,如下所示:
GET /example/exploit.php?command=id HTTP/1.1
要求:
很简单的描述
本打算直接用一句话木马,搭配蚁剑来远程shell,但是本地写一个带木马的php是被秒杀的,所以还是用的他这个。文件上传漏洞就是要找到文件的位置,我们先上传一个正常的文件,看看上传的路径都在那儿。
这里我们需要留一个请求,来帮助我们待会执行命令
上传它提示的木马后,发送get执行
其实也可以右键直接执行
利用文件上传验证缺陷
在外边环境中,您不太可能找到像我们在之前的实验室中看到的那样没有针对文件上传攻击的保护的网站。但仅仅因为防御到位,并不意味着它们是强大的。有时您仍然可以利用这些机制中的缺陷来获取用于远程代码执行的 Web shell。
文件类型验证有缺陷
POST
提交 HTML 表单时,浏览器通常会在内容类型为 的请求 中发送提供的数据application/x-www-form-url-encoded
。这非常适合发送简单的文本,例如您的姓名或地址。但是,它不适合发送大量二进制数据,例如整个图像文件或 PDF 文档。在这种情况下,内容类型multipart/form-data
是首选。
有缺陷的文件类型验证
考虑一个包含用于上传图像、提供图像描述和输入用户名的字段的表单。提交此类表单可能会产生如下所示的请求:
POST /images HTTP/1.1
Host: normal-website.com
Content-Length: 12345
Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg
[...binary content of example.jpg...]
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="description"
This is an interesting description of my image.
---------------------------012345678901234567890123456
Content-Disposition: form-data; name="username"
wiener
---------------------------012345678901234567890123456--
正如您所看到的,对于每个表单的输入,消息正文被分成单独的部分。每个部分都包含一个Content-Disposition
标头,它提供了有关与其相关的输入字段的一些基本信息。这些单独的部分还可能包含自己的Content-Type
标头,该标头告诉服务器使用此输入提交的数据的 MIME 类型。
网站可能尝试验证文件上传的一种方法是检查此特定于输入的Content-Type
标头是否与预期的 MIME 类型匹配。例如,如果服务器只需要图像文件,它可能只允许image/jpeg
和等类型image/png
。当服务器隐式信任此标头的值时,可能会出现问题。如果没有执行进一步的验证来检查文件的内容是否确实与假定的 MIME 类型匹配,则可以使用 Burp Repeater 等工具轻松绕过此防御。
要求:
更具要求应该是有限制条件不允许上传php的文件了
果然设置了白名单,这里可以选择修改类型绕过,也可以用图片马。当然如果是前端验证就可以直接绕过了,还可以在浏览器里面禁用javascrip这里就直接选择绕过先试试吧。
修改shell为png,在拦截改为php。上传成功
收工
操作系统命令注入
https://portswigger.net/web-security/learning-paths/server-side-vulnerabilities-apprentice/os-command-injection-apprentice/os-command-injection/what-is-os-command-injection
什么是操作系统命令注入?
操作系统命令注入也称为 shell 注入。它允许攻击者在运行应用程序的服务器上执行操作系统 (OS) 命令,并且通常会完全破坏应用程序及其数据。通常,攻击者可以利用操作系统命令注入漏洞来危害托管基础设施的其他部分,并利用信任关系将攻击转向组织内的其他系统。
常见的指令
识别操作系统命令注入漏洞后,执行一些初始命令以获取有关系统的信息非常有用。以下是一些在 Linux 和 Windows 平台上有用的命令的摘要:
命令的目的 Linux windows
当前用户名 whoami whoami
操作系统 uname -a ver
网络配置 ifconfig ipconfig /all
网络连接 netstat -an netstat -an
正在运行的进程 ps -ef tasklist
要求:
现在repeater里面试口令
ok过了
SQL 注入 (SQLi)
SQL 注入 (SQLi) 是一种 Web 安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。这可能允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据或应用程序可以访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持久更改。在某些情况下,攻击者可以升级 SQL 注入攻击以危害底层服务器或其他后端基础设施。它还可以使他们执行拒绝服务攻击。
如何检测sql漏洞
您可以针对应用程序中的每个入口点使用一组系统测试来手动检测 SQL 注入。为此,您通常需要提交:
- 单引号字符
'
并查找错误或其他异常。 - 一些特定于 SQL 的语法,用于计算入口点的基本(原始)值和不同的值,并查找应用程序响应中的系统差异。
- 布尔条件,例如
OR 1=1
和OR 1=2
,并查找应用程序响应中的差异。 - 有效负载旨在在 SQL 查询中执行时触发时间延迟,并查找响应时间的差异。
- OAST 有效负载旨在在 SQL 查询中执行时触发带外网络交互,并监视任何生成的交互。
或者,您可以使用 Burp Scanner 快速可靠地找到大多数 SQL 注入漏洞。
检索隐藏数据
想象一个显示不同类别产品的购物应用程序。当用户单击**“礼品”**类别时,他们的浏览器会请求以下 URL:
https://insecure-website.com/products?category=Gifts
这会导致应用程序执行 SQL 查询以从数据库中检索相关产品的详细信息:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
此 SQL 查询要求数据库返回:
- 所有详细信息 (
*
) - 从
products
表中 - 哪里
category
是Gifts
- 并且
released
是1
。
该限制released = 1
用于隐藏未发布的产品。我们可以假设对于未发布的产品,released = 0
.
该应用程序没有针对 SQL 注入攻击实施任何防御措施。这意味着攻击者可以构造以下攻击,例如:
https://insecure-website.com/products?category=Gifts'--
SQL 查询结果如下:
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
至关重要的是,请注意这--
是 SQL 中的注释指示符。这意味着查询的其余部分将被解释为注释,从而有效地将其删除。在此示例中,这意味着查询不再包含AND released = 1
.结果,所有产品都会显示出来,包括尚未发布的产品。
您可以使用类似的攻击来使应用程序显示任何类别中的所有产品,包括他们不知道的类别:
https://insecure-website.com/products?category=Gifts'+OR+1=1--
SQL 查询结果如下:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
category
修改后的查询返回isGifts
或1
等于 的 所有项目1
。一如既往1=1
,查询返回所有项目。
警告
将条件注入OR 1=1
SQL 查询时要小心。即使它在您注入的上下文中看起来无害,但应用程序在多个不同查询中使用来自单个请求的数据是很常见的。例如, 如果您的条件达到UPDATE
or语句,则可能会导致数据意外丢失。DELETE
要求:
我们要他的要求和提示做的时将AND released = 1给注释掉,直接在url里面操作就可实现
要求::
找了一圈,发现唯一存在注入的,可能只有登录的时候存在数据库相关。
只能一个一个的试,这里考虑的是把密码验证给绕过。
最后尝试在administrator后面加上’–成功绕过