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
如图但我们刚进入页面时发现存在一个get传参name=test而且与此同时在页面上也出现了test
下一步我们可以去看看源代码
如图:
发现参数竟然直接出现在页面源代码中因此我们可以尝试去插入一段script代码来让其在html中直接被执行
如图:
payload:<script>alert(1)</script>
回车即可
Level 2
当我们进入这关时发现这关和上一关看起来加上了搜索框但从url栏中可以看出还是get传参因此我们可以先使用上一关的payload试一下发现不行 然后查看以页面源代码
如图:
发现特殊字符被编码成html实体
可以通过查看后端源码去寻找原因 如图:
htmlspecialchars($str)
函数用于将字符串中的特殊字符转换为HTML实体
但是我们发现我们传入的值在input标签里面并没有发生变化因此我们可以利用闭合从而使我们的script标签发挥作用
payload:"><script>alert(1)</script>
回车如图:
Level 3
在进行这关之前需要先知道什么是html事件
当html代码被实体化尖括号和双引号被全部被实体化后那么就无法使输入的<script>代码被执行那么这时便需要我们使用html事件来进行操作
参考:HTML 事件参考手册
比较详细看完发现此关有很多payload可以解决但是思路都差不都
看完后开始解题我们可以先试一下Level 1的payload
顺便看一下源代码什么情况
如图:
发现被实体化了
然后我们尝试输入:' onmoseover="alert(1)" '来闭合但是发现不行
onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
查看源代码发现双引号全都变了
如图:
然后我们去瞅瞅F12 发现我们的单引号变成了双引号这样我们便可以开始构造
payload:'onmoseover='alert(1)
回车如图:
其余事件同理
注意:
如果不行的话可以尝试加分号
例:
'οnmοuseοver=alert(1);'
Level 4
在这一关在刚刚开始时可以尝试去输< > " ' 这些符号
目的是去看看是否存在实体化输入后查看原代码
如图:
由图我们可以发现在标签中除了单引号他们都被实体化
但是在input标签里只有<>这两个符号消失了在这里我们猜测可能使用到了字符串替换来过滤了<>这两个符号 因为只消失了<>而""却显示正常所以在这里猜测它没有实例体化html字符
如果不确定可以去瞅瞅后端代码
如图:
然后我们可以利用input标签
使用"进行闭合
所以 payload:"οnmοuseοver=alert('xss');"
我建议在在我们构造payload的时候习惯性的在语句后加上一个分号这样比较保险
如图:
Level 5
进入这关后我们可以先去尝试看看他实体化了哪些字符 先输入" < 试试
如图:
发现在input标签中都可以到这里我还以为随便闭合一下就ok但是当我输入payload:
"><script>alter('xss')</script>"
时如图:
发现被转义了 此路行不通哪就换一条
用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页面
最后结果如图:
Level 6
在这一关没有过滤" < 但是on herf script 均被转义最后试试大写能不能不被转义
payload:
"><SCRipt>alert('xss')</Script>
如图:
其实以上几关的payload把被转义的部分小写变成大写均可以实现xss以上只是其中的一个例子
Level 7
老样子先来试试他过滤了什么如图:
由图可知以上的方法的关键字符均被过滤 然后我又试了大写绕过发现不行
但是如果他直接删掉的话我们可以通过双写来绕过
payload:
"oonnmouseover=alert('xss');"
如图:
以上只是一个例子以上的代码均可实现双写绕过
Level 8
在第八关有两个点可以利用一个是input标签另一个是href的属性
如图发现它实体化了 " 因此input标签闭合这条路便走不通了但是从图中可知它将javascript转义然后我也试了一下大写绕过发现也不行这时候就需要用到一个新知识了
新知识:
href隐藏属性:可以进行自动Unicode解码
Unicode编码解码工具:在线Unicode编码解码 - 码工具
payload:
javascript:alert('xss')
Unicode编码后
javascript:alert('xxs')
输入回车如图:
Level 9
在这一关看了一下页面源代码貌似和上一关没有什么不同
在input标签中" 和 < 均被实体化
如图:
但是当我随便输入一些内容时发现如果输入的不是有效地址而是javascript代码时它压根就不会读如图:
那到底怎么才算合法不知道可以选择去瞅瞅后端源代码
如图:
因此需要我们构造的payload后面增加
/*http://*/
即可
Unicode编码解码工具:在线Unicode编码解码 - 码工具
但是我们注意要在http://加上注释否则会导致我们输入的javascript代码无法正常发挥作用
所以payload:
javascript:alert('xss')/*http://*/
注意:
1.必须要把注释掉的http放到最后,建议以后养成把注释放到语句最后面的习惯
(因为不同的解析器可能会先去解码但是我们的注释在unicode编码的前面这样可能会导致我们的注释起不了作用——仅代表个人理解)
2.
为什么把javascript:alert('xss')/*http://*/直接unicode编码不行
因为href属性中unicode解码是发生在用户点击链接向浏览器发起请求的时候
并不是说我们传的参数到后端已经解码了
它会直接把unicode编码后的内容传给后端这样后端就无法识别到http://从而导致xss失败
HTML事件发挥作用的前提
需要写在html文件的<script>的标签中或者作为html标签属性的值即在<>里边
这个比较重要做题前需要先搞清楚这个
Level 10
进入这关发现并不存在输入框发现是通过改url get传参然后看看" >是否被实体化
由图可知 " > 均被实体化这就导致我们在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事件也可以
如图:
Level 11
在这关发现在h2标签中同样进行了html实体化
看到页面源代码后发现有藏起来的input标签然后一个个试看看哪个能够输入试了一圈发现只有t_sort可以但是当我去输入 " > 发现都被过滤如图:
因此说明get传参这条路走不通(没办法了缺乏经验我去看看后端代码)
如图:
发现其实t_ref其实也可以获得参数但是是从referer头里获取 可以去试试burp改包
发现这道题把<>过滤了我们可以试试html事件
payload:
"οnmοuseοver=alert('xss') type="text
如图:
然后发包
如图:
Level 12
新知识:User-Agent 头
User-Agent 头通常包含了以下信息:
-
浏览器名称和版本号
-
操作系统名称和版本号
-
用户代理类型(例如,是一个桌面浏览器、移动浏览器还是爬虫)
-
其他可选的信息,如硬件类型、渲染引擎等
进入到这关后先看看页面源代码
如图:
很明显最后一个input标签的value属性是User-Agent 头
直接抓包一样发现过滤了 <> 那就和上一关一样用html事件
payload:
"οnmοuseοver=alert('xss') type="text
把包中的user-agent头改成payload即可
发包后如图:
Level 13
老样子先看看页面源代码
如图:
一眼看到这个提示根据cook猜测是Cookie那就打开控制台瞅瞅如图:
嘿嘿果然是那就改它payload:
"οnfοcus=alert('xss') type="text
这里的onfocus我只是换了html事件而已目的和onmouseover是一样的
改完后刷新一下即可如图:
Level 14
跳转的网站没了就没做
Level 15
老样子瞅瞅页面源代码
如图:
新知识:ng-include指令
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
如图:
然后我们可以直接利用第一关的漏洞进行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>标签来直接弹窗可能会不成功
Level 16
先看页面源代码如图:
发现输入的内容在<center>中先看看过滤了什么
输入:
?keyword=" ' sRc DaTa OnFocus onm ouseOver onm ouseDoWn P <sCriPt> <a hReF=javascript:alert()> j
如图:
由图可知 空格 单双引号均被实体化还会把所有的大写字母转化为小写
没啥思路可以去看看后端代码如图:
发现还过滤了/可以去看看这里边符合要求的标签(不能有script / 空格 单双引号) xxs常见的触发标签
空格可以使用回车的url编码来替代
payload:
<svg%0aοnlοad=alert(1)>
如图:
Level 17
先看页面源代码来确定输入的东西在哪个位置
如图:
然后看看它过滤了什么输入:
?arg01=" ' sRc DaTa OnFocus onm ouseOver onm ouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus onm ouseOver onm ouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
发现<> 和""不行
不知道embed标签的可以去查查
发现str属性后的xsf01.swf是一个flash动画文件所以要到一个支持flash的浏览器上这个动画文件才能正常显现出来如果不想下载这个插件的话我们可以去后端把xsf01.swf改成index.png(和这关的php文件在同一文件夹下的png图片均可)
如图:
因为<> 和""不行所以选择使用html事件payload 1:
?arg01= onclick&arg02=alert()
这样构造的原因是因为我发现在刚开始传入两个参数的时候中间会加上一个等号然后传入这两个参数到后端就会构造出完整的onclick事件οnclick=alert()如图:
或者payload 2:?arg02= onlick=alert()
注意:要在onclick的前面加上一个空格这样才不会和src的属性连在一起
payload 1和2的结果分别如图:
此题还有一个点在开始的时候困了我好久:对于<embed>标签可能有些浏览器不支持当paylaod没问题的时候可以换个浏览器试试
Level 18
先来瞅瞅页面源代码发现还是有一个flash文件先和上一关一样改一下然后试试看他过滤了什么
一样先测试一波看看它过滤了什么
?arg02=" ' sRc DaTa OnFocus onm ouseOver onm ouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
如图:
发现和上一关一样过滤了 "" <> 直接构造payload:
?arg01= onclick&arg02=alert('xss')
如图:
Level 19
一样瞅瞅页面源代码如图:
发现还是一样的这关我选择去用一下flash可以去给Google装个flash插件即可图:
一样先试试他过滤了啥
?arg02=" ' sRc DaTa OnFocus onm ouseOver onm ouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
如图:
发现和上一关一样
试试:
?arg01= onclick&arg02=alert('xss')
发现这关使用了双引号但是我们无法进行闭合
这关用到的是Flash Xss注入,可参考
Level 19 Flash XSS与Flash XSS 漏洞详解
其实就是往Flash里面插入一段js代码,然后手动执行
构造payload :
?arg01=version&arg02=<a href="javascript:alert()">here</a>
如图:
Level 20
这关也是有双引号仍然需要反编译
直接构建payload:
?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123标签:xss,Level,标签,html,labs,&#,如图,payload From: https://blog.csdn.net/2302_80044238/article/details/136974968