# Web Security Academy Access Control Vulnerability Writeup
[toc]
## Unprotected admin functionality
https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality
`robots.txt`があるみたいです。
```text=
# robots.txt
User-agent: *
Disallow: /administrator-panel
```
/administrator-panelにアクセスして見ると、管理パネルにアクセスでき、carlosを消して終わりです。
## Unprotected admin functionality with unpredictable URL
https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality-with-unpredictable-url
```htmlembedded=
<script>
var isAdmin = false;
if (isAdmin) {
var topLinksTag = document.getElementsByClassName("top-links")[0];
var adminPanelTag = document.createElement('a');
adminPanelTag.setAttribute('href', '/admin-nlgo0t');
adminPanelTag.innerText = 'Admin panel';
topLinksTag.append(adminPanelTag);
var pTag = document.createElement('p');
pTag.innerText = '|';
topLinksTag.appendChild(pTag);
}
</script>
```
`/admin-nlgo0t`というリンクがありそうです。
アクセスして終わりです。
## User role controlled by request parameter
https://portswigger.net/web-security/access-control/lab-user-role-controlled-by-request-parameter
Cookieを見るといかにも怪しそうな名前のものがあります。
```text=
Admin=false;
```
trueにしてあげて、profile画面にアクセスすると`Admin panel`が現れるのでアクセスしてcarlosを消せば終わりです。
## User role can be modified in user profile
https://portswigger.net/web-security/access-control/lab-user-role-can-be-modified-in-user-profile
admin panelには`roleid=2`のユーザのみがアクセスできるそうです。
そのため、roleid=2にできそうな箇所を探してみると、Emailの変更が気になります。
```text=
POST /my-account/change-email HTTP/2
Host: 0ac900340313e8ca82f2477000e900a4.web-security-academy.net
(snip)
{"email":"hoge@vul.jp"}
```
これを、以下のように変更してみます。
```json=
{
"email":"test@ex.com",
"roleid":2
}
```
そうすると、`roleid`が`2`になったことが確認できます。
roleidが2になったことで、管理画面のリンクが見えるのでアクセスし、carlosを削除すればクリアです。
## User ID controlled by request parameter
https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter
`wiener:peter`で、ログインをすると`/my-account?id=wiener`に飛びます。
`id=carlos`にするとcarlosのAPIキーが見えるのでこれを`Submit solution`に入れればクリアです。
## User ID controlled by request parameter, with unpredictable user IDs
https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-unpredictable-user-ids
`wiener:peter`でアクセスすると以下のようなパスに飛びます。
```text=
/my-account?id=1218f9a5-e18e-40a8-99e5-31ed88c8ae46
```
`id`は予測不可能な値のようにみえます。
他の部分を見ていると、Blogには`Author`のリンクがあることがわかります。

carlosを押下するとユーザのIDらしきものを取得できます。
取得したIdを`/my-account?id={:id}`に入れるとcarlosアカウントのAPI Keyを取得できラボはクリアです。
## User ID controlled by request parameter with data leakage in redirect
https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-data-leakage-in-redirect
login後、`/my-account?id=carlos`に変更してアクセスするとなぜか`/login`にリダイレクトする302のbodyにAPI情報を含んだhtmlが混じっています。
これで終わりです。
## User ID controlled by request parameter with password disclosure
https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-password-disclosure
ログインをするとパスワード変更機能があるようですが、以下を見ればわかるようになぜかpasswordが表示されています。
```htmlembedded=
<input required type=password name=password value='peter'/>
```
`/my-account?id=administrator`にアクセスを行い、パスワードを取得しておきます。
一度logoutを行い、administratorとしてログインを行いcarlosを削除しラボをクリアします。
## Insecure direct object references
https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references
Live chatにアクセスをし、`Viwe transcript`を押すと、`2.txt`がダウンロードされます。
なぜ2?と思い`1.txt`にアクセスすると、passwordを変更していそうな文を見つけれるので、取得したパスワードと`carlos`でログインをしてみるとログインができクリアです。
## URL-based access control can be circumvented
https://portswigger.net/web-security/access-control/lab-url-based-access-control-can-be-circumvented
Labの説明に答えがあるような気がします。
- `/admin`があるが、内部からしかアクセスができない。
- X-Original-URLをサポートしている。
```text=
X-Original-Url: /admin/delete
```
をつけ、`/?username=carlos`にアクセスを行えばクリアできます。
## Method-based access control can be circumvented
https://portswigger.net/web-security/access-control/lab-method-based-access-control-can-be-circumvented
まず、`administrator:admin`で、ログインを行いユーザの権限を変更する際のリクエストを取得しておきます。
次に、ログアウトを行い、`wiener:peter`でログインを行い、クッキーを、先ほど取得したリクエストのクッキーと置き換えます。
これを行うことでユーザ権限を変更する際のリクエストを送信しているのが`wiener`になります。
次に、POSTだとうまくいかないはずなので、`GET`に変更します。
変更したらリクエストを送信しラボをクリアします。
## Multi-step process with no access control on one step
https://portswigger.net/web-security/access-control/lab-multi-step-process-with-no-access-control-on-one-step
`administrator:admin`でログインし、Userの権限を変更する機能を見てみると、一度`Upgrade user`を押下あと、確認を押下することで変更できることがわかります。
これは、`confirmed` Parameterを見ているようです。
手順としては以下です。
1. administratorで変更時(`confirmed=True`)のリクエストを取得しておく
2. wienerでログインを行い、cookieを保持しておく。
3. `1`で取得したリクエストのCookieを`2`で取得したCookieと置き換える。
4. 送信。
これでクリアです。
## Referer-based access control
https://portswigger.net/web-security/access-control/lab-referer-based-access-control
特になしです。
administratorでログインを行い、`Upgrade User`のリクエストを保持しておきます。
次に、wienerアカウントでログインをし直し、cookieoを取得します。
先ほど保持しておいたリクエストのCookieとwienerアカウントのクッキーを置き換えリクエストを送信するだけです。