xss-labs-test1-test20

简述


跨站脚本(Cross-site scripting,简称为:CSS, 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,跨站脚本攻击缩写为XSS)是一种网站应用程序的安全漏洞攻击。

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、 LiveScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数

最常见的几种分类:反射型(非持久型)XSS存储型(持久型)XSSDOM型XSS通用型XSS突变型XSS

想要看更详细的点击

test1

在这里插入图片描述

可以看出,它向服务器传递name参数,值为test,从页面的回显上看,将用户名回显到页面上,payload的长度就是用户名的长度。

这一关很明显就是考察反射型xss

在这里插入图片描述
查看源码发现,服务器端对于提交的敏感字符没有过滤,所以这里直接在name参数中赋值一个简单的弹窗来进行测试。

操作如下:

将name参数重新赋值:<script>alert('xss')</script>

在这里插入图片描述

test2

在这里插入图片描述
从url上看,本关还是用get方式传参,猜测还是反射性xss

比上关多了输入框和提交

尝试使用上一关的恶意语句操作进行弹窗

发现失败了,查看源码

在这里插入图片描述
可以看到恶意语句被编码了,<和>被编码成了html字符实体,查看服务器代码

在这里插入图片描述

发现多了一个htmlspecialchars()函数

htmlspecialchars()
把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体

预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

htmlspecialchars_decode() 
函数把预定义的 HTML 实体转换为字符

可以看到插入到value参数值中的恶意代码并没有被编码而是直接原样返回

但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。

既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了。

要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。

将keyword的参数值重新赋值

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

左边的">去闭合原先的"
右边的//去注释原先的">
在这里插入图片描述

test3

先构造弹窗试一下
在这里插入图片描述

发现这两个都被编码了,上关只有一处

去服务端查看源码

在这里插入图片描述
果然是有两个htmlspecialchars()函数

这里可以通过标签的一些特殊事件来执行js代码

构造代码:level3.php?keyword='onfocus=javascript:alert('xss') > //&submit=搜索

发现没有直接弹窗,这是因为onfocus事件的特殊性造成的

onfocus 事件在对象获得焦点时发生。

onfocus 通常用于 <input>, <select>, 和<a>.

简单点说:就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以

输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此

点击当前页面的输入框就可以完成弹框了。

在这里插入图片描述

test4

先构造弹窗<script>alert('xss')</script>
在这里插入图片描述

突然发现,<和>消失了!!!

那么就查看一下服务端的源代码

在这里插入图片描述
<和>被替换掉了

这时我们就要想办法,但是事件触发却不需要使用这两个符号

level4.php?keyword="onfocus=javascript:alert('xss') "

注意最后一个双引号前有空格

在这里插入图片描述

test5

使用弹窗代码<script>alert('xss')</script>
在这里插入图片描述
15行使用htmlspecialchars()函数

17行第一个script有问题

看服务端源代码
在这里插入图片描述
发现<script和on被转换了

既然无法通过

继续构造如下代码:?keyword="> <a href=javascript:alert('xss') > xss</a> //

在这里插入图片描述

在这里插入图片描述

test6

使用弹窗代码<script>alert('xss')</script>
在这里插入图片描述
试一下上关构造的代码

?keyword="> <a href=javascript:alert('xss') > xss</a> //

在这里插入图片描述
非常棒,将href被hr_ef取代了

使用大写试一下

level6.php?keyword="> <a HrEf=javascript:alert('xss') > xss</a> //

在这里插入图片描述
可以使用大写,在html中对大小写是

不敏感的。
在这里插入图片描述

test7

使用弹窗代码<script>alert('xss')</script>
在这里插入图片描述
好家伙,script直接被搞消失了

使用level7.php?keyword="onfocus=javascript:alert('xss')"submit=搜索试一下
在这里插入图片描述
直接看服务端源代码

在这里插入图片描述
可以看到有转小写,替换,htmlspecialchars()函数

可以看到是用字符src去进行匹配得提到标签了。

熟悉html的人都会知道在<img>标签中引用图片会用到一个属性就是src。正常的引用图

片就是将待引用图片的地址赋值给src属性。但是在js中如果src属性的值不正常或者无法

访问到时就可以触发一个onerror事件来执行js代码。

<img>标签代码:?name=<img src=111 onerror=alert('xss')>

用字符data进行匹配的,同上面一样该字符在之前的演示中也没有出现过。现在一般有点XSS意识的管理员都懂得过滤javascript与script等关键字。但是对于data的认识却并不多,也就很少有对它进行过滤的。

Data在我看来就是对字符进行编码的一种设定,比如如果在实际情况中

javascript、script等关键字被过滤掉了之后,可以用如下语句进行尝试

data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=

这条语句
javascript:alert("xss") 或者 <script>alert("xss")</script> 的作用是一样的

看了以上的规则,尝试双写关键字

?keyword="oonnfocus=javascrscriptipt:alert('xss') "

在这里插入图片描述

test8

使用弹窗代码试试<script>alert("xss")</script>
在这里插入图片描述
<和>被编码,script中加入了_字符破坏语义

使用事件触发测试?keyword=" onfocus=javascript:alert('xss')>//&submit=添加友情链接

在这里插入图片描述
onfocus一类的事件也被破坏了,还有双引号
直接看服务端的源码

在这里插入图片描述
对常见的关键字做了过滤处理

因为没有将字符串删除,所以双写就没有用了

那这关我们就将js代码进行编码

编码地址

javascript:alert('xss')

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

在这里插入图片描述

test9

这次不一个一个的试了,看服务端源代码

在这里插入图片描述
红框内,咱们已经很熟悉了

蓝框内,意思是输出str7中第一次出现http://的位置,如果没有就输出您的链接不合法(===:全等于,大小及数据类型均等)

只有包含正常的url地址才能添加到href属性值中

构造一个有正常url地址的恶意代码:

?keyword=javascript:alert('xss')//http://www.baidu.com

javascript:alert('xss')编码成&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;

所以完整的是(注意,http://www.baidu.com之前有//,//在php中是注释)

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;//http://www.baidu.com

在这里插入图片描述

test10

先看服务端源代码
在这里插入图片描述
这里有三个隐藏属性,如果不看服务端源码的话,只能试哪个起作用,现在我们知道t_sort可以利用
构造代码

?t_sort=" type="text" onclick="alert('xss')

在这里插入图片描述

test11

在这里插入图片描述
t_sort显然不能用了,这个参数被htmlspecialchars()函数处理了

但是str11要从referer接受数据

用burp suit抓包,并添加下面的代码

Referer:" type="text" onclick="alert('xss')

在这里插入图片描述
成功,然后按照下面的步骤让浏览器进行下一步操作
在这里插入图片描述

在这里插入图片描述

test12

在这里插入图片描述
通过源码知道,这关是在user_agent入手
在user_agent处添加" type="text" onclick="alert('xss')

在这里插入图片描述
在这里插入图片描述

test13

在这里插入图片描述
通过源码知道,这关是在cookie入手
在cookie处添加" type="text" onclick="alert('xss')
在这里插入图片描述
在这里插入图片描述

test14

test15

在这里插入图片描述
在蓝框第一行那里能够猜出来,要传img标签

既然此处用了ng-include指令的话,先了解一下其具体的用法。

1、ng-include 指令用于包含外部的 HTML文件。

2、包含的内容将作为指定元素的子节点。

3、ng-include 属性的值可以是一个表达式,返回一个文件名。

4、默认情况下,包含的文件需要包含在同一个域名下。

特别值得注意的几点如下:

1.ng-include,如果单纯指定地址,必须要加引号

2.ng-include,加载外部html,script标签中的内容不执行

3.ng-include,加载外部html中含有style标签样式可以识别

既然这里可以包含html文件,那么也就可以包含之前有过xss漏洞的源文件

构造代码:

?src='level1.php?name=<img src=1 onerror=alert(1)>'

因为这里参数值算是一个地址,所以需要添加引号。

img标签在使用的时候 一下几个事件非常的有用:

onError:当图片加载出现错误,会触发 经常在这里事件里头写入 将图片导向默认报错图片,以免页面上出现红色的叉叉 

onLoad:事件是当图片加载完成之后触发 

onAbort:图片加载的时候,用户通过点击停止加载(浏览器上的红色叉叉)时出发,通常在这里触发一个提示:“图片正在加载” 

但是level1.php不是一个php文件吗?

这里解释一下

这是因为我们不是单纯的去包含level1.php,而是在后面添加了name参

数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的

html文件给包含进来的意思。

然后尝试一下

构造代码

?src='level1.php?name=<img src=1 onerror=alert(1)>'

成功弹窗了!

test16

查看源文件代码
在这里插入图片描述
这里过滤了script、空格、/

绕过思路:可以用回车来将它们分开。

而且这里/符号也被编码了,所以我们需要的是一个不需要闭合的标签,比如之前所用过的<img>

换行符%0a(回车)或%0D(回车)取代空格(在HTML中%0a和%0D是可以当成空格使用的)

构造语句

?keyword=<img%0Dsrc=1%0Donerror=alert('xss')>

%0a我没有成功

test17

在这里插入图片描述
这里用到了<embed> 标签,<embed>标签就是引入一个swf文件到浏览器端,并且它的src属性值没有添加引号,所以不用闭合。

然后arg01和arg02两个变量对特殊字符进行了过滤。可以考虑用onclickonmouseover事件绕过。因为这两个变量是互相拼接起来的,所以在输入arg02时在b之后加一个空格,当浏览器解析到b的时候就停止判断,然后将onmouseover看作另外一个属性。

<embed> 标签定义了一个容器,用来嵌入外部应用或者互动程序(插件)。

构造代码

?arg01=a&arg02=b onmouseover=alert(‘xss’)

onmouseover:(表示当鼠标移动到该标签上时就会触发执行某项动作)。

test18

在这里插入图片描述
与上一关一样

test19

在这里插入图片描述

src的值使用双引号括起来的。

如果想要成功执行js代码肯定需要去闭合标签,但是此处应该还是会用

htmlspecialchars()函数进行处理,所以无法成功闭合。

这关是flash xss,涉及到反编译,暂时搞不懂

arg01=version&arg02=<a href="javascript:alert(1)">123</a>

test20

在这里插入图片描述
这关是flash xss,涉及到反编译,暂时搞不懂

arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//&width&height

总结

几种注入方式

?keyword=<script>alert('xss')</script>

?keyword='onfocus=javascript:alert('xss') >

当某些字符串被删掉时,用双写绕过
?keyword="oonnfocus=javascrscriptipt:alert('xss') "

?keyword="> <a href=javascript:alert('xss') > xss</a>

src错的话,触发onerror,然后处理alert
?name=<img src=111 onerror=alert('xss')

http前面必须要//,将后面的注释掉
?keyword=javascript:alert('xss')//http://www.baidu.com

?t_sort=" type="text" onclick="alert('xss')

不需要闭合的标签`img`
?keyword=<img%0Dsrc=1%0Donerror=alert('xss')>

b后面有空格,后面就相当于一个新的属性
?arg01=a&arg02=b onmouseover=alert(‘xss’)

on事件属于点击触发事件

绕过的方法

1.img标签src出错时用onerror注入

2.将a标签闭合,用script标签进行注入

3.用onmoseover等焦事件可以实现绕过执行脚本,焦事件可以用到input标签,a标签中的href属性,img标签等标签处。

4.可以尝试将代码进行unicode编码等浏览器可以解析的编码方式进行注入

5.可用转义序列实现绕过,转义序列是SGML类语言如xml、html中的中的一个设定,标志就是在一个数字前有 ”&#“ 这个字符后面可以跟十进制数或十六精进制,在构造语句时可以使用这种方法,从而实现绕过。

6.不只是转义序列,当你碰到删除空格的过滤时可以常识使用url编码,用%0a换行

收集信息的方法

<1>查看网页源码,留意源码中常见存在注入的语句,并留意可以向服务器传递的参数
<2>向服务器传递参数,并判断,哪些参数被用到了网页上,并且初步记录
<3>将用了传递参数的语句总结出来之后,将常见存在注入的语句挑出,并且对它们的闭合方式进行记录
<4>对初步记录进行分析,并总结结论,结论的标准是
我要在哪些语句上用哪些xss绕过方法进行注入

xss常见注入点

1.<input>
2.<script>
3.<embed>等
这些标签都有一个特点就是都有src属性,如果网页可以发送form表单且其中的参数被用在了这些标签的属性中,那么我们注意闭合之后,加入onerror、onmouseover、onclick、onfocus等焦点之后触发脚本内容。
4.<h1>、<h2>、<h3>、<h4>、<h5>、<h6>
5.<div>等
这些标签的特点是只有对网页显示的编辑功能,或者说有分割网页源码文本的功能,如果网页传回去的参数有被用于这些标签的参数,我们可以将完整的dom节点传进去,因为一般这些标签都有包含的功能。

参考
https://blog.csdn.net/ldzhhh/article/details/106324088

https://blog.csdn.net/wo41ge/article/details/107459332

https://blog.csdn.net/m0_53061933/article/details/114755460

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值