Table of contents
NodeJS - Prototype Pollution Bypass
Hint
isAdmin or not, that is the question
Statement
A new web administrator has set up a site he calls "root me’s social network."
It appears to save all user posts, even if they are private.
Finish admin to find out the truth!
Bài này lúc mới vào sẽ bắt nhập 1 cái tên:
- Actions > My Post: Chức năng cho phép đăng post
Tạo thử 1 cái post:
Tạo thêm cái nữa:
API của chức năng tạo post POST /mypost
:
Ở trong ảnh này có hint về 1 API nữa:
GET /createdPosts
là API để xem các post.
- Actions > My Post: Chức năng cho phép chuyển trạng thái post từ private qua public và ngược lại.
POST /profile
là API của chức năng này.
Mục tiêu là vào được chức năng Admin:
Dựa theo hint thì mình đoán ở server đang sử dụng 1 đoạn check:
var user = {};
if (user.isAdmin = true) {
//gửi flag
}
Qua các dữ liệu trên thì mình đoán ở dưới server đang xử lý như sau:
var full_post = {}; //đây là object gọi ra được từ API /createdPosts
var visibility = req.session.visibility; //lấy từ giá trị của trường visibility từ cookie
var post_title = req.body.title; // gửi từ param title của API /mypost
var post_content = req.body.post; // gửi từ param post của API /mypost
// Đây là đoạn để kiểm soát trạng thái của post là public hay private
if ((visibility = "public")) {
full_post.visibility.post_title = post_content;
}
Ở đây mình thấy có thể pollute object full_post
như sau:
full_post[__proto__][isAdmin] = true
Đây là các step mình làm:
- Bước 1: Vào Proxy bật Intercept lên
Bước 2: Vào
POST /mypost
và đổivisibility=__proto__
,title="isAdmin"
,post=true
. Nhớ để đúng data type, bản thân mình lúc đầu suy nghĩ theo cách này nhưng vì để data type củapost="true"
(tức là kiểu string) nên ko làm ra được. Và vì cái ko làm ra được mà mình loay hoay 2 tuần nghĩ thêm 7749 cách khác, nhưng hóa ra mọi thứ về đúng với cái ý tưởng đầu tiên mình làm.Bước 3: Sau khi làm xong bước 2, lúc này
full_post[__proto__][isAdmin] = true
nghĩa là mọi object kế thừa thuộc tínhisAdmin
sẽ đều làtrue
. Vậy thìuser[isAdmin]=true
(ta bypass được đoạn check vừa nãy). Giờ thì forward cái request vừa xong.Bước 4: Lên trình duyệt rồi vào giao diện cho admin, đây là API được gọi khi vào giao diện cho admin
Flag:
__pr0t0__.b3_C4r3ful_w1th_Pr0t0typ3