服务器端的漏洞(相关学习)

什么是访问控制?

访问控制是对有权执行操作或访问资源的人员或内容施加约束。在 Web 应用程序的上下文中,访问控制依赖于身份验证和会话管理:

  • 身份验证确认用户是他们所说的人。
  • 会话管理可识别同一用户正在发出哪些后续 HTTP 请求。
  • 访问控制确定是否允许用户执行他们尝试执行的操作。

访问控制被破坏很常见,并且通常存在严重的安全漏洞。访问控制的设计和管理是一个复杂而动态的问题,它将业务、组织和法律约束应用于技术实现。访问控制设计决策必须由人工做出,因此出错的可能性很高。

!

垂直权限提升

如果用户可以访问不允许他们访问的功能,则这是垂直权限提升。例如,如果非管理用户可以访问管理页面,他们可以在其中删除用户帐户,则这是垂直权限提升。

未受保护的功能

最基本的是,当应用程序不对敏感功能强制实施任何保护时,就会出现垂直权限提升。例如,管理功能可能从管理员的欢迎页面链接,但不能从用户的欢迎页面链接。但是,用户可以通过浏览到相关的管理 URL 来访问管理功能。

例如,网站可能在以下 URL 上托管敏感功能:

https://insecure-website.com/admin

任何用户都可以访问它,而不仅仅是在其用户界面中具有功能链接的管理用户。在某些情况下,管理 URL 可能会在其他位置公开,例如文件: robots.txt

https://insecure-website.com/robots.txt

即使 URL 未在任何地方公开,攻击者也可能能够使用单词列表来暴力破解敏感功能的位置。

在某些情况下,通过为其提供不太可预测的 URL 来隐藏敏感功能。这就是所谓的“隐蔽安全”的一个例子。但是,隐藏敏感功能并不能提供有效的访问控制,因为用户可能会以多种方式发现混淆的 URL。

假设一个应用程序在以下 URL 上托管管理功能:

https://insecure-website.com/administrator-panel-yb556

攻击者可能无法直接猜到这一点。但是,应用程序可能仍会将 URL 泄露给用户。URL 可能会在 JavaScript 中披露,该 JavaScript 根据用户的角色构建用户界面:

<script>
	var isAdmin = false;
	if (isAdmin) {
		...
		var adminPanelTag = document.createElement('a');
		adminPanelTag.setAttribute('https://insecure-website.com/administrator-panel-yb556');
		adminPanelTag.innerText = 'Admin panel';
		...
	}
</script>

如果用户是管理员用户,则此脚本会添加指向用户 UI 的链接。但是,包含 URL 的脚本对所有用户都是可见的,无论其角色如何。

基于参数的访问控制方法

某些应用程序在登录时确定用户的访问权限或角色,然后将此信息存储在用户可控制的位置。这可能是:

  • 一个隐藏的字段。
  • Cookie。
  • 预设查询字符串参数。

应用程序根据提交的值做出访问控制决策。例如:

https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1

这种方法是不安全的,因为用户可以修改他们无权访问的值和访问功能,例如管理功能。

水平权限提升

如果用户能够访问属于其他用户的资源,而不是他们自己的该类型的资源,则会发生水平权限提升。例如,如果员工可以访问其他员工以及他们自己的记录,则这是横向权限提升。

水平权限提升攻击可能使用与垂直权限提升类似的攻击方法。例如,用户可以使用以下 URL 访问自己的帐户页面:

https://insecure-website.com/myaccount?id=123

如果攻击者将参数值修改为其他用户的参数值,则可能会访问其他用户的帐户页面以及相关的数据和功能。id

注意
这是不安全的直接对象引用 (IDOR) 漏洞的一个示例。当用户控制器参数值用于直接访问资源或功能时,就会出现此类漏洞。

在某些应用程序中,可利用的参数没有可预测的值。例如,应用程序可能使用全局唯一标识符 (GUID) 来标识用户,而不是递增数字。这可以防止攻击者猜测或预测其他用户的标识符。但是,属于其他用户的 GUID 可能会在引用用户的应用程序中的其他位置(例如用户消息或评论)中公开。

水平到垂直权限提升

通常,通过损害特权更高的用户,可以将水平权限提升攻击转变为垂直权限提升。例如,水平升级可能允许攻击者重置或捕获属于其他用户的密码。如果攻击者以管理用户为目标并破坏其帐户,则他们可以获得管理访问权限,从而执行垂直权限提升。

攻击者或许能够使用已针对水平权限提升描述的参数篡改技术访问其他用户的帐户页面:

https://insecure-website.com/myaccount?id=456

如果目标用户是应用程序管理员,则攻击者将获得对管理帐户页面的访问权限。此页面可能会泄露管理员的密码或提供更改密码的方法,或者可能提供对特权功能的直接访问。

实验室:文件路径遍历,简单案例

实验室获取地址

解决方案

  • 使用 Burp Suite 拦截和修改获取产品图像的请求。
  • 修改参数,为其赋值:filename
  • ../../../etc/passwd
  • 观察响应是否包含文件的内容。/etc/passwd

操作步骤

打开实验室后右击图片复制图片地址

!

然后复制地址到URL(网站)上,然后就会看到有一个?filename=…的链接,将这个链接修改成?filename=../../../etc/passwd即可过关

!

同时按下F12能查看到一些敏感信息,说明渗透成功。

什么是路径遍历?

路径遍历也称为目录遍历。这些漏洞使攻击者能够读取运行应用程序的服务器上的任意文件。这可能包括:

  • 应用程序代码和数据。
  • 后端系统的凭据。
  • 敏感的操作系统文件。

在某些情况下,攻击者可能能够写入服务器上的任意文件,从而允许他们修改应用程序数据或行为,并最终完全控制服务器。

通过路径遍历读取任意文件

想象一下,一个显示待售商品图像的购物应用程序。这可能会使用以下 HTML 加载图像:

<img src="/loadImage?filename=218.png">

URL 采用参数并返回指定文件的内容。映像文件存储在磁盘上的位置。为了返回图像,应用程序将请求的文件名追加到此基目录,并使用文件系统 API 读取文件的内容。换句话说,应用程序从以下文件路径读取:loadImagefilename/var/www/images/

/var/www/images/218.png

此应用程序不实施针对路径遍历攻击的防御。因此,攻击者可以请求以下 URL 以从服务器的文件系统中检索文件:/etc/passwd

https://insecure-website.com/loadImage?filename=../../../etc/passwd

这会导致应用程序从以下文件路径读取:

/var/www/images/../../../etc/passwd

该序列在文件路径中有效,意味着在目录结构中提升一个级别。三个连续的序列从文件系统根级递增,因此实际读取的文件是:../..//var/www/images/

/etc/passwd

在基于 Unix 的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息,但攻击者可以使用相同的技术检索其他任意文件。

在 Windows 上,和 都是有效的目录遍历序列。以下是针对基于 Windows 的服务器的等效攻击示例:../ *..*

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini