Làm sao để lấy được CSRF TOKEN của DNH

Wow, csrf bung ra ầm ầm :+1: nhưng mà không dùng được ạ :disappointed_relieved: hình như csrf nó phải dựa vào thông tin của user (hoặc ít nhất là có liên quan đến con số dạng 1434510080908 kia)

Vì lúc em thử login tài khoản vào firefox xong lấy cái token lấy từ trong network monitor cho vào python thì login được , xong khi em logout ở firefox ra thì cái token đó mất tác dụng trên python luôn :disappointed_relieved:

Em xem source html của trang chủ thì thấy cái này có vẻ liên quan (đều là 1434):

Mình dùng 2 requests -> lấy token -> post login thấy bình thường. Bạn thử lại như mình thử xem:

Bước 1 lấy CRFS TOKEN: 1434510080908 -> timestamp dạng milliseconds nhé.

[URL] http://daynhauhoc.com/session/csrf?_=1434510080908
[METHOD] GET
[HEADER]
Content-Type:application/json
X-Requested-With:XMLHttpRequest
[RESPONSE ]  nhận được 
{
    "csrf": "StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8="
}

Bước 2 Login

[URL] http://daynhauhoc.com/session
[METHOD] POST
[REQUEST HEADER]
X-Requested-With:XMLHttpRequest
X-CSRF-Token:StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8=
[REQUEST DATA] (form-data)
login=username|email
password=password

Lưu ý là bước 2 là submit form bình thường, nên phải bỏ content type là json đi nhé.

P/S: Hy vọng không ai dùng cách này để phá hoại forum :smiley:

2 Likes

Thế là số này 1434510080908 lấy từ giờ của máy client đổi ra milisecond hay là giờ của máy chủ ạ :smile: em gà web lắm :blush: :

@thangngoc89 hình như mình cần một cái API Key để login đúng không?

2 Likes

Em đọc bên discourse thấy hình như muốn dùng api thì phải “kinh động” đến admin để tạo api_key :smile: nên em mới phải làm kiểu này, nếu dùng được api thì có sẵn thư viện pydiscourse luôn :smile:

1 Like

discourse có cho phép admin tạo API Key đó anh. Nếu anh cung cấp thì bạn ấy thoải mái hơn. :smiley: nhưng cũng hơi nguy hiểm. Nếu discourse cho phép sử dụng chuẩn OAuth để mọi người viết app thì hay quá.

2 Likes

Alô alô chim sẻ gọi đại bàng, giúp em nốt đoạn timestamp phát :smile: em không biết lấy số đấy ở đâu :blush:

Mình không chắc, nhưng mình test trên DNH thì đổi timestamp ra thì khớp với thời gian trên máy mình, phút,giây luôn.
Nên bạn cứ thử giờ của client luôn xem. Chú ý request header cho đúng thôi. Thành công thì giữ cookie lại.

1 Like

API Key chỉ sử dụng các thao tác như tạo, xóa, close, thay đổi topics, categories, users và truy cập thông tin Users, cũng như thông báo thiết lập hệ thống. Nó chưa cho phép OAuth. Shared API key rất nguy hiểm :smiley: dễ dàng thay đổi hệ thống và quản trị.

P/s: @ltd em đang xây dựng mô hình chát chém gió cho DNH mà ko cần đăng ký mới, lấy thông tin thành viên từ DNH Forum thôi :wink:

3 Likes

2 anh có bài tut/video/ebook… nào hay nói về vụ dùng get/post để đăng nhập, csrf với timestamp không, cho em xin để nghiên cứu với, tình hình là cứ làm mò mẫm thế này không ổn :smile: (tiếng việt thì càng tốt, không cần quá sâu, chỉ cần cơ bản thôi)

2 Likes

Anh cũng đang nghiên cứu cái này :smiley:

2 Likes
$.ajax({
  url: 'http://daynhauhoc.com/session/csrf',
  type: 'get',
  dataType: 'json',
  cache: false,
  success: function (response) {
    alert(response.csrf)
  }
});

Cái số bác hỏi, get json nó tự sinh ra hay sao ấy, em dùng hay gặp nó mà cũng chả biết ở đâu ra :laughing:

3 Likes

Em tạo được cái số đấy rồi nhưng đưa vào python thì chưa được, còn chạy bằng add-on firefox httprequester thì ok rồi :smile:

Em thấy là toàn bộ quá trình get/post đều không thấy server response cái số đó => số đó được tạo ra trên client => số đó chính là timestamp miliseconds của client => có thể lấy giờ của client để tạo ra số đó :smile:

1 Like

1 là cần API key
2 là cần csrf token

Gửi request cho Discourse team đi bạn

2 Likes

Em đang định đi theo hướng này, nhưng mà không rõ là với điều kiện nào thì csrf token được chấp nhận, em toàn bị BAD CSRF

1 Like

bạn dùng python sao không thì hỏi bác @ltd về cách gửi request trong python

1 Like

Em đang mò :smile: lúc nữa không được chắc phải đăng bài hỏi anh em thôi :smile:

Em dùng cái thư viện requests của python để làm, nhưng do em không hiểu về nguyên lý get/post với mấy cái liên quan như session, cookies, … nên là khả năng gửi request thiếu thành phần gì đó :smile: đang nghi ngờ chỗ cookies hoặc session, từ đầu đến giờ em chưa động đến nó. (hình như DNH dựa vào session_id/cookies và timestamp để tạo token)

Ầu yeah!!!, lần đầu tiên đăng nhập thành công trên python, muốn khóc quá :cry: :joy: :smile:

c:\>python a.py


/session/csrf.json?_=1434560923287
http://daynhauhoc.com/session/csrf.json
1434560923287
FA2rK3Zv2PzJSMLCDhJBUBNnFFKPAZKZ41MelCTs9Q8=
{"user_badges":[{"id":5011,"granted_at":"2015-05-17T00:46:54.577Z","badge_id":4,
"user_id":2046,"granted_by_id":-1},{"id":4553,"granted_at":"2015-04-29T04:01:01.
360Z","badge_id":3,"user_id":2046,"granted_by_id":-1},{"id":5712,"granted_at":"2
015-05-26T02:06:19.722Z","post_id":34636,"post_number":3,"badge_id":6,"user_id":
2046,"granted_by_id":-1,"topic_id":7648}],"badges":[{"id":4,"name":"Leader","des
cription":null,"grant_count":14,"allow_title":true,"multiple_grant":false,"icon"
:"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"sy
stem":true,"badge_type_id":1},{"id":3,"name":"Regular","description":null,"grant
_count":27,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":nu
ll,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_typ
e_id":2},{"id":6,"name":"Nice Post","description":null,"grant_count":24,"allow_t
itle":false,"multiple_grant":true,"icon":"fa-certificate","image":null,"listable
":true,"enabled":true,"badge_grouping_id":3,"system":true,"badge_type_id":3}],"b
adge_types":[{"id":1,"name":"Gold","sort_order":9},{"id":2,"name":"Silver","sort
_order":8},{"id":3,"name":"Bronze","sort_order":7}],"users":[{"id":2046,"usernam
e":"thanhmssl10","uploaded_avatar_id":2345,"avatar_template":"/user_avatar/daynh
auhoc.com/thanhmssl10/{size}/2345_1.png"},{"id":-1,"username":"system","uploaded
_avatar_id":1,"avatar_template":"/user_avatar/daynhauhoc.com/system/{size}/1_1.p
ng"}],"topics":[{"id":7648,"title":"[Tß╗öNG Hß╗óP] - C├íc k├¬nh Youtube hay nhß║
Ñt m├á bß║ín n├¬n th─âm ├¡t nhß║Ñt mß╗Öt lß║ºn trong ─æß╗¥i","fancy_title":"[Tß╗
öNG Hß╗óP] - C├íc k├¬nh Youtube hay nhß║Ñt m├á bß║ín n├¬n th─âm ├¡t nhß║Ñt mß╗Öt
 lần trong đời","slug":"tong-hop-cac-kenh-youtube-hay-nhat-ma-ban-nen-tham-
it-nhat-mot-lan-trong-doi","posts_count":11}],"user":{"id":2046,"username":"than
hmssl10","uploaded_avatar_id":2345,"avatar_template":"/user_avatar/daynhauhoc.co
m/thanhmssl10/{size}/2345_1.png","name":"Thành Phạm","last_posted_at":"2015-0
6-17T15:59:26.407Z","last_seen_at":"2015-06-17T17:04:58.030Z","bio_raw":"Email:
[email protected]\n[Z├¡t h├║p][2]\nSkype:   thanhmssl10\n\n:blush:  :sunglas
ses: :smile:\n\n\n  [1]: http://facebook.com/thanhconsl\n  [2]: http://github.co
m/thanhmssl10","bio_cooked":"<p>Email: [email protected]<br><a href=\"http:/
/github.com/thanhmssl10\">Zít húp</a><br>Skype:   thanhmssl10</p>\n\n<p><img s
rc=\"/images/emoji/emoji_one/blush.png?v=0\" title=\":blush:\" class=\"emoji\" a
lt=\"blush\">  <img src=\"/images/emoji/emoji_one/sunglasses.png?v=0\" title=\":
sunglasses:\" class=\"emoji\" alt=\"sunglasses\"> <img src=\"/images/emoji/emoji
_one/smile.png?v=0\" title=\":smile:\" class=\"emoji\" alt=\"smile\"></p>","crea
ted_at":"2015-03-11T15:02:12.934Z","website":"http://","profile_background":"/up
loads/default/3273/406d7176adedfc2e.png","card_background":"/uploads/default/327
3/406d7176adedfc2e.png","can_edit":false,"can_edit_username":false,"can_edit_ema
il":false,"can_edit_name":false,"stats":[{"action_type":4,"count":78,"id":null},
{"action_type":5,"count":761,"id":null},{"action_type":6,"count":412,"id":null},
{"action_type":1,"count":1625,"id":null},{"action_type":2,"count":897,"id":null}
,{"action_type":7,"count":33,"id":null},{"action_type":9,"count":43,"id":null},{
"action_type":11,"count":35,"id":null}],"can_send_private_messages":false,"can_s
end_private_message_to_user":false,"bio_excerpt":"Email: [email protected]<b
r><a href=\"http://github.com/thanhmssl10\">Zít húp</a><br>Skype:   thanhmssl1
0<br>\n\n[blush]  [sunglasses] [smile]<br>","trust_level":4,"moderator":false,"a
dmin":false,"title":null,"badge_count":15,"custom_fields":{},"pending_count":0,"
invited_by":null,"custom_groups":[],"featured_user_badge_ids":[5011,4553,5712],"
card_badge":null}}

Đúng như dự đoán, “thủ phạm” là thằng cookies :smile: , bổ sung thêm vào câu trả lời của bác @mrphu3074

Bước 1: lấy CRFS TOKEN: 1434510080908 -> timestamp dạng milliseconds nhé. (lấy từ time của client)

[URL] http://daynhauhoc.com/session/csrf?_=1434510080908
[METHOD] GET
[HEADER]
Content-Type:application/json
X-Requested-With:XMLHttpRequest
[RESPONSE ]  nhận được 

{
    "csrf": "StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8="
}

Nhận cookie từ server response về

Bước 2: Login

[URL] http://daynhauhoc.com/session
[METHOD] POST
[REQUEST HEADER]
X-Requested-With:XMLHttpRequest
X-CSRF-Token:StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8=
[REQUEST DATA] (form-data)
login=username|email
password=password

Gửi lại cookie về cho server
4 Likes

Vì nguyên tắc khi làm login kiểu thủ công này là phải giữ lại cookie để gửi request.

mình có comment đấy thôi.

Chúc mừng thành công rồi nhá. Tự mò ra lúc nào cũng thấy hưng phấn hơn :smiley:

1 Like

Quá hưng phấn luôn ạ :triumph: :triumph: :triumph:

Nhưng mà bác chốt câu này bên trên có phải ngon không :cry: làm em mò tới mò lui :smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?