本章讲解XSS漏洞的基础理论 和漏洞利用。主要包含三个方面:跨站脚本攻击漏洞概述、跨站脚本攻击漏洞类型及场景、跨站脚本攻击漏洞实操
一、跨站脚本攻击漏洞概述
1.1 定义
跨站脚本(Cross-site Scripting)攻击,攻击者通过网站注入点注入客户端可执行解析的payload(脚本代码),当用户访问网页时,恶意payload自动加载并执行,以达到攻击者目的(窃取cookie、恶意传播、钓鱼欺骗等)
为了避免与HTML中的CSS相混淆,通常称它为XSS
1.2 危害
二、跨站脚本攻击漏洞类型及利用场景
2.1 基础类型
1)反射型XSS:可用于钓鱼、引流、配合其他漏洞如CSRF等;
- 这种攻击的特点是恶意脚本通过用户提供的数据作为参数嵌入到动态生成的网页链接中。当其他用户点击这个链接时,恶意脚本会在他们的浏览器中执行。反射型XSS通常用于钓鱼攻击、诱导用户点击恶意链接等场景。
就像你在网上看到的那些恶作剧链接,攻击者把一些代码嵌入到链接里,一旦你点击,这些代码就会在你浏览器里执行。这种攻击就像是一次性的,需要你亲自点击链接才会触发。
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>XSS_result</title>
- </head>
- <body>
- <form action="XSS_result.php" method="get">
- please input your name : <br>
- <input type="text" name="name"></input>
- <input type="submit" value="submit"></input>
- </form>
- </body>
- </html>
复制代码- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>XSS_result</title>
- </head>
- <body>
- <form action="" method="get">
- Please input your name: <br>
- <input type="text" name="name" value=" "></input>
- <input type="submit" value="submit"></input>
- </form>
- <?php
- if (array_key_exists("name", $_REQUEST['name'] != NULL)) {
- $name = $_REQUEST['name'];
- echo "welcome *" .$name.'*';
- }
- ?>
- </body>
- </html>
复制代码
上述代码未进行转义处理,存在很大的XSS注入风险
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>XSS_result</title>
- </head>
- <body>
- <form action="" method="get">
- Please input your name: <br>
- <input type="text" name="name" value=" "></input>
- <input type="submit" value="submit"></input>
- </form>
- <?php
- if (array_key_exists("name", $_REQUEST['name'] != NULL)) {
-
- $name = $_REQUEST['name'];
- #str_replace()直接替换函数;区分大小写
- $name = str_replace('<script>', '', $name);
- #preg_replace()正则替换(i表示忽视大小写)
- $name = preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name);
- #htmlspecialchars(string)把预定义的字符:小于、大于、&、单引号、双引号转换为HTML
- $name = htmlspecialchars($name);
- echo "welcome *" .$name.'*';
- }
- ?>
- </body>
- </html>
复制代码
上面的代码虽然有一些改进,但仍有漏洞。例如当只有第一句时:
当输入上述name时,我们能够将中间标红的
|