目录
level16 替换
level1
分析页面可得,传参 name=test ,页面回显参数的值test,以及参数的长度
分析源码,我们可以看到它将name的值赋给 $str 并在<h2></h2>标签中调用
那么 就很明显,这一关主要就是考察反射型xss
但是由于不知道服务器端对于提交的敏感字符有没有过滤,
所以这里直接在name参数中赋值一个简单的弹窗来进行测试。<script>alert('xss')</script>
我们可以看到 js的弹窗代码 顺利执行了
level2
这关我们可以发现多了一个文本框,我们先用之前的语句填入文本框里面,发现不行
分析源码,我们发现 htmlspecialchars($str) 对keyword参数的值进行了处理。
htmlspecialchars() 函数
把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体 (html字符实体),把 < 和 > 转换为实体常用于防止浏览器将其用作 HTML 元素。但是用户又需要在页面上显示输入时,转换为HTML实体能防止代码的运行。如在xss的防御中就能够体现。
这个函数是把预定义的字符转换为 HTML 实体,说明把<script>
标签吃掉了,那么我们的突破口就在value这里。
我们可以通过闭合标签,使得<input name=keyword value="'.$str.'">
这一句就闭合掉,即在<script>alert('xss')</script>
前面加">
,对前面input标签进行闭合。
再此尝试注入,成功
level3
使用第二关的码测试一下,发现没用。
分析源码,发现不仅对"
号做了防御,并且value这里也加了htmlspecialchars
函数
虽然对了双引号做了防御,但是却放行单引号,这种情况我们可以通过事件标签触发表单执行。
这种情况我们可以通过事件标签触发表单执行,即通过使用HTML的事件知识对其注入。
html事件https://www.runoob.com/tags/ref-eventattributes.html
这里我们用到了
onclick
http://127.0.0.1/xss-labs/level3.php?keyword=test' onclick='alert("xss")'&submit=%E6%90%9C%E7%B4%A2
单引号闭合
提交url之后需要点击输入框,触发事件( onclick 当单击鼠标时运行脚本)
level4
分析源码 我们发现 < 和 > 被替换成 空格
且 value 的闭合条件为 双引号
与上一关一致,更改单引号为双引号
点击文本框触发事件
leve5
我们发现它对<script和on的都做了特殊处理,而且还使用strtolower
函数对所有字符串变成小写,单引号也不可用了
还是可以闭合语句,通过双引号加>闭合 ( 加 > 是因为要闭合input标签,之后写入自己的标签)
javascript伪协议以及标签进行注入
使用javascript伪协议以及标签进行注入,就是在代码前面加上javascript:,在这里的标签不一定只是链接标签,还可以其他标签,可以自己了解。
http://127.0.0.1/xss-labs/level5.php?keyword="> <a href='javascript:alert(/xss/)'>%E6%90%9C%E7%B4%A2
level6
尝试使用之前的注入方式失败
分析源码,我们发现他虽然过滤了很多,但相比较5关没有使用strtolower
函数(对所有字符串变成小写) 所以可以考虑大小写绕过
http://127.0.0.1/xss-labs/level6.php?keyword="><a HREF='javascRIPT:alert(/xss/)'>
http://127.0.0.1/xss-labs/level6.php?keyword="><scRipt>alert(/xss/)</scRipt>
level7
分析源码,发现相比之前过滤的东西更多了,但是它却把特殊语义的字符串修改成了空字符串,且只过滤一次,我们可双写绕过
"> 对input标签闭合
http://127.0.0.1/xss-labs/level7.php?keyword=test"><sscriptcript>alert(/xss/)</sscriptcript>&submit=%E6%90%9C%E7%B4%A2
level8
分析源码我们会发现之前的方法都不可以使用了
但是我们会发现有一个友情链接,与我们之前与使用的javascript为协议一致
这里将是一个突破口,由于script被过滤了但是我们可以尝试将script实体化
实体化(转换工具自行百度)
javascript:alert(/xss/)
javascript:alert(/xss/)
我们需要将这串字符写入 文本框中 再点击添加友情链接 最后点击友情链接 即可成功
(通过hackar提交是不可行,做这关的时候给我郁闷坏了,前几关都可以)
在浏览器中查看一下源码,验证一下我们的想法,和第五关使用的javascript伪协议一致
level9
分析源码发现 在第八关的基础上加了一个判断语句
strpos()函数,结合判断语句,我们必须在代码中加入http:// 但是并没有过滤HTML实体编码,所以我们还是使用编码绕过。
使用过滤HTML实体编码,但是由于需要加入http://,肯定不能在http://后面加代码,必须在前面,并且将http://注释掉才能执行。
javascript:alert(/xss/)//http://
level10
这一关使用之前的方法都无法成功,我们可以分析一下源码
我们通过url 传入的keyword参数只是处理了一下便输出了,没有可以注入的地方。
但是我们还会发现这里有三个input标签,三个钟只有最后一个标签可以下手。
这里有一个隐藏的参数t_sort,代码只是过滤了< 和>并没有其他操作。
我们可以从这里入手,我们可以使用触发事件标签进行。
还有一点要注意的是,由于页面上没有文本框,所以我们需要在url后面的添加 type="text"(或者修改源码将hidden,修改为text)
提交url 后页面上会显示一个文本框 ,点击即可过关。
http://127.0.0.1/xss-labs/level10.php?keyword=1&t_sort=" type="text" onclick="alert('xss')
level11
分析源码,我们发现有一句是之前没有见过的
$str11=$_SERVER['HTTP_REFERER'];
$_SERVER['HTTP_REFERER']可以获取当前链接的上一个连接的来源地址,即链接到当前页面的前一页面的 URL 地址,可以做到防盗链作用,只有点击超链接(即<A href=...>) 打开的页面才有HTTP_REFERER环境变量, 其它如 window.open()、 window.location=...、window.showModelessDialog()等打开的窗口都没有HTTP_REFERER 环境变量。
简单来说呢,就是HTTP_REFERER会获取http请求头中的Referer字段,就是我们上一级网页的url。
那么我们就需要使用插件(或者burpsuite 进行抓包),修改Referer字段。
这里我使用了火狐的ModHeader插件修改,同样点击文本框触发事件执行脚本。
" type="text" onclick= "alert('xss')
level12
网页查看源代码发现了,t_ua 的值为User-Agent,那么我们尝试上一关的方法修改User-Agent
ModHeader插件或者burpsuite工具修改User-Agent,同样点击文本框触发
" type="text" onclick="alert(/xss/)
level13
分析源码,我们发现了一条语句
$str11=$_COOKIE["user"];
所以我们可以修改 cookie 来达到注入的目的
老样子,使用火狐插件Cookie-Editor或者burpsuite来修改
" type="text" onclick="alert(/xss/)
level14
跳过~
查了许多教程大部分都跳过了
据部分教程说与 Exif xss 有关
level15
在后台发现一个<!--ngInclude: 1.gif-->
语句
分析源码,发现ng-include,很有可能这个指令就是突破口,毕竟也没其他地方可以下手了
ng-include指令:
利用ng-include指令的特性包含一个有漏洞的html文件,注意这里有对尖括号的过滤。
我们可以利用第一关的漏洞完成
http://127.0.0.1/xss-labs/level15.php?src='http://127.0.0.1/xss-labs/level1.php?name= "><a href="javascript:alert(/xss/)">'
level16
分析源码
发现这一关得到过滤将空格、反斜杠、script都被str_replace函数替换成 了
我们可以将%0a或者%0D当成空格使用,在HTML中这样是合法的。