先写个简单的xss进行注入,发现没有发挥作用,于是查看源码:
明显,无论是 ' 还是<>都被编码了,所以选择闭合标签或者属性的方式就行不通了,我们查阅一下W3school(链接:HTML <a> href 属性)
HTML <a> href 属性
定义和用法
href
属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href
属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
如果 href
属性不存在,则 <a> 标签将不是超链接。
思路就有了,我们可以尝试在herf标签里面写入JavaScript的代码,也就是利用JavaScript协议
JavaScript 协议和 JavaScript 伪协议实际上是同一个概念。它们都指的是一种在 URL 中执行 JavaScript 代码的方法。这种方法以 javascript:
开头,后面跟着要执行的 JavaScript 代码。这个特殊的 URL 被称为 JavaScript URL 或 JavaScript 伪协议。
JavaScript 协议和 JavaScript 伪协议的使用
-
JavaScript 协议的基本形式:
- 在浏览器的地址栏中输入
javascript:
后跟着要执行的 JavaScript 代码。 - 示例:
- 在浏览器的地址栏中输入
javascript:alert('Hello, World!');
在 HTML 中的使用:
- 可以在 HTML 的某些属性中使用 JavaScript URL,例如
<a>
标签的href
属性或<img>
标签的src
属性。 - 示例:
<a href="javascript:alert('Click!')">Click me</a>
<img src="javascript:alert('Image clicked!')" alt="Image">
利用JavaScript协议。输入payload:javascript:alert('XSS')
拿下!
补充:——如何防止<a>herf标签里的xss攻击呢?——
HTML转义:
-
在输出时,对用户提供的数据进行 HTML 转义,将特殊字符转换为 HTML 实体。
-
PHP中使用
htmlspecialchars()
函数,JavaScript中使用encodeURI()
或encodeURIComponent()
函数。示例(PHP):
-
$userInput = "<script>alert('XSS');</script>"; $safeOutput = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8'); echo '<a href="' . $safeOutput . '">Link</a>';
URL编码:
-
对用户提供的数据进行 URL 编码,以确保 URL 中的特殊字符不会被解释为 HTML 或 JavaScript 代码。
-
JavaScript中使用
encodeURI()
或encodeURIComponent()
函数。示例(JavaScript):
-
var userInput = "<script>alert('XSS');</script>"; var safeOutput = encodeURI(userInput); document.getElementById("myLink").href = safeOutput;
Content Security Policy(CSP):
-
使用 Content Security Policy,它是一种通过设置 HTTP 头来限制浏览器加载内容的机制,可以防止执行内联脚本和其他不受信任的内容。
示例(HTTP 头):
-
Content-Security-Policy: default-src 'self';
如果想在 JavaScript 伪协议中以 http
或 https
开头,通常是为了实现一些动态的操作,比如跳转到其他网页。以下是一些示例:
在浏览器地址栏中执行:
javascript:window.location.href = 'http://example.com';
这会将当前页面重定向到 http://example.com
。
在 HTML 中使用:
<a href="javascript:window.location.href='http://example.com';">Visit Example</a>
点击链接时,同样会触发页面重定向。