URL参数操作和注入

信息安全 php javascript 注射 Python WordPress
2021-09-04 14:10:29

我有一个有 2 个站点的场景。站点 1 是 mysite.com,站点 2 是 secondurl.com。

站点 1 正在使用 Wordpress。在那里,我做了一个 Javascrit/jQuery 例程来检查给定的 url 参数是否进入。如果参数“p”存在于查询字符串中,我对我的主页上指向站点 2 的所有 URL 进行替换,现在,传递这给出了通过查询字符串传入的值,如下所示:

<a href="secondurl.com">Link </a>

<a href="secondurl.com?p=value">Link </a>

正如我之前提到的,“价值”是在访问站点 1 时通过查询字符串获得的。喜欢:

mysite.com?p=123

我不处理查询字符串,我只是获取 p 的值并使用该参数生成第二个 url。两个站点都在同一台服务器上,站点 1 使用 wordpress,站点 2 使用纯 PHP。

这个使用 jQuery 的 url 替换是否会打开我的服务器上同时拥有这两个站点的任何漏洞?如果是,是否有人可以使用该漏洞在我的服务器上放置 python 或 php 脚本?

2个回答

tl/dr:您是否有反射型 XSS 漏洞取决于您用于附加数据的确切方法。因此,您应该专门检查您选择的方法以确保它是安全的。现代 javascript 框架通常会自动为您处理这些事情,但 jQuery 不会,因此对细节的关注至关重要。

您不必特别担心站点 1 和站点 2 之间的交互。原因是站点 2 无论如何都需要以所有正常方式安全(使用准备好的查询等)。恶意用户不会使用站点 1 来攻击站点 2(在这种情况下),因为如果他们愿意,他们可以直接攻击站点 2。

所以这里的主要问题是站点 1 是否易受攻击。需要明确的是,担心的是反射 XSS 攻击的可能性(这是 ExecutionByFork 在他们的回答中提到的)。举一个简单的例子,如果用户访问这个 URL 会发生什么:

http://mysite.com?p="><script>alert(1)</script>

如果您将p参数添加到所有其他链接的方式隐含地将其内容视为 HTML,那么您最终将在页面中注入一个实际的标签,在经典的反射 XSS 攻击script中执行攻击者 javascript

所以问题是:您p是以一种可能将数据视为 HTML(创建漏洞)的方式附加参数,还是以安全的方式附加它?该问题的答案归结为您用于附加数据的特定方法。让我举两个例子:

非常安全:.prop()

使用 jQuery.prop方法是安全的,因为它依赖于设置相应 DOM 节点的属性。通过这样做,没有机会逃避属性上下文。从本质上讲,您发送到该.prop方法的任何内容都只会被视为字符串,没有执行的机会。所以像这样代码可以免受反射型 XSS 攻击:

var link = $('a').first();
old_href = link.prop('href');
link.prop('href', old_href + '?p=' + injected_data))

但是,如果用户完全控制了最终结果,这将是不安全的href(例如,如果您没有附加,而是仅根据用户输入设置 href)。在这种情况下,用户可以切换链接以执行 javascript,如下所示:

http://mysite.com?p=javascript:alert(1)

这将导致如下代码的漏洞:

link.prop('href', injected_data))

只要您将数据附加到已经存在的东西上,这是不可能的。但是,如果 href 标记之前是空的,您最终可能会遇到漏洞(尽管它只会在用户单击链接时触发:不仅仅是通过加载页面)。

当然,即使这样也不能保证安全性,因为潜在的恶意数据隐藏在您的应用程序中会导致问题。您可能会忘记hrefnow 包含用户数据,如果其他一些 javascripthref从链接中抓取并尝试对其进行处理,则可能会造成麻烦。另外,请记住,当有人单击链接时,此恶意数据将被传递到站点 2,因此站点 2 需要适当地保护自己(无论如何之前都是如此,所以这并不是您不知道的任何事情)。

不安全:.replaceWith()

但是,许多其他 javascript 方法将允许您的字符串被视为 HTML,这将导致反射 XSS。事实上,可能有比安全方法更危险的方法,因此您可能应该验证您使用的任何方法实际上是安全的。不过,举个例子,.replaceWith()将把你的字符串评估为 HTML。所以这样的事情会很危险:

link = $('a').first();
old_href = link.prop('href');
link.replaceWith('<a href="' + old_href + '?p=' + injected_data + '">click here</a>');

您的网站可能容易受到反射型 XSS 攻击(这取决于您如何设置该值以及如何解释数据)。例如,假设我访问以下 URL:

mysite.com?p="></a><script>malicious_code()</script><a href="

如果您的网站转换此:

<a href="secondurl.com">Link </a>

进入这个:

<a href="secondurl.com?p="></a><script>malicious_code()</script><a href="">Link </a>

然后如果用户的浏览器解析更新的 HTML,malicious_code()就会立即在他们的浏览器中执行。请注意,这不是执行 XSS 的唯一方法。最终,这取决于您的网站如何获取用户数据并将其添加到href属性中,因此即使<script>标签在这种特定情况下不起作用,其他方法也很容易。查看OWASP 的 XSS 过滤器规避备忘单作为示例。

这就是为什么确保来自用户的数据在包含在以后被解释为代码的数据中时始终被清理很重要的原因。如果用户输入从未用作说明,那么不清理该数据通常是安全的。但是,请注意注入可能发生在下游的任何地方。很容易忘记不是直接来自用户的数据可能没有经过清理。

这会危及您的服务器吗?不是直接的,但它仍然是一个巨大的安全漏洞,应该修补。使用 XSS,攻击者可以向您发送一个链接以在您的机器上执行 javascript 。如果您碰巧登录了,他们就可以窃取您的会话 cookie 并使用它来访问 wordpress 站点,就好像他们是您一样。这将使他们能够访问您通常可以访问的任何管理面板,并且他们可以从那里提升他们的权限。

注意:您应该考虑的另一件事是如何使用传递给secondurl.com. 这是另一个可能允许访问您的站点的向量,因为它最终由用户控制。