实验室第九周任务
JSP语法
JSP指的是Java Server Pages,它是SUN公司在1996年6月发布的用于开发动态Web应用的一项技术。JSP是基于Java Servlet的Web开发技术,网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
由于其所具有的简单易学和跨平台等的特性,使其在各种动态Web程序的设计语言中脱颖而出,它具有一套完整的语法规范,目前已经成为Web开发中的主流选择。
一、脚本程序
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
下面给出一个示例:
<html> <head><title>Hello World</title></head> <body> Hello World!<br/> <% out.println("Your IP adress is" + request.getRemoteAddr()); %> </body> </htm
中文编码问题
如果我们要在页面正常显示中文,我们需要在JSP文件头部添加以下代码:
<%@ page language="java" contentType="text/heml; charset=UTF-8" pageEncoding="Utf-8"%>
这样中文就能正常显示了。
二、JSP注释
JSP注释有两种
1.一种是可以直接在客户端显示的注释,称为HTML注释。
表现形式: <!--注释内容-->
2.一种是发送到服务器端,在客户端不能显示的注释,称为JSP注释。
表现形式:<%--注释内容--%>
三、JSP指令
JSP指令用来向JSP引擎提供编译信息。可以设置全局变量,如声明类、要实现的方法和输出内容的类型。一般的,JSP指令在整个页面范围内有效,且并不向客户端产生任何输出。所有的JSP指令都只在当前的整个页面中有效。与其书写的位置无关,一般写在最前面。
JSP指令有3类,分别是:
指令 | 描述 |
---|---|
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
1、page指令
page指令被称为页面指令,用来定义JSP页面的全局属性,该配置会作用于整个JSP页面。page指令用来指定所使用的脚本语言、导入特定的类及软件包等。
<%@ page language="java" contentType="text/html;charest=GBK"%> <%@ page import="java.util.*, java.io.*, java.awt.*"%>
2、include指令
include指令是文件加载指令,用于在JSP文件中插入一个包含文本或代码的文件。它把文件插入后与原来的JSP文件合并成一个新的JSP页面。(需要注意的是,如果被插入的文件发生了变化,则包含这个文件的JSP文件需要被重新编译)
<%@ include file="blog.txt"%> <%@ include file="blog.html"%> <%@ include file="blog.jsp"%>
3、taglib指令
taglib指令用来引用标签库并设置标签库的前缀。这个指令允许JSP页面使用用户自定义的标签,它也可以为标签库命名,标签在这个库中定义。
taglib有2个属性,uri用来指定标签文件或标签库的存放位置,prefix用来指定该标签库所使用的前缀。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%--声明要引用的标签库--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>taglib标签</title> </head> <body> <%--使用JSTL标签输出--%> <c:out value="taglibexample!"/> </body> </html>
四、JSP脚本元素
脚本元素是JSP中使用最频繁的元素,通过JSP脚本可以将Java代码嵌入到HTML页面中,所有可执行的Java代码,都可以通过JSP脚本来实现。
JSP脚本元素主要包含如下三种类型:
JSP声明
JSP表达式
JSP Scriptlets
1、JSP声明
JSP声明语句用于声明变量和方法。使用JSP声明语句声明变量时需要在”<%!”和”%>”标记之间放置Java变量的声明语句。变量的类型可以是Java语言中所提供的任意数据类型。使用JSP声明语句声明的变量将来会转换成Servlet类中的成员变量,这些变量在整个JSP页面中都有效,因此也被称为JSP页面的成员变量。声明的方法在整个JSP页面有效,方法内声明的变量只在方法内有效。
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,必须先声明这些变量和方法然后才能使用它们。
JSP声明的语法格式:
<%! declaration; [ declaration; ]+ ... %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>JSP声明语句实例</title> </head> <!-- JSP声明语句 --> <%! public int a; //声明整型变量a public String printStr(){ //声明方法printStr return "JSP method"; } %> <body> <% out.println("a="+a); //输出a a++ //a自增 %> <br> <% out.println(printStr()); //调用printStr()方法,输出其返回值 %> </body> </html>
实际上,JSP页面最终会编译成Servlet类,而在容器中只会存在一个Servlet类的实例。在JSP中声明的变量时成员变量,它只在创建Servlet实例时被初始化一次,此后该变量一直保存,直到Servlet实例被销毁掉。
2、JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以我们可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
JSP表达式的语法格式:
<%= 表达式 %>
实例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>JSP 表达式</title> </head> <body> <%! String str="JSP expression"; //声明变量str %> <!--JSP表达式--> <%=str%> //输出变量str </body> </html>
3、JSP Scriptlet
JS PScriptlet是一段Java代码。当需要使用Java实现一些复杂的操作或控制时,JSP表达式往往不能满足要求,此时就需要用到JSP Scriptlet。
在JSP Scriptlet里声明的变量是局部变量,调用JSP Scriptlet时,会为局部变量分配内存空间,调用结束便释放变量占有的空间。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>JSP Scriptlet</title> </head> <body> <% String str="JSP Scriptlet"; //声明字符串 out.println(str); //输出字符串的值 %> </body> </html>
五、JSP行为
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
行为标签只有一种语法格式,它严格遵守XML标准:
<jsp:action_name attribute="value" />
行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:
语法 | 描述 |
---|---|
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字面量
JSP语言定义了以下几个字面量:
-
布尔值(boolean):true 和 false
-
整型(int):与 Java 中的一样
-
浮点型(float):与 Java 中的一样
-
字符串(string):以单引号或双引号开始和结束
-
Null:null
XSS(跨站攻击)
内容来源:XSS(跨站攻击)_details/open/ontoggle-CSDN博客
一、XSS漏洞简介
XSS又叫CSS(Cross Site Script),跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。 常见的输出函数有: echo 、printf 、print 、print_r 、sprintf 、die 、var-dump 、var_export
二、XSS的原理
-
攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
-
诱使受害者打开受到攻击的服务器URL。
-
受害者在Web浏览器中打开URL,恶意脚本执行。
三、XSS攻击分类
1、反射型XSS:“非持久化”攻击者事先制作好攻击链接,需要欺骗用户点击链接才能触发XSS代码(服务器中没有这样的页面和内容),
一般容易出现在搜索页面。一般是后端代码进行处理。
2、存储型XSS:“持久化”代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤胡总和过滤不严,那么这些代码将存储到服务器中,每当有用户访问该页面时都会触发代码执行。这种XSS非常危险,容易造成蠕虫,大量盗窃cookie等危害。
3、DOM型XSS:基于文档对象模型DOM(Document Object Model)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够称为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操作的,如url,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端获取DOM中地数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器的前端代码进行处理。
四、XSS的危害
1.挂马
2.盗取用户的cookie
3.DOS(拒绝服务)客户端浏览器
4.钓鱼攻击,高级的钓鱼技巧
5.删除目标文章、恶意篡改数据、嫁祸
6.劫持用户的web行为,甚至进一步渗透内网
7.爆发web2.0蠕虫
8.蠕虫式的DOS攻击
9.蠕虫式挂马攻击、刷广告、刷流量、破坏网上数据
10.其他安全问题
五、常见的XSS攻击方式
一些常见的标签和属性。
下面我列举的标签大部分是可以自动触发js代码的,无需用户去交互,大部分情况下我们也是希望是自动触发而不是等用户去触发。
1、script标签
<script> 标签用于定义客户端脚本,比如 JavaScript。
<script>alert(1);</script> <script>alert("xss");</script>
2、img标签
<img> 标签定义HTML页面中的图像。
<img src=1 οnerrοr=alert(1);> <img src=1 οnerrοr=alert("xss");>
3、input标签
<input> 标签规定了用户可以在其中输入数据的输入字段。
onfocus 事件在对象获得焦点时发生: <input οnfοcus=alert(1);>
竞争焦点,从而触发onblur事件:
<input οnblur=alert(1) autofocus><input autofocus>
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<input οnfοcus="alert(1);" autofocus>
" οnclick=alert(1)> 这样需要点击一下输入框<br> " οnmοuseοver=alert(1)> 需要鼠标划过输入框<br>
4、details标签
<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发: <details οntοggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
<details open οntοggle=alert(1);>
5、svg标签
<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。 <svg οnlοad=alert(1);>
6、select标签
<select> 标签用来创建下拉列表。 <select οnfοcus=alert(1)></select 通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发: <select οnfοcus=alert(1) autofocus>
7、iframe标签
<iframe> 标签会创建包含另外一个文档的内联框架。 <iframe οnlοad=alert(1);></iframe>
8、video标签
<video> 标签定义视频,比如电影片段或其他视频流。 <video><source οnerrοr=alert(1)>
9、audio标签
<audio> 标签定义声音,比如音乐或其他音频流。 <audio src=x οnerrοr=alert(1);>
10、body标签
<body> 标签定义文档的主体。 <body οnlοad=alert(1);>
onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:
<body οnscrοll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
11、textarea标签
<textarea> 标签定义一个多行的文本输入控件。 <textarea οnfοcus=alert(1); autofocus>
xss-labs-master
level 1(无任何过滤)
分析代码:
<!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level2.php?keyword=test"; } </script> <title>欢迎来到level1</title> </head> <body> <h1 align=center>欢迎来到level1</h1> <?php ini_set("display_errors", 0); $str = $_GET["name"]; echo "<h2 align=center>欢迎用户".$str."</h2>"; ?> <center><img src=level1.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html>
发现源码没有任何的过滤。
直接插入js代码
payload: name=<script>alert('XSS')</script>
level-2(闭合标签)
先插入第一关的js代码进行测试,发现并没有出现弹窗。
检查页面元素,发现代码确实已经插入,但是并没有被执行。
查看页面源码,发现“<”和“>”被HTML实体编码了,成为了实体字符,盲猜在服务器端用 htmlspecialchars() 函数对 keyword 参数的值进行了处理。
接着可以看到插入value参数中的恶意代码没有被转义而是直接原样返回的,所以我们应该从这里入手。如果我们想要程序在这里执行弹窗代码,只需要将属性的标签闭合就可以了。
构造语句,闭合input标签。
payload: keyword="><script>alert('XSS')</script>
level-3(单引号闭合+JS事件函数绕过)
JS事件
JS事件就是用户或浏览器本身的某种行为,一般是用户对页面的一些动作引起的。例如:单击某个链接或按钮、在文本框中输入文本、按下键盘上的某个按键、移动鼠标等等。当事件发生时,您可以使用 JavaScript 中的事件处理程序(也可称为事件监听器)来检测并执行某些特定的程序。JS(JavaScript)与HTML 之间的交互是通过事件(event)实现的,或者说,事件是JavaScript和DOM之间进行交互的桥梁。
一般情况下事件的名称都是以单词on开头的,例如点击事件 onclick、页面加载事件 onload 等。
JavaScript常见的事件大体分类及常用事件:
1)鼠标事件
事件 | 说明 |
---|---|
onclick | 鼠标单击事件 |
onmouseover | 鼠标移入事件 |
onmouseout | 鼠标移出事件 |
onmousedown | 鼠标按下事件 |
onmouseup | 鼠标松开事件 |
onmousemove | 鼠标移动事件 |
2)键盘事件
事件 | 说明 |
---|---|
onkeydown | 键盘按下 |
onkeyup | 键盘松开 |
3)表单事件
事件 | 说明 |
---|---|
onfocus | 获取焦点时触发 |
onblur | 失去焦点时触发 |
onselect | 选中“单行文本框”或“多行文本框”中的内容时触发 |
onselectstart | 开始一个新的选择时触发 |
onchange | 具有多个选项的表单元素选择某一项时触发 |
4)编辑事件
事件 | 说明 |
---|---|
oncopy | 复制时触发 |
onselect | 页面内容被选取时触发 |
oncontextmenu | 按下鼠标右键时触发 |
5)页面事件
事件 | 说明 |
---|---|
onload | 文档加载完成后触发 |
onbeforeunload | 离开页面之前触发 |
题解
先用最基本的代码试一试。
果然没成功。
查看一下网页源码
发现这里有两处都将"<"和">"转义了,猜测服务器端在这两处都用htmlspecialchars()函数进行了处理。
观察发现value参数这里是单引号,所以本题要用单引号闭合。
浏览器中有一些事件可以执行js代码,这里可以使用onclick事件(事件不是固定的,什么事件都可以,只要能触发就行)(注意:onclick是点击事件,搜索完后要点击一下搜索框才能触发)
'οnclick='alert(1)
level-4(双引号闭合+JS事件函数绕过)
经典先试一下。
经典不成功
之后分析页面源码
h2标签中还是一样的将”<“和”>“被转义了,仍猜测是 htmlspecialchars 函数处理。
但下方input标签中”<“和”>“直接消失了,应该是用函数替换掉了删除了。
并且value参数后面是双引号,所以本题是双引号闭合。
还是用onclick事件函数:
"οnclick="alert(1)
level-5(JS伪协议绕过)
先尝试一下最初始的payload,发现script被用下划线隔开了。
接下来尝试一下JS事件绕过,发现oncilck也被下划线隔开了。
查阅资料后得知本题需要用JavaScript伪协议绕过。
JavaScript伪协议
JavaScript 伪协议(JavaScript pseudo-protocol)是一种在网页中使用 JavaScript 代码执行特定操作的技术。它并不是真正的协议,而是一种约定俗成的语法形式,用于在 HTML 中触发 JavaScript 代码的执行。
伪协议通常以 javascript:
开头,后面跟随一段 JavaScript 代码。当浏览器遇到这样的链接或事件处理程序时,它将解析并执行其中的 JavaScript 代码。
例如,以下是一个使用伪协议的示例:
<a href="javascript:alert('Hello, world!')">点击这里</a>
当用户点击上述链接时,浏览器将执行其中的 JavaScript 代码 alert('Hello, world!')
,并显示一个弹出窗口显示消息 "Hello, world!"。
伪协议可用于执行各种操作,如修改页面内容、处理表单数据、操纵 DOM 元素等。但它也存在一些安全风险,因为它可以用于执行恶意代码或进行跨站点脚本攻击(XSS)。因此,为了确保网页的安全性,应该避免使用不受信任的伪协议或仅在可靠的环境中使用它们。
题解
根据JavaScript伪协议的内容我们本题的思路就是通过新建一个标签绕过过滤。我们把JavaScript代码放入标签中,先将前面的标签闭合,之后点击新建的标签就可以直接执行avaScript代码,从而进行绕过。
"><a href=javascript:alert(/xss/)> 注意这里的/xss/ 只是一个简单的字符串,它并没有特殊的含义或功能,所以不是必须使用//,其他的字符也可以,如'' ""
如图,输入后搜索栏会出现一个新的标签,点击即可完成绕过。
本关小结:可以插入标签(如<a>标签的href属性)达到js执行的效果,前提是闭合号<"">没失效
level-6(大小写绕过)
本关连href都被下划线隔开了,所以我们不能再继续用JavaScript伪协议进行绕过。
但是经过尝试后我们发现被下划线隔开的部分如果用大写输入则不会再次被分隔,所以推断本关是大小写绕过。
所以可构造payload:
"><sCript>alert(1)</sCript> "Onclick="alert(1) "><a hRef=javascript:alert(/xss/)>
本关小结:大小写法绕过str_replace()函数
level-7(双拼写绕过)
先将之前的payload的关键字都尝试一下:
"Onclick <sCript> <a hRef=javascript:alert(/xss/)
结果发现其中的on script href都被删除了,我们猜测这里面进行了小写转化,并且将关键字给过滤掉了。
所以本关我们可以采用双拼写绕过:
比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on 比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
payload:
"><scscriptript>alert(1)</scscriptript> "oonnclick="alert(1) "><a hrhrefef=javascscriptript:alert(/xss/)>
本关小结:双拼写绕过删除函数(本题让我想起了之前做upload的一道题,好像也是双写绕过)
level-8(Unicode编码绕过)
先用关键字看看过滤了什么东西
"Onclick <sCript> <a hRef=javascript:alert(/xss/)>
我们发现本关不仅将输入的值插入了input标签中,还放在了href属性中,这就与页面中的“友情链接”产生了关系。
不仅如此,我们还发现本关不仅将双引号实体化了,还有大小写转换函数,还将onclick,script等关键字给过滤了。
分析到这里发现我们前几关的所有方法都不管用了,但通过查阅资料得知,这种情况下我们可以利用href的隐藏属性自动Unicode解码来进行绕过。
具体操作就是写一段js伪协议,然后利用在线工具对其进行Unicode编码,由于在HTML中,href属性可以解析Unicode编码,所以当我们将Unicode编码输入进去后,href属性会将编码自动解析为js伪代码从而执行。
javascript:alert(/xss/) 编码后: javascript:alert(/xss/)
输入后点击“添加友情链接“,之后点击”友情链接“即可显示窗口。
本关小结: href属性自动解析Unicode编码
level-9
老套路,先看看过滤了什么
"Onclick <sCript> <a hRef=javascript:alert(/xss/)> j
结果发现我们输入的内容不合法了?
查看源代码,我们发现本次的源码多了一个if判断,并且这个if判断是通过strpos函数进行验证的。
strpos函数
定义:strpos() 函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos() 函数对大小写敏感。
注释:该函数是二进制安全的。
题解
所以本题源码意为:如果我们输入的内容中没有http://,便会执行if从而echo”您的链接不合法?有没有!“
所以我们要在输入的内容中加上http://,并且注意http://要用注释符注释掉否则会执行不了无法弹窗。
所以构造payload:
(注意:这里的http://不能放在Unicode编码前面,因为href属性会优先解析Unicode编码,而解析完成后它并不会再返回到前面去判断http://是否存在,只会继续向后检测,所以就会导致if判断错误,所以这里http://只能在编码后方。)
javascript:alert(/xss/)/* http:// */
本关小结:插入指定内容(本关是http://)绕过检测,再将指定内容用注释符注释掉即可
level-10
先测试一下关键字:
"Onclick <sCript> <a hRef=javascript:alert(/xss/)> j
发现这次我们输入的内容并没有显示,并且发现这次input标签都被隐藏了。
到目前为止都没什么思路,那我们就先看一眼源码吧。
分析源码发现本关的GET传参变成了t_sort
,并且本关过滤了<>
,所以本关无法使用闭合插入标签的方法了,但是我们这关还可以用JS事件绕过。
要注意的是,由于input标签被隐藏了,所以本关页面中并没有输入框,但是我们在使用JS事件时需要输入框才能进行,所以本关我们要添加type="text"为页面
HTML <input> type
属性
定义和用法:type
属性规定要显示的 <input> 元素的类型。
如果未指定 type
属性,则默认类型为 "text"。
text: 默认,定义单行文本字段。
题解
所以可构造payload:
?t_sort="οnclick=javascript:alert(1) type="text"
本关小结:根据源码猜解传参的参数名,隐藏的input标签可以插入type="text"显示
level-11
经典关键词尝试一下
发现本关的input标签中有四个值,并且都被隐藏了。其中第四个名为t_ref的<input>
标签是http头referer的参数(就是由啥地址转跳到这里的,http头的referer会记录有),我们先做个简单的测试来验证一下前面三个标签名,GET与POST传参都试一下看看。
GET传参:
?t_link="Onclick <sCript> <a hRef=javascript:alert(/xss/)> j&t_history="Onclick <sCript> <a hRef=javascript:alert(/xss/)> j&t_sort="Onclick <sCript> <a hRef=javascript:alert(/xss/)> j
失败
POST传参:
t_link="Onclick <sCript> <a hRef=javascript:alert(/xss/)>&t_history="Onclick <sCript> <a hRef=javascript:alert(/xss/)>&t_sort="Onclick <sCript> <a hRef=javascript:alert(/xss/)>
同样失败
所以本关应该就referer头了,用burpsuite抓包一下,添加http头。
Referer: "Onclick <sCriPt> <a hReF=javascript:alert(/xss/)> j
发现关键词中的<>
都没了,所以本关应该用JS事件绕过,加之本关页面没有输入框,所以构造payload:
Referer: "Onclick=javascript:alert(1) type="text"
Referer
Referer是 HTTP请求header
的一部分,当浏览器(或者模拟浏览器行为)向web
服务器发送请求的时候,头信息里有包含Referer。比如我在`www.sojson.com
里有一个www.baidu.com
链接,那么点击这个www.baidu.com
,它的header
信息里就有:Referer=https://www.sojson.com
由此可以看出来吧。它就是表示一个来源。
简单来说,Referer是HTTP协议中的一个请求报头,用于告知服务器用户的来源页面。比如说你从Google搜索结果中点击进入了某个页面,那么该次HTTP请求中的Referer就是Google搜索结果页面的地址。如果你的博客中引用了其他地方的一张图片,那么对该图片的HTTP请求中的Referer就是你那篇博客的地址。
本关小结:考虑一下http头传值,本关是referer,但接下来也有可能是其他头,如Cookie等
level-12
查看页面代码
发现本关的代码和上一关基本一致,只有第四个input标签更改为了User-Agent头。
所以构造payload:
User-Agent: "Onclick <sCriPt> <a hReF=javascript:alert()> j
和上关一样,过滤了<>
,所以重新构造:
User-Agent: "οnclick=javascript:alert(1) type="text"
User-Agent
User-Agent即用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。而网站服务器则通过判断 UA 来给客户端发送不同的页面。
浏览器UA 字串的标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
本关小结:跟上题一样,考虑一下http头传值
level-13
查看页面代码
第四个input标签更改为t_cook,初步判断是cookie头。
之后抓包发现cookie头名为user,确定是cookie头了。
所以构造payload:
Cookie: "οnclick=javascript:alert(1) type="text"
Cookie
什么是Cookie:
Cookie是由服务器端产生并发送给客户端浏览器的,浏览器会将发送过来的Cookie存储到某个文件中,随后再一次请求时,会自动带着存储的Cookie一并请求到服务器端(注意:Cookie虽然保存了sessionld,但它并不是JSP的内置对象,是需要实例化的)
Cookie的作用:
Cookie负责客户端和服务器端的文本传递,最终文本保存在浏览器。
Cookie的工作原理:
浏览器发送一次请求时,服务器会判断有没有Cookie,如果没有就创建Cookie,以名值对的形式将sessionld保存在Cookie中并响应,浏览器接收响应并把Cookie保存在客户端浏览器,当浏览器下一次发送请求时,request中会自动带着Cookie去发送到服务器端,服务器端接收处理并再次响应。
本关小结:还是http头传参
level-15(ng-include文件包涵)
观察页面源代码,这里发现一个新东西。
ng-include
定义:
ng-include指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include
属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
语法:
< element ng-include= "filename" οnlοad= "expression" autoscroll= "expression" > < /element > ng-include 指令作为元素使用: < ng-include src= "filename" οnlοad= "expression" autoscroll= "expression" > < /ng-include >
所有的 HTML 元素都支持该指令。
题解
我们可以先尝试包涵一下第一关
?src="./level1.php"
成功,所以我们可以随便包涵之前的一关并对其传参,以达到弹窗的效果。
老样子,先测试过滤了什么。
?src=" Oncilke <sCriPt> <a hReF=javascript:alert(/xss/)> j
观察发现,本关只是对"
,<>
进行了实体化,并没有过滤掉什么。
所以我们可以大胆地对第一关进行包涵,并让第一关弹窗了。(注意,这里不能包涵那些直接弹窗的东西如<script>
,但是可以包涵那些标签的东西比如<a>
、<input>
、<img>
、<p>
标签等等,这些标签是能需要我们手动点击弹窗的)
这里以img为例:
?src="./level1.php?name=<img src=1 οnclick=alert(1)>"
本关小结:ng-include文件包涵,可以无视html实体化
level-16
测试过滤
发现这里先是将字母小写化了,再把script和/替换成空格,最后将空格给实体化。
之后看一下源代码
我们发现确实是将空格给实体化过滤掉了,但由于在HTML中回车(换行)和空格的作用是相同的,都是分隔符,所以我们这里可以用回车来代理空格来进行绕过。
回车的url编码是%0a,再配合上不用/的<img>
、<details>
、<svg>
等标签,可构造payload:
?keyword=<img%0asrc=1%0aοnclick=alert(1)>
本关小结:回车代替空格绕过检测
level-17
关键字测试一下
?arg01=" Oncilke <sCriPt> <a hReF=javascript:alert(/xss/)> j
观察发现,虽然加了html转义,但是这里不需要闭合符号,传入的参数都出现在了embed标签上,打开后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)
embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,但是呢相对于他们,embed标签打开不了文件的时候就会没有显示的区域在,他们就能有块错误的区域 。
所以,这题的解法很简单,首先得用一个支持flash插件的浏览器打开本关(打开后会有个图片出来的,不支持flash插件浏览器就没有),如果不想下载的话,自己去后端改一下也行,将后端第十七关的代码(level17.php)指向的swf文件改为index.png。
更改完成后页面就会显示图片了。
之后我们构造payload就可以了:
?arg02= οnclick=alert(1)
本关小结:貌似就是熟悉一下触发事件的使用
level-18
查看代码就可以发现本关其实和上一关没多大差别,我们还是先把后端代码更改一下。
更改完成后还是用关键字测试一下
?arg02=" Onclick <sCriPt> <a hReF=javascript:alert(/xss/)> j
发现除了实体化一些内容外也没别的了,所以构造的payload和上关一样
?arg02= οnclick=alert(1)