# 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`のリンクがあることがわかります。 ![image](https://hackmd.io/_uploads/rJpNUfd0a.png) 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アカウントのクッキーを置き換えリクエストを送信するだけです。