xss-labs

本文介绍了JSP(JavaServerPages)的基本概念,展示了其语法结构,重点讲解了如何在JSP中编写脚本和处理数据,以及XSS(跨站脚本攻击)的相关防御机制,包括HTML事件和编码过滤的应对策略。
摘要由CSDN通过智能技术生成

Jsp

1.什么是Jsp

jsp的全称是java servlet page 它就是java的服务器页面

因为它相对于servlet传回数据的方法比较简单

Servlet的本质是一个基于Java的Web组件,旨在处理HTTP请求并生成HTTP响应

2.jsp语法

脚本程序可包含任意的java语句但是在jsp中不能包含任何文本,html标签和jsp元素

以下是一个示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
​
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

上述部分可以用来解决中文编码问题 注:在以上编码中的@符号是用来标识指令的类型例如引入页面指令或属性

注意:在jsp语句中不能使用;来结束表达式

<%@ page ...%>:定义页面的依赖属性,比如:脚本语言,error页面还有缓存需求

<%@ include ...%>:包含文件

<%@ taglib ...%>:引入标签库的定义也可以自定义标签

<%--code--%>:jsp注释

<%! code %>:用于声明变量,方法及初始化

<%= 表达式 %>:字面意思就是用来写表达式的

<% code %>:就是代码片段脚本程序

注:jsp脚本程序,jsp声明以及表达式也可以如下表示:

<jsp:scriptlet>
   代码片段
</jsp:scriptlet>

<\% 代表静态 <%常量

\%> 代表静态 %> 常量

\ ' 在属性中使用的单引号 (两符号之间不存空格)

\ " 在属性中使用的双引号(两符号之间不存空格)

JSP行为

jsp行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等

行为标签只有一种语法格式,它严格遵守XML标准:

<jsp:action_name attribute="value" />
语法描述
jsp:include用于在当前页面中包含静态或动态资源
jsp:useBean寻找和初始化一个JavaBean组件
jsp:setProperty设置 JavaBean组件的值
jsp:getProperty将 JavaBean组件的值插入到 output中
jsp:forward从一个JSP文件向另一个文件传递一个包含用户请求的request对象
jsp:plugin用于在生成的HTML页面中包含Applet和JavaBean对象
jsp:element动态创建一个XML元素
jsp:attribute定义动态创建的XML元素的属性
jsp:body定义动态创建的XML元素的主体
jsp:text用于封装模板数据

xss-lab 前四关

Level 1

屏幕截图 2024-03-07 164845

如图但我们刚进入页面时发现存在一个get传参name=test而且与此同时在页面上也出现了test

下一步我们可以去看看源代码

如图:

屏幕截图 2024-03-07 165258

发现参数竟然直接出现在页面源代码中因此我们可以尝试去插入一段script代码来让其在html中直接被执行

如图:

屏幕截图 2024-03-07 165017

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

回车即可

Level 2

当我们进入这关时发现这关和上一关看起来加上了搜索框但从url栏中可以看出还是get传参因此我们可以先使用上一关的payload试一下发现不行 然后查看以页面源代码

如图:

image-20240307171829990

发现特殊字符被编码成html实体

可以通过查看后端源码去寻找原因 如图:

屏幕截图 2024-03-07 172045

htmlspecialchars($str) 函数用于将字符串中的特殊字符转换为HTML实体

但是我们发现我们传入的值在input标签里面并没有发生变化因此我们可以利用闭合从而使我们的script标签发挥作用

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

回车如图:

image-20240307172849930

Level 3

在进行这关之前需要先知道什么是html事件

当html代码被实体化尖括号和双引号被全部被实体化后那么就无法使输入的<script>代码被执行那么这时便需要我们使用html事件来进行操作

参考:HTML 事件参考手册

比较详细看完发现此关有很多payload可以解决但是思路都差不都

看完后开始解题我们可以先试一下Level 1的payload

顺便看一下源代码什么情况

如图:

屏幕截图 2024-03-07 200640

发现被实体化了

然后我们尝试输入:' onmoseover="alert(1)" '来闭合但是发现不行

onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码

查看源代码发现双引号全都变了

如图:

image-20240307211601073

然后我们去瞅瞅F12 发现我们的单引号变成了双引号这样我们便可以开始构造

payload:'onmoseover='alert(1)

回车如图:

image-20240307214621791

其余事件同理

注意:

如果不行的话可以尝试加分号

例:

'οnmοuseοver=alert(1);'

Level 4

在这一关在刚刚开始时可以尝试去输< > " ' 这些符号

目的是去看看是否存在实体化输入后查看原代码

如图:

image-20240308191556043

由图我们可以发现在标签中除了单引号他们都被实体化

但是在input标签里只有<>这两个符号消失了在这里我们猜测可能使用到了字符串替换来过滤了<>这两个符号 因为只消失了<>而""却显示正常所以在这里猜测它没有实例体化html字符

如果不确定可以去瞅瞅后端代码

如图:

image-20240308192904563

然后我们可以利用input标签

使用"进行闭合

所以 payload:"οnmοuseοver=alert('xss');"

我建议在在我们构造payload的时候习惯性的在语句后加上一个分号这样比较保险

如图:

image-20240319101710385

Level 5

进入这关后我们可以先去尝试看看他实体化了哪些字符 先输入" < 试试

如图:

image-20240319103503931

发现在input标签中都可以到这里我还以为随便闭合一下就ok但是当我输入payload:

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

时如图:

屏幕截图 2024-03-19 103721

发现被转义了 此路行不通哪就换一条

用html事件试一下payload:

"οnmοuseοver=alert('xss');"

发现结果一样on也被转义

最后发现大小写绕过也不行

因为可以完成闭合所以在这里我们可以用其他标签html中的<a> herf

href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表

具体可以参考HTML <a> href 属性

因为herf属性的值可以是javascript然后构造payload:

"><a href=javascript:alert('xss')>点一下我试试</a>"

在构造payload的时候第一要注意闭合还有是href最后在这里一定要加上javascript:

因为如果不加我们在href后的东西有可能被解析为url导致点击后跳转到404页面

最后结果如图:

屏幕截图 2024-03-19 111003

Level 6

在这一关没有过滤" < 但是on herf script 均被转义最后试试大写能不能不被转义

payload:

"><SCRipt>alert('xss')</Script>

如图:

其实以上几关的payload把被转义的部分小写变成大写均可以实现xss以上只是其中的一个例子

Level 7

老样子先来试试他过滤了什么如图:

屏幕截图 2024-03-19 155428

屏幕截图 2024-03-19 155433

由图可知以上的方法的关键字符均被过滤 然后我又试了大写绕过发现不行

但是如果他直接删掉的话我们可以通过双写来绕过

payload:

"oonnmouseover=alert('xss');"

如图:

image-20240319163609324

以上只是一个例子以上的代码均可实现双写绕过

Level 8

在第八关有两个点可以利用一个是input标签另一个是href的属性

image-20240319171415580

如图发现它实体化了 " 因此input标签闭合这条路便走不通了但是从图中可知它将javascript转义然后我也试了一下大写绕过发现也不行这时候就需要用到一个新知识了

新知识:

href隐藏属性:可以进行自动Unicode解码

Unicode编码解码工具:在线Unicode编码解码 - 码工具

payload:

javascript:alert('xss')

Unicode编码后

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

输入回车如图:

image-20240319172734822

Level 9

在这一关看了一下页面源代码貌似和上一关没有什么不同

在input标签中" 和 < 均被实体化

如图:

image-20240319214641087

但是当我随便输入一些内容时发现如果输入的不是有效地址而是javascript代码时它压根就不会读如图:

image-20240319173748470

那到底怎么才算合法不知道可以选择去瞅瞅后端源代码

如图:

image-20240319215105481

因此需要我们构造的payload后面增加

/*http://*/

即可

Unicode编码解码工具:在线Unicode编码解码 - 码工具

但是我们注意要在http://加上注释否则会导致我们输入的javascript代码无法正常发挥作用

所以payload:

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

注意:

1.必须要把注释掉的http放到最后,建议以后养成把注释放到语句最后面的习惯

(因为不同的解析器可能会先去解码但是我们的注释在unicode编码的前面这样可能会导致我们的注释起不了作用——仅代表个人理解)

2.

为什么把javascript:alert('xss')/*http://*/直接unicode编码不行

因为href属性中unicode解码是发生在用户点击链接向浏览器发起请求的时候

并不是说我们传的参数到后端已经解码了

它会直接把unicode编码后的内容传给后端这样后端就无法识别到http://从而导致xss失败

HTML事件发挥作用的前提

需要写在html文件的<script>的标签中或者作为html标签属性的值即在<>里边

这个比较重要做题前需要先搞清楚这个

Level 10

进入这关发现并不存在输入框发现是通过改url get传参然后看看" >是否被实体化

image-20240320154611729

由图可知 " > 均被实体化这就导致我们在h2标签中无法使用<script>标签来完成xss而且根据我们传入的参数的位置也无法利用html来实现xss

但是根据上图发现它还藏起来了三个input标签可以去试试看能不能传入参数

尝试发现前两个标签不行但是最后那个t_sort可以然后经过输入发现它过滤了<>这就使我们不能去使用script标签那我就利用HTML事件但是还需要一个输入框否则无法触发 这还需要闭合一下

payload:

?t_sort="οnmοuseοver=alert('xss') type="text

type的作用是让输入框显示出来

原理:

当input标签中有两个type属性时那么html解析器会只解析第一个属性这样便可以让type="hidden"失效从而显现出来输入框

使用其他html事件也可以

如图:

image-20240320192528221

Level 11

在这关发现在h2标签中同样进行了html实体化

image-20240320200424216

看到页面源代码后发现有藏起来的input标签然后一个个试看看哪个能够输入试了一圈发现只有t_sort可以但是当我去输入 " > 发现都被过滤如图:

image-20240320200828495

因此说明get传参这条路走不通(没办法了缺乏经验我去看看后端代码)

如图:

image-20240320201151444

发现其实t_ref其实也可以获得参数但是是从referer头里获取 可以去试试burp改包

发现这道题把<>过滤了我们可以试试html事件

payload:

"οnmοuseοver=alert('xss') type="text

如图:

屏幕截图 2024-03-20 202231

然后发包

如图:

image-20240320202257465

Level 12

新知识:User-Agent 头

User-Agent 头通常包含了以下信息:

  • 浏览器名称和版本号

  • 操作系统名称和版本号

  • 用户代理类型(例如,是一个桌面浏览器、移动浏览器还是爬虫)

  • 其他可选的信息,如硬件类型、渲染引擎等

进入到这关后先看看页面源代码

如图:

image-20240320203159179

很明显最后一个input标签的value属性是User-Agent 头

直接抓包一样发现过滤了 <> 那就和上一关一样用html事件

payload:

"οnmοuseοver=alert('xss') type="text

把包中的user-agent头改成payload即可

发包后如图:

屏幕截图 2024-03-20 203716

Level 13

老样子先看看页面源代码

如图:

image-20240320210041241

一眼看到这个提示根据cook猜测是Cookie那就打开控制台瞅瞅如图:

image-20240320210259262

嘿嘿果然是那就改它payload:

"οnfοcus=alert('xss') type="text

这里的onfocus我只是换了html事件而已目的和onmouseover是一样的

改完后刷新一下即可如图:

image-20240320210551614

Level 14

跳转的网站没了就没做

Level 15

老样子瞅瞅页面源代码

如图:

屏幕截图 2024-03-20 214117

新知识:ng-include指令

ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号

如图:

image-20240320215303527

然后我们可以直接利用第一关的漏洞进行xss

但是当我使用<script>标签时不行结果看了一眼页面源代码发现它过滤了<>

因此可以选择不需要用到<>的一关即可 呃还过滤了""

对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload

?src='./level1.php?name=<img src=1 οnmοuseοver=alert()>'

注意传参数其实是分开的

'./level1.php?name=<img src=1 οnmοuseοver=alert()>'

这部分是传到第15关中了而

?name=<img src=1 οnmοuseοver=alert()>

这部分是传到第一关的后端了

我建议这一关不要直接使用<script>标签来直接弹窗可能会不成功

屏幕截图 2024-03-20 220920

Level 16

先看页面源代码如图:

image-20240321085130061

发现输入的内容在<center>中先看看过滤了什么

输入:

?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> &#106; 

如图:

image-20240321085501294

由图可知 空格 单双引号均被实体化还会把所有的大写字母转化为小写

没啥思路可以去看看后端代码如图:

image-20240321090013724

发现还过滤了/可以去看看这里边符合要求的标签(不能有script / 空格 单双引号) xxs常见的触发标签

空格可以使用回车的url编码来替代

payload:

<svg%0aοnlοad=alert(1)>

如图:

image-20240321090716362

Level 17

先看页面源代码来确定输入的东西在哪个位置

如图:

屏幕截图 2024-03-21 091509

然后看看它过滤了什么输入:

?arg01=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

发现<> 和""不行

不知道embed标签的可以去查查

发现str属性后的xsf01.swf是一个flash动画文件所以要到一个支持flash的浏览器上这个动画文件才能正常显现出来如果不想下载这个插件的话我们可以去后端把xsf01.swf改成index.png(和这关的php文件在同一文件夹下的png图片均可)

如图:

屏幕截图 2024-03-21 093252

因为<> 和""不行所以选择使用html事件payload 1:

?arg01= onclick&arg02=alert()

这样构造的原因是因为我发现在刚开始传入两个参数的时候中间会加上一个等号然后传入这两个参数到后端就会构造出完整的onclick事件οnclick=alert()如图:

屏幕截图 2024-03-21 123302

或者payload 2:?arg02= onlick=alert()

注意:要在onclick的前面加上一个空格这样才不会和src的属性连在一起

payload 1和2的结果分别如图:

屏幕截图 2024-03-21 122824

屏幕截图 2024-03-21 123520

此题还有一个点在开始的时候困了我好久:对于<embed>标签可能有些浏览器不支持当paylaod没问题的时候可以换个浏览器试试

Level 18

先来瞅瞅页面源代码发现还是有一个flash文件先和上一关一样改一下然后试试看他过滤了什么

一样先测试一波看看它过滤了什么

?arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

如图:

屏幕截图 2024-03-21 133626

发现和上一关一样过滤了 "" <> 直接构造payload:

?arg01= onclick&arg02=alert('xss')

如图:

屏幕截图 2024-03-21 133528

Level 19

一样瞅瞅页面源代码如图:

屏幕截图 2024-03-21 133838

发现还是一样的这关我选择去用一下flash可以去给Google装个flash插件即可图:

屏幕截图 2024-03-21 135354

image-20240321142806174

一样先试试他过滤了啥

?arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

如图:

image-20240321142951526

发现和上一关一样

试试:

?arg01= onclick&arg02=alert('xss')

发现这关使用了双引号但是我们无法进行闭合

这关用到的是Flash Xss注入,可参考

Level 19 Flash XSSFlash XSS 漏洞详解

其实就是往Flash里面插入一段js代码,然后手动执行

构造payload :

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

如图:

image-20240321143915164

Level 20

这关也是有双引号仍然需要反编译

参考Level 20 Flash XSS

直接构建payload:

?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值