介绍
跨站点脚本(XSS)是当今Web应用程序中最普遍的漏洞之一。在没有源代码的情况下进行黑匣渗透时,我们通常会通过将有效负载插入到各处输入框中并等待弹框出现来证明漏洞存在当然还有盲插。如果我们能拿到源代码,则查找XSS漏洞可以更快,更轻松。
XSS基础
在搜索XSS漏洞时,该漏洞在所有编程语言中其实都差不多。如果某个应用程序将用户提供的输入放在浏览器中而不验证输入或清除该输入,则它们很可能会受到XSS攻击。
<code>
function(username)
welcome_message = "<h1>Welcome to the site " + username + "</h1>"
return welcome_message to browser
</code>
我们在上面的代码中所看到的,该应用程序正在使用人员用户名并将其返回给H1标头主体中的浏览器。那么我们可以轻松插入恶意javascript代码作为其用户名,从而导致应用程序执行它。
有多种技术可以防止此问题发生,例如使用内容安全策略(CSP)。在源代码中,防止XSS的最常见方法是先清理用户提供的输入,然后再将其返回给浏览器。大多数现代编程语言都带有一个库,可以为开发处理此逻辑。
<code>
function(username)
username = sanitize_input_xss(username)
welcome_message = "<h1>Welcome to the site " + username + "</h1>"
return welcome_message to browser
</code>
如上面的代码所示,我们使用预定义的函数(sanitize_input_xss)在将用户名返回浏览器之前对其进行清理。这样可以防止XSS发生。
例
善于发现源代码漏洞的唯一方法是获得一些实践经验。我们看一下下面的代码。
https://github.com/Learn-by-doing/xss/blob/master/public/index.html
<html>
<head>
<title>Cross-Site Scripting (XSS)</title>
</head>
<body>
<!-- A simple form that when submitted will navigate back to the same page -->
<form action="" method="GET">
<!-- Adds `?q=VALUE` to the URL when the form is submitted -->
<input type="text" name="q">
<input type&#