banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận thâm nhập Thảo luận: cross site request forgery (CSRF hay XSRF)  XML
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 13/02/2007 00:11:41 (+0700) | #31 | 41347
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
hic gamma95 à, CSRF là lợi dụng truy vấn GET và Session của Moderator để truyền lệnh phá dữ liệu ( mượn tay giết gà đó mà ), chứ nó có phải là XSS đâu mà lấy cắp cái session về cất tủ smilie . Việc lấy cái Session thật ra là theo ý của anh conmale là bypass cái vụ check session mà chúng ta đã đề cập từ đầu bài thảo luận.
Tôi đề cập tới hidden field ở đây là nó có thể chứa chuỗi hash nên tôi tìm cách lấy nó theo câu hỏi "khó" của anh conmale mừ smilie)
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 13/02/2007 03:06:37 (+0700) | #32 | 41371
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa">
Offline
[Profile] [PM] [ICQ]
hic gamma95 à, CSRF là lợi dụng truy vấn GET và Session của Moderator để truyền lệnh phá dữ liệu ( mượn tay giết gà đó mà ), chứ nó có phải là XSS đâu mà lấy cắp cái session về cất tủ . Việc lấy cái Session thật ra là theo ý của anh conmale là bypass cái vụ check session mà chúng ta đã đề cập từ đầu bài thảo luận.
Tôi đề cập tới hidden field ở đây là nó có thể chứa chuỗi hash nên tôi tìm cách lấy nó theo câu hỏi "khó" của anh conmale mừ 

Thì tui hỏi bạn là lấy là lấy như thế nào mà ?? đâu cần bạn định nghĩa lại CSRF là cái gì đâu ?? :wink:
ps: bạn demo 1 VD theo cách của bạn đi..và đọc kĩ lại câu hỏi
Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 28/02/2007 03:15:24 (+0700) | #33 | 43505
[Avatar]
vtv_4
Elite Member

[Minus]    0    [Plus]
Joined: 12/04/2002 19:31:12
Messages: 20
Offline
[Profile] [PM]
Vấn đề khắc phục thì cứ phải là confirm bằng server scripts thôi anh nhỉ.

Nghĩ sâu hơn thì lỗi này vô cùng nguy hiểm, vì không chỉ xóa bài mà hacker có thể tự nâng quyền và làm nhiều trò khác nữa smilie
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 04/03/2007 12:45:28 (+0700) | #34 | 44473
thangdiablo
HVA Friend

Joined: 11/05/2003 17:31:58
Messages: 734
Offline
[Profile] [PM] [WWW]
Tự nhiên hôm nay đọc được vụ này trên Vnexpress
http://vnexpress.net/Vietnam/Vi-tinh/Hacker-Virus/2007/03/3B9F3B21/
Hãy sống có Tuệ Giác.
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 04/03/2007 13:13:07 (+0700) | #35 | 44483
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Code:
http://blog.360.yahoo.com/blog-d9EBpU45eqUjn8tRROYi4xpbcA--?d=NURg2a1gKg--


Tớ thử rồi thangdiablo à, chơi đc là cả vấn đề

Mỗi bài post nó ko nhận diện bằng số id mà nó dùng một cái hash

Code:
?d=NURg2a1gKg--


và mỗi blog cũng có một hash riêng để nhận diện nó duy nhất


Code:
blog-d9EBpU45eqUjn8tRROYi4xpbcA--


cái hash thứ 2 lấy đc dễ dàng do nó là link sẽ hiện ra khi mọi người xem blog
Còn cái thứ 1 ko tìm ra được dễ đâu à nha ( ít ra tới thời điểm này )
Đối với người ko có chủ quyền với trang blog (chủ nhân blog) thì ko dễ gì lấy đc cái link delete như tui lấy ( tui lôi trong blog thử nghiệm của tui ).

Vậy nên có thể kết luận là người báo vul này có vẻ hơi vội vã vì nó thật sự khó khai thác ( theo ý kiến riêng của tui ).

Nên chưa cần lo là bị del hết bài trên blog smilie) phẻ.
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 04/03/2007 16:52:55 (+0700) | #36 | 44491
[Avatar]
vtv_4
Elite Member

[Minus]    0    [Plus]
Joined: 12/04/2002 19:31:12
Messages: 20
Offline
[Profile] [PM]
Tôi đã kiểm tra rất kỹ trước khi công bố vul này.

Thứ nhất,

Y360 bị lỗi CSRF dẫn đến việc có thể xóa comment bằng đường dẫn sau:

http://blog.360.yahoo.com/blog-thAecTcofrMD7CKmJsgcIoMq?p=9&dc=10

Đoạn bôi đỏ thay đổi khác nhau với từng blog, nhưng có thể dễ dàng lấy được bằng cách nhấn chuột vào một entry bất kỳ. Đồng thời khi đó cũng lấy được tham số p=... (ID của entry)

Tham số dc=... (ID của comment) có thể lấy được dựa trên cách... suy đoán gần đúng như sau: ID của comment sẽ bằng số thứ tự của comment trong entry + ID của entry.

Tức là, giả sử bạn có một entry ID = 10 thì comment đầu tiên (bóc tem) entry đó sẽ là 11, comment tiếp theo là 12.... ect

Tuy nhiên, con số ở đây chỉ là gần đúng bởi vì, nếu có người comment lệch entry (đang có người comment entry mới nhất lại có người comment vào entry cũ hơn) thì số thứ tự của các comment tiếp theo sẽ bị lệch đi.

Thứ hai,

Y360 không chỉ bị lỗi trong phần xóa comment mà còn bị cả ở trong phần xóa comment thông qua giao diện recent comment (trang này được liệt kê khi bạn bấm vào My Blog và bấm vào Blog Comments) như sau:

http://blog.360.yahoo.com/blog/recent_comments.html?d=10

Và ở link này thì việc xóa trở nên dễ dàng hơn rất nhiều.

Mặt khác, qua phân tích ở phần trên, chúng ta cũng dễ dàng thấy rằng Y360 coi entry và comment đều là các bài post (tăng ID) nên đường link xóa recent comment ở trên có thể xóa cả entry lẫn comment. Tức là bạn chỉ cần biết được ID của entry hoặc comment mới nhất, sau đó chạy vòng lặp downto về 0 là... xóa toàn blog.

Trước khi phát hiện ra lỗi ở Recent Comment tôi có thử xem link xóa entry thì đúng như bạn phân tích, nó đã có chuỗi hash để anti CSRF. Tương tự, link xóa quick comment ngoài top page cũng có chuỗi hash này. Nhưng Recent Comment thì KHÔNG!

Có lẽ khi phóng viên "hỏi lại" bên BKIS để confirm thì bên BKIS chỉ nghĩ tới việc attack qua link delete entry nên đã phát biểu khúc cuối sai lệch hoàn toàn vấn đề (BKIS đã nói: Tuy nhiên lỗi này không nguy hiểm vì phải chuẩn bị mỗi blog một link khác nhau etc...)

Câu nói đó đúng khi xem xét ở phần thứ nhất, nhưng nếu sử dụng cách thứ 2 thì chỉ cần 1 link "dùng chung" cho tất cả các blog của những blogger khác nhau.

P/S: Thực ra, Y360 cũng đã có một bước anti CSRF ở link xóa comment và recent comment bằng việc check IP khi login và IP khi ra lệnh xóa. Có lẽ vì lý do đó nên khi tôi gửi msg thông báo lỗi cho Y360 Team chẳng thấy họ phản ứng gì. Có điều, cách anti như vậy không có tác dụng tốt lắm với blogger Việt Nam, vì IP là giống nhau do đi qua proxy. Điều đó cũng có nghĩa là nếu bạn sử dụng ADSL của FPT thì không thể attack được vào blog của người đang xài ADSL VDC hay Viettel.
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 04/03/2007 22:25:25 (+0700) | #37 | 44497
ndahuy
Member

[Minus]    0    [Plus]
Joined: 12/01/2006 12:08:28
Messages: 7
Location: TAP .Corp
Offline
[Profile] [PM] [WWW] [Yahoo!]
Cái này có thể gọi là a.e đang brainstorming.
Một vài thứ chưa hiểu rõ lắm nên phải tìm hiểu kĩ rồi hỏi sau
Đùng 1 cái mà hỏi thì bác "châm" chẳng bao giờ trả lời ... :0
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 04/03/2007 23:50:37 (+0700) | #38 | 44507
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]

vtv_4 wrote:
Tôi đã kiểm tra rất kỹ trước khi công bố vul này.

Thứ nhất,

Y360 bị lỗi CSRF dẫn đến việc có thể xóa comment bằng đường dẫn sau:

http://blog.360.yahoo.com/blog-thAecTcofrMD7CKmJsgcIoMq?p=9&dc=10

Đoạn bôi đỏ thay đổi khác nhau với từng blog, nhưng có thể dễ dàng lấy được bằng cách nhấn chuột vào một entry bất kỳ. Đồng thời khi đó cũng lấy được tham số p=... (ID của entry)

Tham số dc=... (ID của comment) có thể lấy được dựa trên cách... suy đoán gần đúng như sau: ID của comment sẽ bằng số thứ tự của comment trong entry + ID của entry.

Tức là, giả sử bạn có một entry ID = 10 thì comment đầu tiên (bóc tem) entry đó sẽ là 11, comment tiếp theo là 12.... ect

Tuy nhiên, con số ở đây chỉ là gần đúng bởi vì, nếu có người comment lệch entry (đang có người comment entry mới nhất lại có người comment vào entry cũ hơn) thì số thứ tự của các comment tiếp theo sẽ bị lệch đi.

Thứ hai,

Y360 không chỉ bị lỗi trong phần xóa comment mà còn bị cả ở trong phần xóa comment thông qua giao diện recent comment (trang này được liệt kê khi bạn bấm vào My Blog và bấm vào Blog Comments) như sau:

http://blog.360.yahoo.com/blog/recent_comments.html?d=10

Và ở link này thì việc xóa trở nên dễ dàng hơn rất nhiều.

Mặt khác, qua phân tích ở phần trên, chúng ta cũng dễ dàng thấy rằng Y360 coi entry và comment đều là các bài post (tăng ID) nên đường link xóa recent comment ở trên có thể xóa cả entry lẫn comment. Tức là bạn chỉ cần biết được ID của entry hoặc comment mới nhất, sau đó chạy vòng lặp downto về 0 là... xóa toàn blog.

Trước khi phát hiện ra lỗi ở Recent Comment tôi có thử xem link xóa entry thì đúng như bạn phân tích, nó đã có chuỗi hash để anti CSRF. Tương tự, link xóa quick comment ngoài top page cũng có chuỗi hash này. Nhưng Recent Comment thì KHÔNG!

Có lẽ khi phóng viên "hỏi lại" bên BKIS để confirm thì bên BKIS chỉ nghĩ tới việc attack qua link delete entry nên đã phát biểu khúc cuối sai lệch hoàn toàn vấn đề (BKIS đã nói: Tuy nhiên lỗi này không nguy hiểm vì phải chuẩn bị mỗi blog một link khác nhau etc...)

Câu nói đó đúng khi xem xét ở phần thứ nhất, nhưng nếu sử dụng cách thứ 2 thì chỉ cần 1 link "dùng chung" cho tất cả các blog của những blogger khác nhau.

P/S: Thực ra, Y360 cũng đã có một bước anti CSRF ở link xóa comment và recent comment bằng việc check IP khi login và IP khi ra lệnh xóa. Có lẽ vì lý do đó nên khi tôi gửi msg thông báo lỗi cho Y360 Team chẳng thấy họ phản ứng gì. Có điều, cách anti như vậy không có tác dụng tốt lắm với blogger Việt Nam, vì IP là giống nhau do đi qua proxy. Điều đó cũng có nghĩa là nếu bạn sử dụng ADSL của FPT thì không thể attack được vào blog của người đang xài ADSL VDC hay Viettel. 


Đúng như bạn phân tích, việc CSRF ở điểm yếu của yahoo 360 chỉ có thể thực hiện với việc delete comment mà thôi ( phần phân tích của tôi xoáy vào Entry ) vì comment được thể hiện bằng id ( rất dễ suy luận hoặc lấy theo cách của bạn phân tích ), trong khi đó phần quan trọng nhất của nội dung Blog là Entry của chủ nhân blog thì khó có thể bị khai thác do yahoo đã dùng phương pháp "hash" ( giống như cách chúng ta đã bàn luận ở đầu topic ).

Đây là link sẽ chạy lệnh Delete

http://blog.360.yahoo.com/blog/delete.html?msgid=maYlD49p 


Tôi đã đánh dấu phần quan trọng trong link này, bạn thấy đó đoạn màu cam chính là id của entry ( một chuỗi hash )

Vậy nên việc kết luận là vul này nghiệm trọng là hơi quá lời, theo tôi nó không quá nguy hiểm vì các comment cũng chỉ là các đoạn hội thoại nhỏ cho ý kiến về Entry của chủ nhân Blog.

Còn bạn muốn tránh việc bị khai thác này thì cũng khá dễ chỉ cần bạn cẩn thận logout sau khi đã post Entry của mình thì kẻ tấn công không còn phương cách nào thực thi link CSRF nữa và blog của bạn được an toàn ( chú ý: Tuyệt đối không nên vừa Post Entry vừa truy cập lung tung )

Tái bút: vì dùng blog chưa lâu (chỉ mó máy quậy chơi) nên tôi e rằng các nhận định của tôi cũng chỉ là cảm quan cá nhân nên có gì không đúng mong bạn bỏ quá cho.
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 00:23:45 (+0700) | #39 | 44514
stupidmistakez
Member

[Minus]    0    [Plus]
Joined: 10/08/2006 18:09:15
Messages: 11
Offline
[Profile] [PM]
hihi, newbie, mình biết 1 tí về web development nên góp ý tí xíu về mấy vấn đề ngoài lề smilie

2. Đối với kiểu tạo request từ các thành phần ngay trong diễn đàn, mà cụ thể là lợi dùng việc chèn ảnh thì có thể thắt chặt việc parse thẻ [img], chỉ cho phép URL thẳng đến các file jpg hay gif thôi  

--> cái này thì cũng có thể dễ dàng rewrite url lại, giống như HVA rewrite đuôi thành .html lại í, mình dùng cái link có đuôi là gif của mình nhưng cái link đó để chạy scrip vẫn được mà smilie. Với lại thắt chặt vậy có vẻ không thực sự hay, phải làm cho người dùng sử dụng thoải mái thì càng tốt, thử hỏi vào một trang giới hạn lung tung, và một trang kô giới hạn gì nhiều thì user thích cái nào hơn (đứng trên phương diện development smilie

Dẫu biết là attaker vẫn có thể trick user send request POST nhưng em nghĩ bước đầu tiên cần phải làm vẫn là hạn chế tối đa các request GET(không sử dụng càng tốt)  

-> mình thấy google hay yahoo ... nói chung mấy trang lớn lớn, người ta lại chuộng dùng GET, chắc tại vì vậy thì sẽ tiện cho người dùng hơn rất nhiều smilie và cái này có phải là cực kỳ quan trọng kô? smilie. Cho dù làm gì đi nữa, làm sao người sử dụng sử dụng càng dể dàng và đơn giản càng tốt, mình nghĩ vậy smilie
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 00:24:29 (+0700) | #40 | 44515
[Avatar]
vtv_4
Elite Member

[Minus]    0    [Plus]
Joined: 12/04/2002 19:31:12
Messages: 20
Offline
[Profile] [PM]
Có vẻ như hackernohat chưa đọc kỹ bài của tôi. Tôi không delete blog bằng link của bạn mà delete bằng link http://blog.360.yahoo.com/blog/recent_comments.html?d=...
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 05:37:26 (+0700) | #41 | 44570
mabubeo90
Member

[Minus]    0    [Plus]
Joined: 02/08/2006 10:46:49
Messages: 11
Offline
[Profile] [PM]
Trong IPB thì để del 1 bài post thì ta dùng link sau :

Code:
http://site.com/forum/index.php?act=Mod&CODE=04&f=a&t=b&p=c&st=0&auth_key=1_day_so


Trong đó a = forumid
b = topicid
c = postid

Nhũng cái này có thể dễ dàng tìm thấy , tuy nhiên làm sao để biết đc auth_key của admin hoặc mod
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 13:39:38 (+0700) | #42 | 44713
stupidmistakez
Member

[Minus]    0    [Plus]
Joined: 10/08/2006 18:09:15
Messages: 11
Offline
[Profile] [PM]

vtv_4 wrote:
Có vẻ như hackernohat chưa đọc kỹ bài của tôi. Tôi không delete blog bằng link của bạn mà delete bằng link http://blog.360.yahoo.com/blog/recent_comments.html?d=...  


Vấn đề còn lại là làm sao để lừa yahoo không bị chống flood smilie. Nếu mà dùng tag <img thì chỉ xóa được <100 entry smilie, còn dụ victim click link vào trang của mình thì có thể cho nó chạy iframe với mấy trang proxy nữa chắc cũng ổn ;smilie , he he, em bị xóa gần 100 cái đang tức ói máu đây nhưng chỉ tội ngu ráng chịu smilie
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 14:32:54 (+0700) | #43 | 44725
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
Phát hiện của vtv_4 thật có ích. Tôi nghĩ nó sẽ làm cho các web-developer ở VN chú ý hơn đến lỗi này.

-m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 21:04:24 (+0700) | #44 | 44749
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

mabubeo90 wrote:
Trong IPB thì để del 1 bài post thì ta dùng link sau :

Code:
http://site.com/forum/index.php?act=Mod&CODE=04&f=a&t=b&p=c&st=0&auth_key=1_day_so


Trong đó a = forumid
b = topicid
c = postid

Nhũng cái này có thể dễ dàng tìm thấy , tuy nhiên làm sao để biết đc auth_key của admin hoặc mod 


Việc dùng GET và pass những giá trị "nhạy cảm" như auth_key vào URI là việc cực kỳ nguy hiểm và nên tránh bằng mọi giá. auth_key chỉ nên được tạo ra một lần khi xác thực tài khoản và lưu trên memory của trình duyệt (và gắn liền + có giá trị với sessionid nào đó). Việc đưa những thông tin nhạy cảm này vào cookie và lưu trên máy của client cũng là việc nên tránh xa.

Nếu dùng POST, các giá trị nhạy cảm được đưa vào hidden field của FORM và việc này cũng nên tránh bởi vì nếu bị xss, các giá trị của hidden field vẫn có thể bị đọc được. Bởi thế, những thông tin thuộc về chủ quyền của user (như mods, admins.... ) không nên đưa vào GET hoặc POST mỗi lần một request xảy mà gắn liền chúng với một sesion có giá trị và điều tối quan trọng là sessionid phải do web application server cung cấp và xác thực. Web application không bao giờ tiếp nhận một sessionid đã cũ (và được chèn vào bất cứ lúc nào trong request).
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re:Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 22:56:28 (+0700) | #45 | 44772
peo
Member

[Minus]    0    [Plus]
Joined: 05/03/2007 10:22:58
Messages: 1
Offline
[Profile] [PM]

conmale wrote:

nora wrote:


Theo mình nghĩ ban quản trị dường như đã fix lỗi này, vì như vậy conmale mới công bố lên đây.
vậy câu hỏi:
Cách của ban quản trị là gì?
 

Cách của BQT có 2 phần:
- phase 1: ứng dụng random token. Token này dựa trên giá trị valid session ID của thành viên có chủ quyền là moderator + một số thông tin cá biệt khác. Ví dụ, IP của session, user-agent của session và vị trí (đang ở trên diễn đàn).... Phase 1 đã ứng dụng.
 


Cho em hỏi,
1)cái token này sẽ nằm trong đoạn URL để delete post (nói chung là mọi URL nhạy cảm), đúng ko? Vậy nếu như attacker dùng XSS để đọc cái token này, rồi dùng token để construct cái URL cho XSRF thì vẫn có khả năng thành công đúng ko? Vấn đề là HVA ko bị XSS nên tạm thời chưa sao?
2)Có phải vì token này không thể thay thế cho sessionid nên có thể đặt nó vào URL mà không sợ vi phạm cái nguyên tắc bảo mật đã nói ở trên?
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 23:08:48 (+0700) | #46 | 44775
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
@vtv4
P/S: Thực ra, Y360 cũng đã có một bước anti CSRF ở link xóa comment và recent comment bằng việc check IP khi login và IP khi ra lệnh xóa. Có lẽ vì lý do đó nên khi tôi gửi msg thông báo lỗi cho Y360 Team chẳng thấy họ phản ứng gì. Có điều, cách anti như vậy không có tác dụng tốt lắm với blogger Việt Nam, vì IP là giống nhau do đi qua proxy. Điều đó cũng có nghĩa là nếu bạn sử dụng ADSL của FPT thì không thể attack được vào blog của người đang xài ADSL VDC hay Viettel. 

ko hiểu khúc này ?? đã lợi dụng CSRF để chém mướn thì IP trước sau hoàn toàn là IP của victim chứ nhỉ ?? nên IP trước sau gì cũng đâu có thay đổi đâu ?? smilie
Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Question]   Re:Thảo luận: cross site request forgery (CSRF hay XSRF) 05/03/2007 23:11:37 (+0700) | #47 | 44776
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

peo wrote:

conmale wrote:

nora wrote:


Theo mình nghĩ ban quản trị dường như đã fix lỗi này, vì như vậy conmale mới công bố lên đây.
vậy câu hỏi:
Cách của ban quản trị là gì?
 

Cách của BQT có 2 phần:
- phase 1: ứng dụng random token. Token này dựa trên giá trị valid session ID của thành viên có chủ quyền là moderator + một số thông tin cá biệt khác. Ví dụ, IP của session, user-agent của session và vị trí (đang ở trên diễn đàn).... Phase 1 đã ứng dụng.
 


Cho em hỏi,
1)cái token này sẽ nằm trong đoạn URL để delete post (nói chung là mọi URL nhạy cảm), đúng ko? Vậy nếu như attacker dùng XSS để đọc cái token này, rồi dùng token để construct cái URL cho XSRF thì vẫn có khả năng thành công đúng ko? Vấn đề là HVA ko bị XSS nên tạm thời chưa sao?
 

Cái token này là hash của những thành phần khác nhau và nó không phải là auth_key. Dùng nó "khơi khơi" không có tác dụng gì hết vì token này phải được so sánh với giá trị ngay thời điểm một request được xảy ra. Token này cũng có thể thay đổi liên tục tùy theo request được ai thực hiện và thực hiện ở đâu nữa. Ví dụ, token này chỉ dùng cho /abc/def.php?t=123&user=some_admin chẳng hạn, nếu token đó bị chôm và lúc ấy some_admin không ở trong t=123 thì nó hoàn toàn vô tác dụng. Đó là chưa kể đến khía cạnh token thay đổi khi sessionid thay đổi nữa. Ví dụ token đó bị chôm và admin hiện đang trong t=123 nhưng cái token đó được tạo ra khi admin login lần trước thì nó cũng không thể dùng để làm gì cả.

peo wrote:

2)Có phải vì token này không thể thay thế cho sessionid nên có thể đặt nó vào URL mà không sợ vi phạm cái nguyên tắc bảo mật đã nói ở trên?
 

sessionid là sessionid, token là token. token là "sản phẩm" của nhiều yếu tố cộng lại và sessionid chỉ là 1 trong các yếu tố.

Thân mến.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 00:02:22 (+0700) | #48 | 45204
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Có vài người "hỏi riêng" tôi cách tạo token trong trường hợp trên và ứng dụng như thế nào, sẵn topic này còn... nóng, tôi xin phép trả lời chung luôn.

Tổng quát mà nói, khi nhấn trên một đường dẫn, trình duyệt sẽ gởi request đến web server và request này có thể là GET hoặc POST tùy ứng dụng.

- với GET, các biến sẽ được đưa đến server xuyên qua "query string" (những gì nằm sau ? là query string, những gì nằm sau = là giá trị biến). Ví dụ:
/hvaonline/moderation.php?action=del&by=conmale&post=123&token=7bbde36b2fg6d521b654ef2652593ab3

- với POST, các biến sẽ được đưa đến server xuyên qua các "hidden fields" trên HTML FORM. Ví dụ:

<input type="hidden" name="action" value="del" />
<input type="hidden" name="module" value="moderation" />
<input type="hidden" name="by" value="conmale" />
<input type="hidden" name="post" value="123" />
<input type="hidden" name="token" value="7bbde36b2fg6d521b654ef2652593ab3" />

Giá trị của token ở đây là giá trị hash của một số dữ kiện nào đó tùy chọn và nó được gởi ngược từ server đến trình duyệt khi trình duyệt vào trang có chứa link để thực thi hành động del. Ví dụ, user đi vào trang moderate.php chẳng hạn, trình duyệt sẽ nhận được được chuỗi token. Chuỗi token này sẽ được dùng để xác thực quyền "del" khi nhấn nút "delete" một cái gì đó.

Khi nhấn nút "delete", token trên được gởi đến server, cơ chế kiểm soát (một class, một function.. nào đó) sẽ lấy giá trị này đồng thời thực thi một bước tạo hash cũng dựa trên một số dữ kiện nào đó như trước. Sau đó nó so sánh 2 giá trị trước và sau xem chúng có trùng nhau hay không thì mới thực thi hành động cần thực thi.

Riêng việc xây dựng như thế nào thì tùy vào tình huống, cấu trúc của web application và độ sáng tạo smilie) . Tuy nhiên, hash của token nên có 2 điều kiện quan trọng:
- nó dùng dữ kiện thuộc về người có thẩm quyền thực thi chức năng. Ví dụ, tên người dùng, sessionid của người dùng, IP của người dùng....

- nó phải thay đổi (dynamic) dựa trên những điều kiện liên quan đến việc thực thi chức năng. Ví dụ: người dùng ở trên mỗi URI thì có giá trị khác, người dùng bấm trên mỗi đường dẫn sẽ tạo ra một random value nào đó và random value này được đưa vào chuỗi thông tin để tạo hash...

Lý do? Giả sử ai đó chôm được cái token của một moderator và xác định được moderator này đang ở đúng vị trí nào đó trên forum, "ai đó" có thể dùng nó để tạo 1 trang web nào đó và đồng thời chat + dụ moderator này xem. Lúc moderator này đồng ý vào trang web "độc địa" ấy thì random value đã thay đổi và bởi thế cái token bị chôm và bị dùng kia cũng không còn giá trị nữa --> thực thi việc "mượn tay chém" không được nữa smilie).

Tất nhiên là token / hash / so sánh ... đều xảy ra trên memory mà không hề đụng đến database bởi vì chúng cần thực hiện nhanh chóng và an toàn.

Thân mến.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 04:27:45 (+0700) | #49 | 45241
[Avatar]
namviet
Member

[Minus]    0    [Plus]
Joined: 20/10/2003 11:31:31
Messages: 20
Location: miền cát trắng
Offline
[Profile] [PM] [WWW]

comale wrote:

Việc dùng GET và pass những giá trị "nhạy cảm" như auth_key vào URI là việc cực kỳ nguy hiểm và nên tránh bằng mọi giá. auth_key chỉ nên được tạo ra một lần khi xác thực tài khoản và lưu trên memory của trình duyệt (và gắn liền + có giá trị với sessionid nào đó). Việc đưa những thông tin nhạy cảm này vào cookie và lưu trên máy của client cũng là việc nên tránh xa.

Nếu dùng POST, các giá trị nhạy cảm được đưa vào hidden field của FORM và việc này cũng nên tránh bởi vì nếu bị xss, các giá trị của hidden field vẫn có thể bị đọc được. Bởi thế, những thông tin thuộc về chủ quyền của user (như mods, admins.... ) không nên đưa vào GET hoặc POST mỗi lần một request xảy mà gắn liền chúng với một sesion có giá trị và điều tối quan trọng là sessionid phải do web application server cung cấp và xác thực. Web application không bao giờ tiếp nhận một sessionid đã cũ (và được chèn vào bất cứ lúc nào trong request).
 


Anh conmale cho em hỏi: giá trị "nhạy cảm" lưu trên memory của trình duyệt là như thế nào ạ ?! em vẫn chỉ biết 1 cách lưu trên máy client là qua cookie/GET(url)/POST(form) thôi!
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 09:26:45 (+0700) | #50 | 45302
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Memory ý anh conmale nó là dùng chung cho các dạng thức mà Browser dùng để lưu các thông tin "nhạy cảm" theo cách mà bạn nói smilie
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 10:01:19 (+0700) | #51 | 45310
[Avatar]
namviet
Member

[Minus]    0    [Plus]
Joined: 20/10/2003 11:31:31
Messages: 20
Location: miền cát trắng
Offline
[Profile] [PM] [WWW]
@ sư phụ nohat: nhưng anh ấy (conmale) nói:
-"dùng GET... nên tránh bằng mọi giá"
-"cookie ... cũng là việc nên tránh xa"
-"POST ... cũng nên tránh"

Vậy thì còn dùng phương thức gì nữa để truyền tham số giữa client và server ?!
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 10:30:43 (+0700) | #52 | 45313
stupidmistakez
Member

[Minus]    0    [Plus]
Joined: 10/08/2006 18:09:15
Messages: 11
Offline
[Profile] [PM]

namviet wrote:
@ sư phụ nohat: nhưng anh ấy (conmale) nói:
-"dùng GET... nên tránh bằng mọi giá"
-"cookie ... cũng là việc nên tránh xa"
-"POST ... cũng nên tránh"

Vậy thì còn dùng phương thức gì nữa để truyền tham số giữa client và server ?! 


những thứ nhạy cảm sẽ được lưu tại session và được check bằng token mà ( session_id hash ), chứ nãy giờ bạn không theo giỏi àh?
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 10:44:50 (+0700) | #53 | 45318
[Avatar]
namviet
Member

[Minus]    0    [Plus]
Joined: 20/10/2003 11:31:31
Messages: 20
Location: miền cát trắng
Offline
[Profile] [PM] [WWW]

stupidmistakez wrote:

những thứ nhạy cảm sẽ được lưu tại session và được check bằng token mà ( session_id hash ), chứ nãy giờ bạn không theo giỏi àh?
 


Thực sự mình chưa rành về cái này , nhưng theo post của anh conmale:

conmale wrote:

- với GET, các biến sẽ được đưa đến server xuyên qua "query string" (những gì nằm sau ? là query string, những gì nằm sau = là giá trị biến). Ví dụ:
/hvaonline/moderation.php?action=del&by=conmale&post=123&token=7bbde36b2fg6d521b654ef2652593ab3

- với POST, các biến sẽ được đưa đến server xuyên qua các "hidden fields" trên HTML FORM. Ví dụ:

<input type="hidden" name="action" value="del" />
<input type="hidden" name="module" value="moderation" />
<input type="hidden" name="by" value="conmale" />
<input type="hidden" name="post" value="123" />
<input type="hidden" name="token" value="7bbde36b2fg6d521b654ef2652593ab3" />
 


Thì những thứ đó cũng chỉ là ở trong GET và POST thôi mà ?!

Có gì ngớ ngẩn xin được thông cảm và chỉ rõ smilie !
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 08/03/2007 23:16:45 (+0700) | #54 | 45387
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

namviet wrote:
@ sư phụ nohat: nhưng anh ấy (conmale) nói:
-"dùng GET... nên tránh bằng mọi giá"
-"cookie ... cũng là việc nên tránh xa"
-"POST ... cũng nên tránh"

Vậy thì còn dùng phương thức gì nữa để truyền tham số giữa client và server ?! 


Những điểm nên tránh đã nêu trong bài trước là tránh "vận chuyển" những thứ nhạy cảm như auth_key, pasword hash... Tránh chứa những thứ trên trong cookie và cookie không thuộc dạng "transient" (có nghĩa là cookie lưu trên đĩa của máy chạy trình duyệt chớ không hủy bỏ sau mỗi xuất truy cập).

Tất nhiên với giao thức HTTP, giữa client và server vẫn phải dùng những method thông thường như POST và GET để chuyển gởi thông tin. Tuy nhiên, cái khác biệt ở chỗ là những gì chuyển gởi và lưu chỉ có giá trị tạm thời hoặc không thể access từ một kẻ thứ ba.

Anh conmale cho em hỏi: giá trị "nhạy cảm" lưu trên memory của trình duyệt là như thế nào ạ ? 


Tạm thời hình dung thế này. Trên server, cứ mỗi lần một user đăng nhập, nó dành một mảng bộ nhớ để chứa trọn bộ các thông tin thuộc về user này, mỗi mảng được phân biệt bởi session id. Session id này do chính web application cung cấp và phải được xác thực mỗi khi client gởi request đến server để tránh tình trạng dùng session id không giá trị.

Web server
| session id 1 | session id 2 | session id 3| ... | session id n |

Trên máy client, giá trị session id này được lưu trong cookie (thường gặp) hoặc phương pháp URLrewrite (ứng dụng nhiều trên jsp / servlet). Nếu dùng persistent cookie (cookie lưu trong đĩa của client và có giá trị dài hạn) thì cookie phải được cập nhật để cập nhật giá trị session id lần kế tiếp đăng nhập. Nếu dùng transient cookie (cookie không lưu trên đĩa mà chỉ có giá trị đến khi nào trình duyệt bị tắt bỏ, cookie này lưu trên memory của trình duyệt), cookie này sẽ được tạo ra cho mỗi xuất truy cập.




Nếu session chấm dứt, web application hủy và xóa trọn bộ thông tin thuộc về session đó trên memory của server. Bởi thế, nếu ai dùng giá trị session id cũ và truy cập đến server thì sẽ được cấp một session id hoàn toàn mới vì session id cũ hiện không có trên server.

Giả sử một moderator vào trang abc.php chẳng hạn. Lúc đó,

- server sẽ kiểm tra và chấp nhận moderator đó hiện đang ở trong một session có giá trị (bằng cách kiểm tra giá trị cookie sessionid trong cookie khi trình duyệt gởi request đi). Trong khi xây dựng trang abc.php để trả lời cho request ở trên, server sẽ tạo một token có giá trị nào đó rồi kèm theo và gởi ngược lại cho client.

- client nhận được trang abc.php và nó hiển thị trên trình duyệt. Trong nội dung trang này có chứa giá trị token (ở dạng giá trị biến trên query string nếu dùng GET, ở dạng hidden fields nếu dùng POST như đã dẫn giải ở bài trước).

- trang abc.php này có đường dẫn để thực thi việc gì đó và việc thực thi có xảy ra hay không thì đã dẫn giải trước đây.

Các bước trên có thể dùng GET hay POST giữa client và server. GET và POST chỉ là phương pháp chuyển gởi thông tin. Trong giai đoạn này, ngoài các thông tin tĩnh (như pic, css, js...) được ấn định là "tĩnh" theo sự trả lời của server sẽ có thể được cache (cache trên proxy, cache ngay chính trên trình duyệt), các thông tin "động" khác như chính trang abc.php và các giá trị thuộc trang này hoàn toàn nằm trên bộ nhớ của trình duyệt. Nếu tắt trình duyệt ngay lúc này và vào thư mục chứa cache của trình duyệt thì chỉ thấy dăm ba bức hình và vài cái css, js (nếu có dùng) mà thôi. Trang abc.php sẽ không có trong thư mục chứa cache này. Đây chính là cái gọi là "lưu trên memory của trình duyệt".

Hy vọng đã phần nào giải thích rõ hơn.

Thân mến.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 06/05/2011 18:59:38 (+0700) | #55 | 236763
[Avatar]
dazzlingvit
Member

[Minus]    0    [Plus]
Joined: 17/01/2011 20:58:03
Messages: 44
Offline
[Profile] [PM] [Yahoo!]

conmale wrote:

Giả sử một moderator vào trang abc.php chẳng hạn. Lúc đó,

- server sẽ kiểm tra và chấp nhận moderator đó hiện đang ở trong một session có giá trị (bằng cách kiểm tra giá trị cookie sessionid trong cookie khi trình duyệt gởi request đi). Trong khi xây dựng trang abc.php để trả lời cho request ở trên, server sẽ tạo một token có giá trị nào đó rồi kèm theo và gởi ngược lại cho client.

- client nhận được trang abc.php và nó hiển thị trên trình duyệt. Trong nội dung trang này có chứa giá trị token (ở dạng giá trị biến trên query string nếu dùng GET, ở dạng hidden fields nếu dùng POST như đã dẫn giải ở bài trước).

- trang abc.php này có đường dẫn để thực thi việc gì đó và việc thực thi có xảy ra hay không thì đã dẫn giải trước đây.

Các bước trên có thể dùng GET hay POST giữa client và server. GET và POST chỉ là phương pháp chuyển gởi thông tin. Trong giai đoạn này, ngoài các thông tin tĩnh (như pic, css, js...) được ấn định là "tĩnh" theo sự trả lời của server sẽ có thể được cache (cache trên proxy, cache ngay chính trên trình duyệt), các thông tin "động" khác như chính trang abc.php và các giá trị thuộc trang này hoàn toàn nằm trên bộ nhớ của trình duyệt. Nếu tắt trình duyệt ngay lúc này và vào thư mục chứa cache của trình duyệt thì chỉ thấy dăm ba bức hình và vài cái css, js (nếu có dùng) mà thôi. Trang abc.php sẽ không có trong thư mục chứa cache này. Đây chính là cái gọi là "lưu trên memory của trình duyệt".

Thân mến. 

Xin lỗi vì đã đào bài này lên, nhưng đây đúng là vấn đề em đang thắc mắc, mong các anh giúp đỡ smilie
Theo như anh conmale thì server sẽ tạo token và gửi trả lại client dưới dạng Hidden fields. Nhưng liệu token này có thể bị đọc bởi một trang thứ 3 như sau không?
(Giả sử người dùng bị lừa vào một trang nào đó, và dính Javascript thực hiện như sau)
- Dùng AJAX gửi một yêu cầu đến trang abc.php. Khi đó (như trên), server sẽ trả về mã HTML, trong đó có chứa token nằm trong Hidden Field.
- Dùng Javascript lấy token trong mớ HTML này, rồi cứ thế dùng AJAX gửi các yêu cầu POST đến trang abc.php để xoá các thứ.
Liệu kịch bản này có xảy ra không ạ ?
Dazzling V.I.T
Hãy gọi tôi là vịt
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 06/05/2011 22:30:26 (+0700) | #56 | 236770
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]

dazzlingvit wrote:

Theo như anh conmale thì server sẽ tạo token và gửi trả lại client dưới dạng Hidden fields. Nhưng liệu token này có thể bị đọc bởi một trang thứ 3 như sau không?
(Giả sử người dùng bị lừa vào một trang nào đó, và dính Javascript thực hiện như sau)
- Dùng AJAX gửi một yêu cầu đến trang abc.php. Khi đó (như trên), server sẽ trả về mã HTML, trong đó có chứa token nằm trong Hidden Field.
- Dùng Javascript lấy token trong mớ HTML này, rồi cứ thế dùng AJAX gửi các yêu cầu POST đến trang abc.php để xoá các thứ.
Liệu kịch bản này có xảy ra không ạ ?
 


Có thể xảy ra nếu như trang thứ ba mà bạn nói có cùng origin [1] với abc.php. Nói cách khác, nếu mà đã bị XSS rồi thì kẻ tấn công có thể dễ dàng vượt qua các cơ chế phòng thủ CSRF.

[1] http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy.

-m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|