简介
xss 表示 Cross Site Scripting (跨站脚本攻击),它与 SQL 注入攻击类似,SQL 注入攻击中以 SQL 语句作为用户输入,从而达到查询/修改/删除数据的目的,而在 xss 攻击中,通过插入恶意脚本,实现对用户游览器的控制。
攻击者往 Web 页面里插入恶意 html 标签或者 javascript 代码。比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取 cookie 中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。
XSS分类
XSS 分为三类:
level1
漏洞利用
本关是以 GET 请求,提交 name 参数值 test。
payload:
1
| http://192.168.150.128/xss-labs-master/level1.php?name=<script>alert("xss")</script>
|
源码分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level2.php?keyword=test"; } </script> <title>欢迎来到level1</title> </head> <body> <h1 align=center>欢迎来到level1</h1> <?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>欢迎用户".$str."</h2>"; ?> <center><img src=level1.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html>
|
HTML分析
源码将 HTML 代码和 PHP 混写,在 HTML 中嵌入 PHP 程序块。
html>```:声明文档类型,用来告知 Web 浏览器页面使用了哪种 HTML 版本。1 2 3 4 5 6 7 8 9 10 11 12 13
| ``` <!--...-->```:注释标签
```<html></html>```:这个元素包含了整个页面的内容,也被称作根元素。
```<head></head>```:这个元素放置的内容不是展现给用户的,而是包含例如面向搜索引擎的搜索关键字(keywords)、页面描述、CSS 样式表和字符编码声明等。
```<meta>```:提供了 HTML 文档的元数据。
``` text http-equiv="content-type":在 HTTP 头添加 content-type 字段,表示描述文档类型
content="text/html;charset=utf-8":指定文档类型为 HTML,字符编码为 utf-8
|
"src" 属性指向外部脚本文件。1 2 3 4 5 6 7
| ```<title></title>```:元素可定义文档的标题。
```<h1></h1>```:元素可定义 HTML 标题。这里表示标题一
``` text align=center:规定标题中文本的排列。这里表示居中
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| ```<img>```:向网页中嵌入一幅图像
#### JS 解析
```window.alert = function()```:覆盖 alert() 弹窗
```confirm()```:确认弹窗,有 true(确认)和 false(取消)两个选项。当选择 “确认” 时,会执行下面的代码。在弹窗界面输出 “完成的不错!”
```window.location.href="level2.php?keyword=test"```:向 URL 提交数据 “level2.php?keyword=test”,并进行本页跳转
#### php 解析
```ini_set("display_errors", 0)```:不显示错误报告。为防止用户看到错误信息,而出现的不友好界面。
```$str = $_GET["name"]```:以 GET 方式获取 name 参数的值,并赋值给 $str 变量
```echo "<h2>...</h2>"```:输出标题二
```echo "<h3>...</h3>"```:输出标题三
## level2
### 漏洞利用
本关是以 GET 方式提交 keyword 参数值 test。这一关需要闭合 input 标签。
![level2-1.png](https://i.loli.net/2020/03/22/tRIlZFqjnemKxDL.png)
payload:
``` bash http://192.168.150.128/xss-labs-master/level2.php?keyword="><script>alert("xss")</script><"
|
源码解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level3.php?writing=wait"; } </script> <title>欢迎来到level2</title> </head> <body> <h1 align=center>欢迎来到level2</h1> <?php ini_set("display_errors", 0); $str = $_GET["keyword"]; echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <form action=level2.php method=GET> <input name=keyword value="'.$str.'"> <input type=submit name=submit value="搜索"/> </form> </center>'; ?> <center><img src=level2.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html>
|
php 解析