そもそもなぜXSSを手動で引き起こすのか。
普通はXSSなんていうものはウェブFW使用していれば出ないんですよね。
そう、普通はね……
今回何を血迷ったのか、なぜかFW外でPOST処理を行ってしまったために引き起こってしまった悲しいXSS対策とツールを入れるのが面倒でXSSを手動で実行する悲しいやり方のお話です。
そもそもXSSって
簡単にいうと<>&"'
とかhtmlで特殊な記号として扱われているやつをホニャホニャ処理してあげないと大変なことが起こりまっせってことです。
<input type="text" name="test" value="">
とかいうのがあったとしましょう。
ここに、こんな値をPOSTされたとしてHTMLが返却されたとしましょう。
">script></script>"
<input type="text" name="test" value=""><script></script>"">
とかやられるとJSが起動しちゃったりするわけですね。
そうすると不必要にPOSTされちゃったり、データ抜かれたりするわけです。
イントラネットとかだとこの辺りはFW(ファイヤウォール)でブロックとかしてたり、イントラネットじゃなくてもブラウザがブロックしてくれたりしてくれるのですが、今回はそこはなしということで。
手動POST
GETは普段みなさんがWEBページ見ているときのやっているやつですね。気にしてないと思いますが。
POSTはデータを投稿する時に使うのですが、これが普通にアクセスしていてはできないときました。
なのでpowershellを使ってちょっと工夫しないといけません。
$ie = New-Object -ComObject InternetExplorer.Application
$ie.visible = $true
# テストしたいURL
$indexUrl = "~~~~"
$ie.navigate($indexUrl, $null, $null, $null)
$postUrl = "~~"
# csrftokenがあればここでコピーしましょう
# ここでPOSTデータを通常のリクエストURLに乗せるような形で&
$post = "test=">script></script>"&test2=hogehoge"
$postDatabyte = [System.Text.Encoding]::UTF8.GetBytes($post)
$header = "Content-Type:application/x-www-form-urlencoded `r`n"
$ie.navigate($postUrl, $null, $null, $postDatabyte, $header)
これでデータをPOSTし結果としては、XSSブロックされたとか出るでしょう。
っていうかReactとかVueとか昨今流行っている物を使うとこの辺って出ないんですよね。
ま、ReactとかVue使いましょうねってことかもしれません。