Có vẻ như application chỉ hoạt động tốt với Chrome.

Apps

Danh sách các apps dựa trên path:

Behaviours

Account Linking

Authorize request dùng để link account:

https://www.tiktok.com/v2/auth/authorize/?client_key=aw8cb3204x0a1g88&response_type=code&scope=user.setting.update,user.setting.list,bizpartner.user.info,bizpartner.item.info,biz.account.info,biz.account.phone,biz.account.email,user.info.basic,user.info.profile,user.info.stats,user.account.type,user.info.email,user.info.phone,user.info.showcase,video.list.no_watermark,video.list.private_ads.no_watermark,user.account.configure,video.list.manage,live.list,comment.list,comment.list.manage,series.collection.list,message.list.admin,biz.promote.create,biz.promote.upgrade_stats&lang=en&state=cGxhdGZvcm09dGlrdG9rJmxvZ2luX2FjdGlvbj1iaW5kJmZyb21fcGFnZT0mc2hvd19iaW5kX2Vycm9yPXRydWUmc2hvd19sb2dvdXQ9dHJ1ZSZhYWR2aWQ9JnZlcmlmeV90aWNrZXQ9VlRJU0dPNjY5NjZDUFhVVDM4UUJQREZSVlI4WEpTVzc5U0pHVU4mdmVyaWZ5X3BhZ2U9dXNlci1zZXR0aW5nJmNzcmZ0b2tlbj05YmVjYzJlYWViNzc1NTUxMTAyYTg0NjFlYjBlMmY0ZDY0MjkyY2MwJnJlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRmFkcy50aWt0b2suY29tJTJGaTE4biUyRnRyYW5zaXQ.&disable_auto_auth=1&redirect_uri=https%3A%2F%2Fads.tiktok.com%2Fi18n%2Ftransit
 
Referer: https://ads.tiktok.com/

Có thể thấy, application sử dụng OAuth với response_typecode.

Callback request có chứa code:

https://ads.tiktok.com/i18n/transit?code=sVeAmv40LF8LbxFJoVHpFL8-EP9Tkp-4V2GEuhz0zI71TK4zSjoXA-27FJIQhFp7M3OiuxBz2L3b4ViGqsb47t5GrHs0BnpktBiQOtJg4iVSuPyX0skKcIc_tVFZtWSgxnvjeILctt-TVDpFR-nRhLWDAzNKC_6oo16Vo0TPNtjsrogEZy8oRZg5HDpSffNMUuufVhuFvThaQcS23Q1TSjTmcjoX8uRjC63r0O2NgowKU8cgrdXCXp7akoyIICwUFPNdyYjiZDxi9oNP736VxFKIzdR3N7-Kd97vV6nQWmsRvt17ha11FAmo4Ntqm9SAoRMwltNzYIcLLfE9PZ_qZwDj4-RJcCDO9RXwvL8pSSM%2A3%216518.va&scopes=user.info.basic%2Cuser.info.profile%2Cuser.account.configure%2Cuser.setting.list%2Cbiz.account.info%2Cvideo.list.private_ads.no_watermark%2Cmessage.list.admin%2Cbiz.account.phone%2Cbiz.account.email%2Cuser.setting.update%2Cuser.info.email%2Cbizpartner.user.info%2Cbizpartner.item.info%2Cseries.collection.list%2Clive.list%2Cvideo.list.manage%2Ccomment.list%2Cuser.info.showcase%2Cuser.info.stats%2Cuser.info.phone%2Cvideo.list.no_watermark%2Ccomment.list.manage%2Cbiz.promote.upgrade_stats%2Cbiz.promote.create%2Cuser.account.type&state=cGxhdGZvcm09dGlrdG9rJmxvZ2luX2FjdGlvbj1iaW5kJmZyb21fcGFnZT0mc2hvd19iaW5kX2Vycm9yPXRydWUmc2hvd19sb2dvdXQ9dHJ1ZSZhYWR2aWQ9JnZlcmlmeV90aWNrZXQ9VlRJU0dPNjY5NjZDUFhVVDM4UUJQREZSVlI4WEpTVzc5U0pHVU4mdmVyaWZ5X3BhZ2U9dXNlci1zZXR0aW5nJmNzcmZ0b2tlbj05YmVjYzJlYWViNzc1NTUxMTAyYTg0NjFlYjBlMmY0ZDY0MjkyY2MwJnJlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRmFkcy50aWt0b2suY29tJTJGaTE4biUyRnRyYW5zaXQ.
 
Referer: https://www.tiktok.com/

Binding code với account để thực hiện linking nằng bằng request sau:

POST /passport/web/auth/bind/?msToken=ptaOLGNGPgEVY8ZFka6gsr1E41kMw_XjPqH6hubtqGRgRlIg5Fjh7-ArWysK4bDvmv9pA0TCO4UPZotSm6L143bozM9is85L1K6OdAT7tOW_McFuwuFm7cXpu46JRQnolZID_NL8YRsw22ab41cTzA==&X-Bogus=DFSzswVOzb0xXv4jCSS4QU9WcBn9&_signature=_02B4Z6wo00001qlZc7wAAIDCqVlzvtrc1qapWXcAAMI582 HTTP/2
Host: ads.tiktok.com
 
aid=1583&service=&language=en&platform_app_id=1294&fp=verify_mdafof7q_MqVxtKSS_WUzf_4t9i_AHBX_aGBZb4cdpqH9&other_action=2&profile_key=&code=sVeAmv40LF8LbxFJoVHpFL8-EP9Tkp-4V2GEuhz0zI71TK4zSjoXA-27FJIQhFp7M3OiuxBz2L3b4ViGqsb47t5GrHs0BnpktBiQOtJg4iVSuPyX0skKcIc_tVFZtWSgxnvj

Thử thực hiện CSRF thì nhận được response sau:

{"data":{"captcha":"","desc_url":"","description":"Illegal request","error_code":2035},"message":"error"}

Lý do là vì request bị thiếu mất header X-Tt-Passport-Csrf-Token: 54fe719102a5032b59a2cb7e248d3f9e.

Thử thực hiện lại CSRF bằng cách:

  1. Intercept request gốc
  2. Copy header X-Tt-Passport-Csrf-Token
  3. Chạy CSRF payload và intercept request của CSRF payload.
  4. Thêm header X-Tt-Passport-Csrf-Token vào request của CSRF payload.
  5. Drop request gốc và forward request giả mạo.

Kết quả cho thấy ta đã link account thành công. Điều này cho thấy application có biện pháp ngăn chặn CSRF.

Do là một header nên nếu xây dựng CSRF PoC mà sử dụng XHR và set request header thì nó sẽ gửi một OPTIONS request. Tuy nhiên, response của OPTIONS request này không có header `Access-Control-Allow-Headers` nên trình duyệt sẽ block request. Dẫn đến, chúng ta không có cách nào để làm giả `X-Tt-Passport-Csrf-Token`.

Hơn thế nữa, giá trị này của header được lấy từ 2 cookie sau:

passport_csrf_token=54fe719102a5032b59a2cb7e248d3f9e
passport_csrf_token_default=54fe719102a5032b59a2cb7e248d3f9e

Và 2 cookie này được set thông qua response của request sau:

https://business-sso.tiktok.com/check_login/?aid=1583&service=https%3A%2F%2Fads.tiktok.com%2Fi18n%2Fnb_creation%2Fcreate%2Fad-detail%3Faadvid%3D7524745273206571015&language=en&appId=1583&lang=en&msToken=jLzNB_EJc3Jn2cQsGxdO9HZgpupzW_Z9k47-tc6-ppIvf-82CwW75pnSiRuhqQrEcyafL-T_4zMgmuD9ZmLtU0EypUqyC4Yuf5KwDFzkp_hDtfpMYqy3UTgiJH3ZCAXsakfgZA0=&X-Bogus=DFSzswSOjhhANCmbCSSgkz9WcBrj&_signature=_02B4Z6wo00001yte3PwAAIDDK17c.JghtRcrXtBAAKK2b7

Unrelevant Requests

Request để tracking:

POST /v1/list HTTP/2
Host: mcs-sg.tiktokv.com
POST /list HTTP/2
Host: mcs-sg.tiktokv.com

Request để lấy capcha:

GET /captcha/get?{PARAMS} HTTP/2
Host: verification-sg.tiktok.com

Request verify capcha:

POST /captcha/verify?{PARAMS} HTTP/2
Host: verification-sg.tiktok.com

Ngoài ra còn một số request không quan trọng khác.

Xây dựng Scope và export ra để dùng cho các Burp Project sau.
Có thể dùng các extension sau để lọc nhiễu:
- [aleister1102/noizy: A Burp Suite extension that blocks requests to unwanted domains (ads, tracking, analytics) using public blocklists.](https://github.com/aleister1102/noizy)
- [capt-meelo/filter-options-method: A Burp extension that filters out OPTIONS requests from populating Burp's Proxy history.](https://github.com/capt-meelo/filter-options-method)

Cookie dùng để authen là:

sid_tt_ads=8202a75eb533a149da1c0a90d7376c4b
sessionid_ads=8202a75eb533a149da1c0a90d7376c4b;
sessionid_ss_ads=8202a75eb533a149da1c0a90d7376c4b;
sid_guard_ads=8202a75eb533a149da1c0a90d7376c4b%7C1752590346%7C259200%7CFri%2C+18-Jul-2025+14%3A39%3A06+GMT

Decode giá trị của cookie cuối:

sid_guard_ads=8202a75eb533a149da1c0a90d7376c4b|1752590346|259200|Fri, 18-Jul-2025 14:39:06 GMT

Nếu có 1 trong số những cookie trên thì vẫn có thể authen, nếu thiếu tất cả thì response sẽ là:

HTTP/2 200 OK
{"data":{"description":"session expired, please sign in again","name":"session_expired"},"message":"error"}
Trong số những cookie trên thì cookie `sessionid_ss` có `SameSite` attribute là `None`.

Findings

Các file JavaScript thường tập trung ở các domain có chữ cdn hoặc chữ static chẳng hạn như lf16-cdn-tos.tiktokcdn-us.comlf16-ttmp.tiktokstaticb.com.

lf-tt4b.tiktokcdn.com

URL lấy file JS có dạng: https://lf-tt4b.tiktokcdn.com/obj/ttastatic-sg/account_center_i18n_web/sg/js/index.be72556d.js. Nếu đổi js ở cuối thành %6a%73 thì server vẫn hiểu. Từ đây suy ra server có decode URL.

Trong file https://lf-tt4b.tiktokcdn.com/obj/ttastatic-sg/biz_manager_creation/static/js/chunk-common~2b6f9538.6662b068.js có thông tin về việc sử dụng pdf.js bị dính lỗ hổng CVE-2024-4367 (XSS).

ads.tiktok.com

aadvid

Phân biệt người dùng bằng giá trị của param aadvid: https://ads.tiktok.com/i18n/dashboard?aadvid=7524745273206571015. Nếu cố truy cập vào một ID khác thì sẽ bị redirect về trang https://ads.tiktok.com/i18n/forbidden. Thực chất, có một request để kiểm tra quyền truy cập:

https://ads.tiktok.com/api/v4/i18n/account/permission/detail/?aadvid=1&{PARAMS}
 
HTTP/2 200 OK
{"code":40002,"msg":"lỗi quyền.","extra":{"i18n_key":"KEY_PERMISSION_ERROR","type":"permission_statement_failure"},"data":{}}

Có thể thấy, request kiểm tra quyền cũng có chứa aadvid với giá trị là ID mà cần kiểm tra.

aid

Request lấy info người dùng:

https://ads.tiktok.com/passport/web/account/info/?aid=1583&{PARAMS}
 
HTTP/2 200 OK
{"data":{"user_id":7524744181160363029,"user_id_str":"7524744181160363029","odin_user_type":12,"sec_user_id":"MS4wLjABAAAAEUu4rcWx4WRFPIgMRW6kxsxoif9u4TZau1MMc7vycSt_SOA-YtTbY9RXsU6lYlkS","screen_name":"user2334587003026","avatar_url":"","description":"","mobile":"","email":"m***5@gmail.com","username":"","has_password":1,"create_time":1751991065,"connects":[],"session_key":"","country_code":0,"app_id":1583,"is_employee":false,"external_employee_platform":""},"message":"success"}

Resources