DVWA(XXS:stored)全レベルの脆弱性について


前提

目標

  • 脆弱性の理解を深める。

手順概要

  • 大まかな挙動を把握する
  • コードを見て脆弱性をみつける
  • コードの脆弱性を攻撃する

内容

挙動の把握

  • ボタンを押すとPOSTリクエストが飛ぶ
  • 文字列がDBに保存され、下部に転写される

コードを確認

low

  • 入力値がそのまま格納される。
<?php
$name    = trim( $_POST[ 'txtName' ] ); 
?> 

medium

  • str_replace(a,b,c)は、cの中にaが入っていればbに置換する
  • 今回の場合、<script>が入っていれば、"空"へ置換される
<?php
$name = trim( $_POST[ 'txtName' ] );  
$name = str_replace( '<script>', '', $name ); 
?> 

high

  • mediumロジックは同じ
  • ここでは正規表現を使ってさらに厳格にチェックしている。
<?php
$name = trim( $_POST[ 'txtName' ] );  
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name ); 
?>

impossible

  • htmlspecialcharsはhtmlにとっての特殊文字をエスケープさせるので、タグの入力がエスケープされる。
<?php
$name = stripslashes( $name ); 
name = htmlspecialchars( $name ); 
?>

脆弱性を攻撃する

nameに入力するが、htmlで文字制限かかっているので、maxlengthを増やせば入力可能になる。

low

  • 防御無しのため、ストレートに攻撃する。
  • <script>alert("low")</script>
  • 見づらいがscriptが埋め込まれている(下図)

medium

  • 制限されているのは<script>という文字列だけなので一部変更すれば突破できる
  • <script >alert("medium")</script >
  • messageはエスケープされている。

high

  • mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
  • <img src="#" onerror=alert("high")>
  • messageはエスケープされている。

impossible

  • 無理っぽい