Web漏洞-XSS跨站之代码及Http Only绕过-XSS Labs靶场详细通关教程-WAF绕过及安全修复

目录

一、导图

二、Http Only

三、Http Only应用实例

四、应对方法

五、XSS-LABS靶场实操

六、WAF绕过及安全修复


一、导图

二、Http Only

1.什么是Http Only?

如果您在cookie中设置了HttpOnly属性,那么通过is脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。

2.javaEE的API是否支持?

目前sun公司还没有公布相关的AP1,但PHP、C#均有实现。

3.Http Only的设置样例

  • javaEE
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

设置完毕后通过 js 脚本是读不到该 cookie 的,但使用如下方式可以读取。

Cookie cookies[]=request.getCookies(); 
  • C#
HttpCookie myCookie = new HttpCookie("myCookie");   
myCookie.HttpOnly = true;   
Response.AppendCookie(myCookie);  
  • PHP4
header("Set-Cookie: hidden=value; httpOnly");  
  • PHP5
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);   

最后一个参数为 HttpOnly 属性。

三、Http Only应用实例

1.在目标文件中插入httponly开启语句。

2.访问对应网站的地址。

3.打开XSS平台,将js脚本进行复制。

4.将脚本插入到目标网站的源代码中

5.登陆网站。

6.访问index.php,让网站加载跨站语句。

7.检查页面可以发现网站尝试加载跨站语句。

8.为了确保成功,将跨站语句也写道登陆后的网站的原码里。

9.再次登陆网站。

10.回到XSS平台,可以看到cookie的值为空。

11.由此可见,如果httponly出现的话,使用XSS来获取cookie基本就可以被拦截下来。

四、应对方法

        根据上面的实验可以知道,如果httponly出现的话,使用XSS来获取cookie基本就可以被拦截下来。那么由此我们就会想到,如果遇到了httponly后,我们需要怎么进行操作呢?

        首先要想到的是,它知识阻止cookie被我们获取到,但是不会阻止跨站语句的执行。

1.我们在这里写一个弹窗语句进行验证。

2.再次访问网站后,可以返现弹窗语句被成功执行了。

3.因此当我们获取cookie被httponly拦截后,我们可以采取一些其它的方案,下面进行介绍。

4.因为我们获取cookie是为了进入后台,而进入后台的方法共有两种。

  • 一种是:使用cookie进入后台
  • 另一种:使用账号和密码进行登陆

5.此时cookie的获取被进行了拦截,所以我们只能考虑使用账号和密码来进入后台。

6.有一种大家都知道的情况,就是当我们使用账号和密码登陆一个网站的时候,浏览器有时会记录登陆的账号以及密码,有时又不会。因此,就分出了下面两种情况。

  • 保存了:可以通过浏览器的记载来获取账号和密码。
  • 没保存:可以利用表单劫持

7.首先介绍没有保存数据的情况,在XSS平台内,我们可以看到表单劫持的这个选项。

8.我们可以在提交账号密码的时候进行抓包,可以看到数据包内包含着登陆的账号和密码,表单劫持就是相当于将这个表单再进行发送一次,一个给服务器,另一个给跨站平台。

9.但是本次攻击时产生再登录框的,如果跨站漏洞没有出现在登录框里,上面这种方法就是不可行的,因此表单劫持是有一定的条件的,如果采用登录框表单劫持,那么跨站漏洞就是必定出现在登录框的位置。

10.下面介绍保存了数据的情况,在XSS平台内我们可以到有下面的一个选项。

11.将表单内的内容对应填如到跨站平台,之后下拉点击"配置"。

12.此时这个项目就成了专门获取浏览器保存账号和密码的地方。

五、XSS-LABS靶场实操

<level-1>

1.将靶场环境搭建好后打开靶场。

 2.点击图片打开第一关。

3.可以看到网页内和url内均存在“text”字样,因此猜测二者相对应,进而想到我们可以通过此处来执行跨站语句。

4.因此我们将url内的参数更改为弹窗语句来测试跨站漏洞(弹窗语句如下),如果成功返回的弹窗就说明这个地方能够加载js代码,这个位置存在跨站漏洞(反射型的)。

<script>alert(1)</script>

5.将弹窗语句输入后成功通过了level-1。

<level-2>

1.来到第二关后可以看到url内以及网页内的两个位置均包含“text”字样。

 2.当我们修改url内的参数时,网页内的“text”也会发生对应变化,由此可以想到通过此处来执行跨站语句。

3.再次将我们level1中用到的js语句输入到参数后,但是发现这次虽然网页的内容跟着发生了变化,但是并没有弹窗弹出,此方法没能通过level2。

<script>alert(1)</script>

4.那么下面我们就来介绍如何手工来判断跨站漏洞,以及遇到了这种情况应该怎么解决。

5.首先我们选中网页内我们刚刚输入的跨站语句,点击鼠标右键后选择“查看元素”来查看刚刚输入的代码。

 6.右键代码后进入编辑模式。

 7.可以看到我们输入的js代码内被插入了很多其它字符。

8.那么这种情况是什么原因造成的呢? 

9.查看其原码可以发现其原码内包含一个htmlspecialcharm函数。

        补充:php htmlspecialchars()函数将特殊字符转换为HTML实体。

        这个函数将我们js语句中的"<"、">"符号转换成了"&lt;",因此导致js语句不能正常执行。

 10.遇到这种情况我们该怎么处理呢?

11.经过观察可以看到查看器里后面还包含着另一串没有被转换的我们输入的js语句,但是因为其两侧存在引号,导致js语句不能被正常执行,由此我们不难想到将其进行闭合。

 12.将js语句修改为下面的形式再次进行尝试。

"><script>alert(1)</script>

        这里补充一下为什么不将后面也闭合:不闭合后面仅会导致语法错误,并不会影响js语句的执行。 

 13.将js语句修改后成功通过了level-2。

<level-3>

1.来到第三关,可以看到第三关是一个搜索框。

 2.我们随便搜索“111”后观察网址的变化。

http://127.0.0.1/xss-labs/level3.php?writing=wait


http://127.0.0.1/xss-labs/level3.php?keyword=111&submit=%E6%90%9C%E7%B4%A2

3.我们像上一关一样进入查看器查看,可以看到一样有两个地方出现了我们输入的“111”。

 4.由此联想到使用上一关的方法输入js语句并将第二处位置的引号进行闭合。

'><script>alert(1)</script>

 5.但是可以看到此方法并没有成功。

 6.可以看到也出现了类似实体化的情况。

 7.那么这种情况该怎么办呢? 

        这个网站对尖括号进行了过滤,那么我们就要想一想还有没有其它的方法。

        可以看到这个网站存在表单,表单里面html里有相关属性——onclick。

         因此我们可以想到利用此属性来对js语句进行调用,进而不用尖括号。

8.将js语句修改为如下内容再对网页进行访问,在查看其内可以看到“onlick=()”属性被成功写入了,并且对两侧的内容实现的闭合。

'onclick='alert(1)

 9.此时页面并没有返回我们成功过关,因为我们没有触发事件属性,当我们使用鼠标点击搜索框后,便可以看到过关提示。

10.至此成功通过了level-3。

<level-4>

1.来到第四关,可以看到第四关也是一个搜索框。

2.我们随便搜索“111”后观察网址的变化。

http://127.0.0.1/xss-labs/level4.php?keyword=try%20harder!


http://127.0.0.1/xss-labs/level4.php?keyword=111&submit=%E6%90%9C%E7%B4%A2

3.我们像上一关一样进入查看器查看。

4.由此联想到使用上一关的方法进行尝试(但是将闭合用的单引号变成了双引号)。

"onclick="alert(1)

5.可以看到成功通过了。

 6.至此成功通过了level-4。

<level-5>

1.来到第五关,可以看到第五关依然是一个搜索框。

 2.我们再次使用前两关的方法进行尝试,但是可以看到此方法并没有成功。

"onclick="alert(1)

3.进入查看器查看原因,可以看到我们输入的js语句被更改了,从而导致了失败。

4.造成此现象的原因是检测到了关键字,然后将关键字进行了修改进而对我们输入的内容进行了干扰。这里是检测到了“on”,然后再其中间添加了一个下划线,网站实现此功能的源代码如下图所示。

5.那么这种情况该怎么办呢? 

        很显然使用onclisk事件是行不通了,我们可以想到使用地址超链接的协议来尝试过关。 

6.我们在搜索框内输入下面代码,然后点击搜索,在查看器内可以看到我们的代码被成功插入了。正常情况来说等号后面的内容就是超链接的网址,但是我们此时对其进行了修改,将其修改为了跨站代码,因此当调用此超链接的时候我们的跨站语句就可以被成功执行。

"><a href='javascript:alert(1)'>

 7.回到网页内可以看到超链接的标识。

8.点击标识后可以看到网页弹出了通关的窗口。

9.至此成功通过了level-5。

<level-6>

1.来到第六关,可以看到第六关依然是一个搜索框。

 2.我们再次使用前两关的方法进行尝试,但是可以看到此方法并没有成功。

"><a href='javascript:alert(1)'>

3.进入查看器查看原因,可以看到我们输入的语句被更改了,从而导致了失败。

4.造成此现象的原因是检测到了关键字,然后将关键字进行了修改进而对我们输入的内容进行了干扰。这里是检测到了“href”,然后再其中间添加了一个下划线,网站实现此功能的源代码如下图所示。

5.那么这种情况该怎么办呢? 

        我们查看其源代码可以看到其虽然对很多的敏感关键字都进行了过滤,但是却并添加正则表达式,从而没有对大小写进行过滤,因此我们可以通过修改代码内的大小写来尝试通关。

6.我们在搜索框内输入下面代码,然后点击搜索,在查看器内可以看到我们的代码被成功插入了。正常情况来说等号后面的内容就是超链接的网址,但是我们此时对其进行了修改,将其修改为了跨站代码,因此当调用此超链接的时候我们的跨站语句就可以被成功执行。

"><a Href='javasCript:alert(1)'>

7.回到网页内可以看到超链接的标识。

8.点击标识后可以看到网页弹出了通关的窗口。

9.至此成功通过了level-6。

<level-7>

1.来到第七关,可以看到第七关依然是一个搜索框。

2.我们再次使用上一关的方法进行尝试,但是可以看到此方法并没有成功。

"><a Href='javasCript:alert(1)'>

3.进入查看器查看原因,可以看到我们输入的语句被更改了,从而导致了失败。

4.造成此现象的原因是检测到了关键字,然后将关键字进行了修改进而对我们输入的内容进行了干扰。这里是检测到了“script”和“herf”,然后将其进行了删除,网站实现此功能的源代码如下图所示。

5.那么这种情况该怎么办呢? 

        我们可以发现虽然其对关键字进行了删除,但是仅删除了一次,没有循环过滤,因此我们可以考虑使用重复关键字来进行通关。

6.我们在搜索框内输入下面代码,然后点击搜索,在查看器内可以看到我们的代码被成功插入了。正常情况来说等号后面的内容就是超链接的网址,但是我们此时对其进行了修改,将其修改为了跨站代码,因此当调用此超链接的时候我们的跨站语句就可以被成功执行。

"><a Hhrefref='javasCscriptript:alert(1)'>

7.回到网页内可以看到超链接的标识。

8.点击标识后可以看到网页弹出了通关的窗口。

9.至此成功通过了level-7。

<level-8>

1.来到第八关,可以看到第八关是一个添加链接的,在框内添加链接后,点击下面的“友情链接”后就可以访问刚刚自己输入的页面。

2.进入检查器内可以看到输入的内容显示的位置。

3.我们直接输入跨站代码进行尝试,但是看到此方法并没有成功。

javascript:alert(1)

4.进入查看器查看原因,可以看到我们输入的语句被更改了,从而导致了失败。

5.造成此现象的原因是检测到了关键字,然后将关键字进行了修改进而对我们输入的内容进行了干扰。尝试使用大小写来绕过,但是发现也不可行。

6.那么这种情况该怎么办呢? 

        我们可以考虑使用编码的方式来进行绕过。

7.我们使用编码工具将js代码进行编码,编码后的内容如下所示。

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;

8.将经过编码的js语句进行添加,可以查看此时js语句便正常显示了。

9.点击“友情链接”后可以看到网页弹出了通关的窗口。

10.至此成功通过了level-8。

<level-9>

1.来到第九关,可以看到第九关是一个添加链接的,在框内添加链接后,点击下面的“友情链接”后就可以访问刚刚自己输入的页面。

2.我们采取上一关同样的办法来进行尝试,输入下面的代码进行访问,但是失败了。

3.我们直接输入跨站代码进行尝试,但是看到此方法并没有成功。

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;

4.进入查看器查看原因,可以看到输入的内容被拦截了,从而导致了失败。

5.我们查看原码来分析其原因,可以看到原码内存在对“http://”的检测,如果输入的内容里没有被检测的语句,就返回其它不正确的信息。

6.因此我们仅需在输入的内容内添加其检测的内容即可(http://),即将语句改成下面的样式。正常直接添加会造成干扰,因此我们在其前面添加“//”来进行注释。

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;//http://

7.将代码提交后可以看到js语句被成功写入了。

8.接下来点击“友情链接”就可以看到网页返回了过关的弹窗。

 9.至此成功通过了level-9。

 <level-10>

1.来到第十关,可以看到这一关连输入框都没有。

2.我们在url内的参数后输入下面的跨站代码。

111&t_sort="type="text" onclick= "alert(1)"

3.在网页内同时出现了一个输入框,出现这个输入框的目的是为了实现鼠标的点击事件,进而使js语句被执行。

4.点击输入框后便可以看到网站弹出的过关弹窗。

5.至此成功通过了level-10。

六、WAF绕过及安全修复

1.常规WAF绕过思路

  • 标签语法替换
  • 特殊符号干扰
  • 提交方式更改
  • 垃圾数据溢出
  • 加密解密算法
  • 结合其他漏洞绕过  

2.常见waf过滤的标签

  • <script>
  • <a>  
  • <p>  
  • <img>  
  • <body>
  • <button>  
  • <var>  
  • <div>  
  • <iframe>  
  • <object>
  • <input> 
  • <textarea>
  •  <keygen>
  • <frameset>  
  • <embed>  
  • <svg>  
  • <math>  
  • <video>  
  • <audio>
  • <select>

3.绕过方法

        可以弹窗的:alert,prompt ,confirm,base64加密,编码绕过(安全狗都没有过滤。

        绕过方法有很多比如:

  • 大小写绕过
  • javascript伪协议
  • 没有分号
  • Flash
  • HTML5 新标签
  • Fuzz进行测试
  • 双层标签绕过

4.XSS Fuzzer在线工具

        网站超链接:XSS Fuzzer

5.修复方案

  • 开启 httponly
  • 输入过滤
  • 输出过滤等

猜你喜欢

转载自blog.csdn.net/weixin_62808713/article/details/129822691