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 | 用于封装模板数据 |
xxs-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 事件参考手册
比较详细看完发现此关有很多payload可以解决但是思路都差不都
看完后开始解题我们可以先试一下Level 1的payload
顺便看一下源代码什么情况
如图:
发现被实体化了
然后我们尝试输入:' onmoseover="alert(1)" '来闭合但是发现不行
查看源代码发现双引号全都变了
如图:
然后我们去瞅瞅F12 发现我们的单引号变成了双引号这样我们便可以开始构造
payload:'onmoseover='alert(1)
回车如图:
其余事件同理
Level 4
在这一关在刚刚开始时可以尝试去输< > " ' 这些符号
目的是去看看是否存在实体化输入后查看原代码
如图:
由图我们可以发现在标签中除了单引号他们都被实体化
但是在input标签里只有<>这两个符号消失了在这里我们猜测可能使用到了字符串替换来过滤了<>这两个符号 因为只消失了<>而""却显示正常所以在这里猜测它没有实例体化html字符
如果不确定可以去瞅瞅后端代码
如图:
然后我们可以利用input标签
使用"进行闭合
所以 payload:"οnmοuseοver="alert(1)
如图: