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) 30/01/2007 01:23:32 (+0700) | #1 | 38927
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Cross site request forgery là gì? Nó là phương pháp mượn tay người để thực hiện một hành động không cho phép. Ví dụ, để có thể xóa một bài viết trên diễn đàn, một member có thể mượn tay của một moderator để làm việc đó vì member không đủ chủ quyền nhưng moderator lại đủ chủ quyền để thực hiện hành động này.

Chi tiết về CSRF (hay XSRF) ở đây:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
http://www.tux.org/~peterw/csrf.txt

Gần đây (cách đây 2 tuần), mrro có post một chủ đề rất lý thú trong khu vực ban quản trị để đưa ra vấn đề này này với nội dung như sau:

mrro wrote:
Chào anh conmale,
Hôm nay nhân dịp em tiến hành audit cái web-app của một khách hàng nên em cũng thử apply các technique đó vào HVA. Em thấy HVA mình bị cái lỗi cross site request forgery ở chức năng delete và hide một bài viết. Ví dụ như em muốn delete một bài có id là 12345, em chỉ cần GET cái URI như sau:
Code:
http://hvaonline.net/hvaonline/jforum.html?module=posts&action=delete&post_id=12345&start=0


Khi đó nếu như em, bằng một cách nào đó, dụ được anh conmale hay bất kì lão nào trong BQT HVA vào một cái site do em control, em sẽ dễ dàng delete được hết tất cả các post có trong forum mình. Tưởng tượng em post một bài lên HVA, có đường link đến cái site của em, trong site đó em để một vòng lặp lần lượt delete hết tất cả các post.  


Thông tin này được nbthanh diễn giải thêm:

nbthanh wrote:

Lỗi được diễn giải (reword) như sau smilie (credit vẫn của Mr Thái ^_^)
Một số action "nhạy cảm" của diễn đàn được thực hiện qua GET action, ví dụ (mà Thái đưa ra) là acn Delete bài viết. Hơn nữa cái action này không thông qua 1 cơ chế confirmation nào trước khi thực thi hết.
Note: Cái javascript pop up lên hỏi "Có xóa hay không?" khi click vào link thì không được tính là "confirmation" trên phương diện bảo mật smilie

Như vậy, nếu có ai đó "dụ" được Admin/Mod/Whoever có quyền "click" vào cái link xóa bài, thế là bài viết sẽ đi tong! (với điều kiện là Admin/Mod đó đang login vào forum).
Cách "dụ" thì quá dễ, và rất muôn hình vạn trạng. Và dụ Admin/Mod lại càng dễ nữa smilie

Đơn cử 1 cách "dụ":

Tạo 1 topic, có title thật "hot" trong 1 box cũng "hot" luôn --> 100% là sẽ có mod hoặc admin nào đó vào xem liền, và nếu người đó cố tình, có thể "canh me" lúc các Admin/Mod online, post 1 bài thật hot thì còn hiệu quả hơn nữa.

Trong topic đó, tìm cách "execute" cái link delete bài viết (hay 1 action "nhạy cảm" nào đó), các execute thì cũng vô cùng đơn giản: dùng thẻ image của diễn đàn, "hook up" cái link vô - dĩ nhiên là image sẽ không hiển thị, nhưng...lúc này thì teo rồi smilie

Cách "dụ" này nguy hại ở chỗ:
- Vì là image nên cái link sẽ được execute ngay khi bài viết được đọc
- Nếu không chú ý, rất khó phát hiện ra cái link "độc" trong cái image, và nhất là nếu dùng 1 số trình duyệt như FF, image không tồn tại nó không "la làng" lên như IE --> còn chết bạo nữa.
- Bài viết trên forum HVA, tag image cũng link tới 1 URL trên HVA --> by pass được hoàn toàn referer và cookie/session check ở server side.  



Tiếp theo đó, mrro khai triển thêm:

mrro wrote:

Một tên gọi khác của cross site request forgery là session riding, nghĩa là em sẽ "mượn dao chém mướn", lấy session của anh để thực hiện hành động xóa hay ẩn bài. Tình huống nó như thế này:

1. Anh đăng nhập vào HVA. Session của anh vẫn còn hiệu lực.

2. Anh vào website của em.

3. Trong website của em, em sử dụng <img hay <iframe (có rất nhiều cách khác nhau) theo kiểu như sau:

Code:
<iframe name="myframe" src="http://hvaonline.net/hvaonline/jforum.html?module=posts&action=hide&post_id=36994&by=conmale" style="width:0px;height:0px;border:0px"></iframe>



4. Lúc đó browser của anh sẽ tự động truy cập vào cái URI là giá trị của thuộc tính src trong cái iframe. Điều đặc biệt là lúc này, browser của anh vẫn sử dụng cái session cũ khi anh đăng nhập vào HVA. Do đó nó hoàn toàn có hiệu lực như thể anh thực hiện hành động đó. 



Vậy.... thử bàn giải pháp khắc phục xem sao? smilie).

Thâ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) 30/01/2007 07:02:25 (+0700) | #2 | 38992
PHUCDOAN
Member

[Minus]    0    [Plus]
Joined: 04/08/2006 23:50:25
Messages: 33
Offline
[Profile] [PM]
Xin góp ý vậy thôi:
1- Member không có quyền delete thì làm sao biết được cái URI như thế này (tuy nhiên cũng có thể có khả năng xảy ra) .
2- script 'confirm' nên đặt ở trang delete_result để chắc chắn mỗi record bị xóa đều có confirmation.
Trình độ có hạn chỉ nghĩ được đến đó thôi mong đừng chê trách.
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 30/01/2007 11:42:32 (+0700) | #3 | 39035
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Yêu cầu truyền một chuỗi hash vào server script.
Hash này có thể chính là session id truyền trực tiếp lên URI qua GET method.Mọi script sẽ check sự tồn tại của dòng Session này với session id load từ server.

Nếu trùng tức là đang đúng người chủ của session còn không tức là kẻ đang tiến hành CSRF, vì kẻ dụng dao giết người không thể lấy được session ID của vị Moderator vì mỗi lần login vị này có một SessionID khác nhau.

Đó là ý tưởng nảy ra trong đầu em chưa xác thực nên không biết có phù hợp không.
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) 30/01/2007 16:11:58 (+0700) | #4 | 39059
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]
Em suggest 1 cách đơn giản, đó là submit request = method POST thay vì GET, như đang sử dụng.
-- w~ --
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 30/01/2007 17:20:21 (+0700) | #5 | 39061
[Avatar]
conmale
Administrator

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

WinDak wrote:
Em suggest 1 cách đơn giản, đó là submit request = method POST thay vì GET, như đang sử dụng. 


smilie) nhưng POST vẫn có thể bị intercept như thường mà? Vấn đề ở chỗ xác thực được hành động xóa bài đó có đúng là moderator thực hiện có chủ định hay vô tình xóa vì dính CSRF. Nếu thay GET bằng POST nhưng không có cơ chế kiểm soát thì đâu có gì khác nhau đâu?

Cả hai ý kiến của hackernohat và PHUCDOAN đều lý thú và có thể ứng dụng cả. Hãy thử phân tích xem, có cách nào lấy được sessionID hiện tại của một moderator nào đó không? smilie).
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) 31/01/2007 02:49:25 (+0700) | #6 | 39083
watchd0g
Member

[Minus]    0    [Plus]
Joined: 30/11/2006 18:05:23
Messages: 42
Offline
[Profile] [PM]
1- Member không có quyền delete thì làm sao biết được cái URI như thế này (tuy nhiên cũng có thể có khả năng xảy ra) .  
Cái URL thì dễ thôi, install 1 cái forum y chang, tất nhiên là có quyền Admin sẵn rồi.
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 31/01/2007 07:05:21 (+0700) | #7 | 39134
[Avatar]
conmale
Administrator

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

watchd0g wrote:
1- Member không có quyền delete thì làm sao biết được cái URI như thế này (tuy nhiên cũng có thể có khả năng xảy ra) .  
Cái URL thì dễ thôi, install 1 cái forum y chang, tất nhiên là có quyền Admin sẵn rồi. 


Đúng vậy. Nếu dùng các forum có sẵn mà không thêm bớt, điều chỉnh, code thêm... thì cài 1 con y hệt là ra ngay.

Nếu không thì viết một cái script hay chương trình để "crawl" thì thế nào cũng ra thôi smilie).
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) 31/01/2007 13:21:21 (+0700) | #8 | 39190
vietwow
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 13:15:47
Messages: 90
Offline
[Profile] [PM]
Em có 1 thắc mắc hơi ngoài lề xíu, theo em biết khi submit 1 thông tin lên web server thì giao thức HTTP dùng phương pháp POST còn GET chỉ được dùng khi 1 user nào đó muốn "lấy" thông tin về browser của họ, trường hợp ở đây là user submit 1 URL :http://hvaonline.net/hvaonline/jforum.html?module=posts&action=delete&post_id=12345&start=0

Như vậy thì phải dùng POST mà sao forum hva lại dùng GET nhỉ ??
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 31/01/2007 14:31:11 (+0700) | #9 | 39203
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Gửi vietwow: Theo khoai được biết, POST chỉ dùng khi bạn cần đưa thật nhiều dữ liệu lên server. Cái đống dữ liệu đó sẽ không thể nằm trọn trong HTTP header, do đó mới dùng method POST và đặt cái dữ liệu vào HTTP payload. Khi đó thì không ngại việc giới hạn của HTTP header size nữa. Còn nếu chỉ muốn đưa một lượng thông tin nhỏ lên server thì có thể đặt trực tiếp trên URL. Như vậy, một method POST với URL như của bạn:
Code:
http://hvaonline.net/hvaonline/jforum.html?module=posts&action=delete&post_id=12345&start=0

sẽ không cần thiết có payload.

khoai
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 31/01/2007 14:52:31 (+0700) | #10 | 39205
[Avatar]
mudzot
Elite Member

[Minus]    0    [Plus]
Joined: 26/06/2006 14:41:27
Messages: 76
Offline
[Profile] [PM]
Theo em nghĩ để chống CSRF kiểu này thì chuyển tiếp qua 1 trang để confirm trước khi thực thi là tốt nhất. Tuy nhiên phân tích tiếp em thấy có thể làm đơn giản hơn :

1. Đối với kiểu "lừa" admin/mod sang trang khác rồi GET trở lại thì sẽ có Referer từ bên ngoài, như vậy chỉ cần check Referer là chặn được.

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
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 31/01/2007 15:01:08 (+0700) | #11 | 39207
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]

conmale wrote:

WinDak wrote:
Em suggest 1 cách đơn giản, đó là submit request = method POST thay vì GET, như đang sử dụng. 


smilie) nhưng POST vẫn có thể bị intercept như thường mà? Vấn đề ở chỗ xác thực được hành động xóa bài đó có đúng là moderator thực hiện có chủ định hay vô tình xóa vì dính CSRF. Nếu thay GET bằng POST nhưng không có cơ chế kiểm soát thì đâu có gì khác nhau đâu?
 


^^ uhm, anh nói đúng ạ, nhưng với trường hợp riêng ở trên, thì thay POST cho GET là đưa về tình trạng chung của hệ thống phải không ạ.

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)

Về việc add thêm 1 trường đặc biệt vào trong request gửi đi, theo em vẫn có cách bypass nếu như attacker sử dụng được javascript (XSS ?)...
ví dụ ta có thể xài getElementbyID hoặc document.form[x].field.value etc...










-- w~ --
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 31/01/2007 16:17:49 (+0700) | #12 | 39213
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
@mudzot:
1. Đối với kiểu "lừa" admin/mod sang trang khác rồi GET trở lại thì sẽ có Referer từ bên ngoài, như vậy chỉ cần check Referer là chặn được.  

referer thì làm giả cái một smilie

Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 01/02/2007 03:47:48 (+0700) | #13 | 39263
[Avatar]
xnohat
Moderator

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

conmale wrote:

WinDak wrote:
Em suggest 1 cách đơn giản, đó là submit request = method POST thay vì GET, như đang sử dụng. 


smilie) nhưng POST vẫn có thể bị intercept như thường mà? Vấn đề ở chỗ xác thực được hành động xóa bài đó có đúng là moderator thực hiện có chủ định hay vô tình xóa vì dính CSRF. Nếu thay GET bằng POST nhưng không có cơ chế kiểm soát thì đâu có gì khác nhau đâu?

Cả hai ý kiến của hackernohat và PHUCDOAN đều lý thú và có thể ứng dụng cả. Hãy thử phân tích xem, có cách nào lấy được sessionID hiện tại của một moderator nào đó không? smilie). 


Cám ơn câu hỏi "khó" của anh conmale

Theo kiến thức hạn hẹp mà em có thì em chỉ nghĩ được 2 cách ( rất ư là vô lý ):

1. Trang này phải dính thêm bug XSS.
2. Tìm thuật giải mà phần mềm máy chủ dùng để generate SessionID, rồi dựa vào các thông tin khách quan như IP hiện tai của Moderator .v.v. mà tái tạo SessionID.

Em còn đang tìm hiểu xem có phương thức nào khác lấy SessionID. Hi vọng là tìm ra

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) 01/02/2007 04:06:02 (+0700) | #14 | 39267
PHUCDOAN
Member

[Minus]    0    [Plus]
Joined: 04/08/2006 23:50:25
Messages: 33
Offline
[Profile] [PM]

conmale wrote:

watchd0g wrote:
1- Member không có quyền delete thì làm sao biết được cái URI như thế này (tuy nhiên cũng có thể có khả năng xảy ra) .  
Cái URL thì dễ thôi, install 1 cái forum y chang, tất nhiên là có quyền Admin sẵn rồi. 


Đúng vậy. Nếu dùng các forum có sẵn mà không thêm bớt, điều chỉnh, code thêm... thì cài 1 con y hệt là ra ngay.

Nếu không thì viết một cái script hay chương trình để "crawl" thì thế nào cũng ra thôi smilie). 

sặc..... lạy mấy anh. nếu OpenSource thì không bàn gì nữa. Giả dụ nó là 1 site bình thường xem sao nào?

ý kiến pác nohathacker thú vị thật, tui thì chỉ lấy kinh nghiệm lập trình của mình thôi.
Thanks & regards
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 01/02/2007 05:17:09 (+0700) | #15 | 39279
[Avatar]
conmale
Administrator

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

hackernohat wrote:


Cám ơn câu hỏi "khó" của anh conmale

Theo kiến thức hạn hẹp mà em có thì em chỉ nghĩ được 2 cách ( rất ư là vô lý ):

1. Trang này phải dính thêm bug XSS.
 

Ở đây mình chỉ bàn ở giới hạn xsrf thôi. Nếu nó còn dính xss nữa thì phải nói là cực kỳ nguy nan smilie).

hackernohat wrote:

2. Tìm thuật giải mà phần mềm máy chủ dùng để generate SessionID, rồi dựa vào các thông tin khách quan như IP hiện tai của Moderator .v.v. mà tái tạo SessionID.
 

Giải thuật tạo SESSIONID thì có đầy ra đó. Từ php sang asp, jsp.... đều có tài liệu khắp nơi. Có cả tool để làm việc phân tích và đoán SESSIONID nữa. Tuy nhiên, xác suất đoán ra SESSIONID khá thấp. Nếu giá trị hash đó không phải chỉ lấy ở SESSIONID mà còn một số dữ kiện đặc thù khác của từng người dùng thì sao mà đoán được? smilie).

hackernohat wrote:

Em còn đang tìm hiểu xem có phương thức nào khác lấy SessionID. Hi vọng là tìm ra

 

Thử nghĩ xem, phương tiện nào truyền tải những thứ như sessionid, hash... ? Thử nghĩ cái gì không ngăn chặn "biên giới" (hoặc không ngăn chặn đủ) những thông tin không liên quan giữa session của người đang duyệt và session của một người khác ở đâu đó? smilie)

PHUCDOAN wrote:

sặc..... lạy mấy anh. nếu OpenSource thì không bàn gì nữa.
 

Hình như bồ ám chỉ open source không an toà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) 01/02/2007 06:49:18 (+0700) | #16 | 39291
PHUCDOAN
Member

[Minus]    0    [Plus]
Joined: 04/08/2006 23:50:25
Messages: 33
Offline
[Profile] [PM]

conmale wrote:

Thử nghĩ xem, phương tiện nào truyền tải những thứ như sessionid, hash... ? Thử nghĩ cái gì không ngăn chặn "biên giới" (hoặc không ngăn chặn đủ) những thông tin không liên quan giữa session của người đang duyệt và session của một người khác ở đâu đó? smilie)  

Nể ông anh thiệt. Từ tư dẫn lối cho ae thấy nhé smilie

conmale wrote:

PHUCDOAN wrote:

sặc..... lạy mấy anh. nếu OpenSource thì không bàn gì nữa.
 

Hình như bồ ám chỉ open source không an toàn? 

tôi không ám chỉ opensource ko an toàn (đang sử dụng opensource muh). Vì tui đang nói đến cách getURL của 1 site bất kì chứ đâu có đề cập đến 1 OpenSource nào đâu, rõ khổ, OpenSource thì ai cũng có bàn làm gì??????
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 02/02/2007 02:34:56 (+0700) | #17 | 39453
mR.Bi
Member

[Minus]    0    [Plus]
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
[Profile] [PM] [WWW]
em cũng tìm kiếm nhiều, nghĩ ra mộ cách là hide sessionID này đi, nhưng hình như nó ko hiệu quả.
Nếu anh "mở" thêm 1 chút nữa, chắc em cũng kiếm đc 1 vài cái nữa
Waiting.........
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children"
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 02/02/2007 14:36:24 (+0700) | #18 | 39546
omega-toplist
Member

[Minus]    0    [Plus]
Joined: 15/12/2006 11:10:04
Messages: 3
Offline
[Profile] [PM]
Trích cả đoạn trong sách ra để tham khảo cho nó dễ, không biết cái này có giúp ích gì cho các bác

Session Hijacking
The most common session attack is session hijacking . This refers to any method that an attacker can use to access another user's session. The first step for any attacker is to obtain a valid session identifier, and therefore the secrecy of the session identifier is paramount. The previous sections on exposure and fixation can help you to keep the session identifier a shared secret between the server and a legitimate user.

The principle of Defense in Depth can be applied to sessions some minor safeguards can offer some protection in the unfortunate case that the session identifier is known by an attacker. As a security-conscious developer, your goal is to complicate impersonation. Every obstacle, however minor, offers some protection.

The key to complicating impersonation is to strengthen identification. The session identifier is the primary means of identification, and you want to select other data that you can use to augment this. The only data you have available is the data within each HTTP request:

GET / HTTP/1.1
Host: example.org
User-Agent: Firefox/1.0
Accept: text/html, image/png, image/jpeg, image/gif, */*
Cookie: PHPSESSID=1234

You want to recognize consistency in requests and treat any inconsistent behavior with suspicion. For example, while the User-Agent header is optional, clients that send it do not often alter its value. If the user with a session identifier of 1234 has been using Mozilla Firefox consistently since logging in, a sudden switch to Internet Explorer should be treated with suspicion. For example, prompting for the password is an effective way to mitigate the risk with minimal impact to your legitimate users in the case of a false alarm. You can check for User-Agent consistency as follows:

<?php

session_start();

if (isset($_SESSION['HTTP_USER_AGENT']))
{
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
{
/* Prompt for password */
exit;
}
}
else
{
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}

?>



I have observed that some versions of Internet Explorer send a different Accept header depending upon whether the user refreshes the browser, so Accept should not be relied upon for consistency.

Requiring a consistent User-Agent helps, but if the session identifier is being propagated in a cookie (the recommended approach), it is reasonable to assume that, if an attacker can capture the session identifier, he can most likely capture the value of all other HTTP headers as well. Because cookie disclosure typically involves a browser vulnerability or cross-site scripting, the victim has most likely visited the attacker's web site, disclosing all headers. All an attacker must do is reproduce all of these to avoid any consistency check that uses HTTP headers.

A better approach is to propagate a token in the URLsomething that can be considered a second (albeit much weaker) form of identification. This propagation takes some workthere is no feature of PHP that does it for you. For example, assuming the token is stored in $token, all internal links in your application need to include it:

<?php

$url = array();
$html = array();

$url['token'] = rawurlencode($token);
$html['token'] = htmlentities($url['token'], ENT_QUOTES, 'UTF-8');

?>

<a href="index.php?token=<?php echo $html['token']; ?>">Click Here</a>

To make propagation a bit easier to manage, you might consider keeping the entire query string in a variable. You can append this variable to all of your links, which makes it easy to refactor your code later, even if you don't implement this technique initially.

The token needs to be something that cannot be predicted, even under the condition that the attacker knows all of the HTTP headers that the victim's browser typically sends. One way to achieve this is to generate the token using a random string:

<?php

$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';

$token = md5($string);
$_SESSION['token'] = $token;

?>

When you use a random string (SHIFLETT in this example), prediction is impractical. In this case, capturing the token is easier than predicting it, and by propagating the token in the URL and the session identifier in a cookie, multiple attacks are needed to capture both. The exception is when the attacker can observe the victim's raw HTTP requests as they are sent to your application, because this discloses everything. This type of attack is more difficult (and therefore less likely), and it can be mitigated by using SSL.

Some experts warn against relying on the consistency of User-Agent. The concern is that an HTTP proxy in a cluster can modify User-Agent inconsistently with other proxies in the same cluster.

If you do not want to depend on User-Agent consistency, you can generate a random token:

<?php

$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

?>

This approach is slightly weaker, but it is much more reliable. Both methods provide a strong defense against session hijacking. The appropriate balance between security and reliability is up to you.
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 03/02/2007 05:05:23 (+0700) | #19 | 39646
mR.Bi
Member

[Minus]    0    [Plus]
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
[Profile] [PM] [WWW]
cách của bro ko đc, HVA dùng JForum mà
-----------------------------------------------
Tối hôm qua vắt tay lên trán nghĩ tới nghĩ lui,keke, nghĩ thêm đc chút, post lên đây xem thế nào.
Theo em cookies là trở ngại lớn trong vấn đề này. Cả 2 cái sessionID và hash đều lấy từ Cookies ra cả.
VD thế này:
Khi anh Conmale hay bác mod nào logon, thông tin logon đc lưu vào cookies, sau đó vào một topic có kèm link này

<iframe name="myframe" src="http://hvaonline.net/hvaonline/jforum.html?module=posts&action=hide&post_id=36994&by=conmale" style="width:0px;height:0px;border:0px"></iframe> 

(link của bài đầu)

Cái URL trong src=".." bắt buộc phải truy xuất thằng Cookies để có đc quyền của anh, sau đó mới delete bài đc <=phải ko a.?ko đúng thì bỏ quá cho em,hihi.
Với suy nghĩ trên em nêu ra đc một cách, chẳng hạn như anh làm cách nào đó cho cookies ko tham gia vào quá trình này ( chắc mod phải đăng nhập liên tục quá) hoặc: xác định những URL có khả năng là CSRF, sau đó thiết lập một rule, giống dạng signature ko cho queue Cookies là có thể giải quyêt đc.
Vài ý kiến.
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children"
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 03/02/2007 05:31:08 (+0700) | #20 | 39649
[Avatar]
Luke
Elite Member

[Minus]    0    [Plus]
Joined: 05/09/2002 13:21:20
Messages: 83
Offline
[Profile] [PM]
Theo Luke nghĩ thì việc giả POST cũng không khó
có thể convert GET sang POST thông qua việc sửa lại request qua 1 file trên server mình.
Victim -> Malcious Site -> IMG Tag -> GET -> Attacker php/asp/jsp.. -> POST -> Victim's Server
Tuy nhiên cách này thì ko thể tận dụng được cái HTTP_REFERER
Nhưng xét cho cùng thì chẳng có mấy ai check cái HTTP_REFERER và khi đưa về server mình xử lí thì việc tạo ra multi-broadcasting request càng dễ.
[Up] [Print Copy]
  [Question]   Re:Thảo luận: cross site request forgery (CSRF hay XSRF) 03/02/2007 12:32:38 (+0700) | #21 | 39720
[Avatar]
nora
Elite Member

[Minus]    0    [Plus]
Joined: 20/09/2006 00:08:43
Messages: 360
Location: UK
Offline
[Profile] [PM]
Mình thấy Topic này của huynh Conmale rất thú vị, mình chưa bao giờ nghĩ tới vụ "mượn dao" này.
Đọc qua phần http://www.tux.org/~peterw/csrf.txt thì thấy trên này họ cũng nêu cách khắc phục

> How can it be fixed? Well, there are a couple of ways to stop it, but the
> easiest (in PHP at least) seems to be to have most of the variables used by
> scripts be used through $HTTP_POST_VARS. So instead of checking for $action
> in a script, $HTTP_POST_VARS['action'] would be checked. This forces the
> user to use a POST request, not a GET.

which means the attacker reverts to using Javascript, or entices the victim
to click on an image that's acting as a submit control in a <form>.
Requiring POST raises the bar, but doesn't really fix the problem.

> Alternatively, the sessionid could be
> required to come with the GET/POST request variables, rather than by cookie.

...thereby exposing an important piece of authentication information to
history files and proxy servers; I really don't like URL mangling for
authentication purposes, especially in non-SSL systems. A combination of
cookie + URL mangling might not be bad, though in the message board case, a
CSRF attacker could use an intermediate wwwect (as described earlier) to
get the URL mangling (from the Referer), and wwwect back to the
messageboard with the proper mangling as well as all cookies that might be
expected/needed. So in your example case, URL mangling would buy nothing. smilie

> Finally, in the specific case of [img] tags, the use of ? or & in the img
> URL can be disabled by some regexes.

Not at all adequate. Browsers follow wwwects on IMG tags, so I wwwect
you to http://example.net/logo.gif which in turn wwwects you to the final
URL, as described earlier.

> If the software that you run is not secure, we recommend that you disable
> HTML and/or [img] tags, until the fixes have been implemented.

It's much worse than that.

Please see the following URLs for an introduction to the dangers of CSRF,
and some discussion of countermeasure strategies.

http://www.astray.com/pipermail/acmemail/2001-June/000803.html
http://www.astray.com/pipermail/acmemail/2001-June/000808.html
http://www.astray.com/pipermail/acmemail/2001-June/000804.html 


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ó phải topic này của huynh là để mọi người bàn luận và tìm ra cách tối ưu nhất hay để các members "tập suy nghĩ"?

tóm lại topic rất hay, indeed

smilie)
[Up] [Print Copy]
  [Question]   Re:Thảo luận: cross site request forgery (CSRF hay XSRF) 03/02/2007 23:43:01 (+0700) | #22 | 39770
[Avatar]
conmale
Administrator

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

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.

- phase 2: intermediate confirmation step. Bước này là bước đứng giữa để xác nhận moderator quả thật muốn thực thi hành động nào đó. Để bảo đảm hơn nữa, ứng dụng captchar có thể được đưa vào trong trường hợp này. Phase 2 đang viết, chưa ứng dụng smilie)

Dù hiện tại chỉ dùng phase 1, việc giả mạo một token nào đó trùng với giá trị token được server tạo ra là một việc hiếm hoi. Bởi thế, sẽ từ từ ứng dụng phase 2 (khi rảnh).

nora wrote:

Có phải topic này của huynh là để mọi người bàn luận và tìm ra cách tối ưu nhất hay để các members "tập suy nghĩ"?
 

Có lẽ là cả hai. Thật ra về mặt nguyên tắc thì chỉ có bấy nhiêu hướng ứng dụng. Tuy nhiên, khai triển càng nhiều thì càng tốt vì member có dịp suy nghĩ và ứng dụng cho trường hợp cụ thể của mình.

nora wrote:

tóm lại topic rất hay, indeed

smilie)  

Cám ơn smilie).
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) 04/02/2007 00:45:02 (+0700) | #23 | 39800
PHUCDOAN
Member

[Minus]    0    [Plus]
Joined: 04/08/2006 23:50:25
Messages: 33
Offline
[Profile] [PM]
bác conmale đã post topic này thú vị lém, tui thích lắm và theo dõi mỗi bài post của members. Anh Conmale ít nhất cũng cho chúng ta thấy được các hacker đã lợi dụng "đường biên" của ứng dụng để hack.
hehe, thanks so much!!!!!!!!!!
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 04/02/2007 10:58:18 (+0700) | #24 | 39905
HoS
Member

[Minus]    0    [Plus]
Joined: 03/02/2007 15:07:38
Messages: 43
Offline
[Profile] [PM]
Em cũng nghe nói về lỗi này. Nhưng em nghĩ lỗi này ko nguy hiểm lắm hoặc tại em ko hiểu rõ về nó.
Ngoài việc có thể inject vào javascript, html để khai thác cookies, hay 1 vài thông tin "xung quanh" website thì nó có thể làm gì hơn thế không?
[Up] [Print Copy]
  [Question]   Re:Thảo luận: cross site request forgery (CSRF hay XSRF) 04/02/2007 12:30:27 (+0700) | #25 | 39925
[Avatar]
xnohat
Moderator

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

conmale wrote:
-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. 


Thú vị thật smilie Phương pháp một này hơi quen quen.

Hèn chi anh conmale cứ tìm cách dụ em tìm cách lấy session hash :lolsmilie

Đáng nhẽ em trả lời tiếp câu hỏi "khó" đợt 2 của anh nhưng hình như nhiều anh em khác đã trả lời rồi.

Vâng, Session Hash ( Chuỗi Băm Nhận Diện Phiên Làm Việc ) thường được lưu trong cookies ( đa phần trường hợp các administrator không cấu hình cho phép cache session hash trên server vì sợ bị flood ), mặt khác nó được lưu trong một trường ẩn của mã HTML ( hidden field ) để khi nó được POST hay GET lên server thì hash sẽ được truyền đi.

Việc lấy hash trong 2 trường hợp này là có thể.

Với version cũ của 1 số browse ( trình duyệt ) có lỗi có thể thực hiện Cross-Site-Cookies-Read.
Việc đọc input hidden field còn dễ hơn qua các lệnh cơ bản của Javascript.

Vậy -------------> cách chống bằng Session Hash chưa đảm bảo được độ an toàn smilie .

Em có sai chỗ nào mong anh conmale chỉ giúp để kịp chữa lỗ hổng. :wink:
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) 06/02/2007 09:39:46 (+0700) | #26 | 40219
lyhuuloi
Elite Member

[Minus]    0    [Plus]
Joined: 04/04/2003 11:29:17
Messages: 90
Location: TP HCM
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Em nghĩ để khắc phục khe hở trên thì nên tạo 1 hash riêng cho từng thành viên, khi đó trên mỗi URL có tác động đến những thông tin nhạy cảm thì sẽ có thêm đoạn "&mem_key=abc" trong URL, như vậy chỉ cần kiểm tra mem_key trên URL so sánh với mem_key của thành viên đó là ok smilie
http://lyhuuloi.com smilie
[Up] [Print Copy]
  [Question]   Re: Thảo luận: cross site request forgery (CSRF hay XSRF) 06/02/2007 10:08:01 (+0700) | #27 | 40224
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
Việc lấy hash trong 2 trường hợp này là có thể.

Với version cũ của 1 số browse ( trình duyệt ) có lỗi có thể thực hiện Cross-Site-Cookies-Read.
Việc đọc input hidden field còn dễ hơn qua các hàm cơ bản của Javascript.  

bạn nohat nói cụ thể hơn được ko?? 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) 06/02/2007 12:23:01 (+0700) | #28 | 40240
[Avatar]
xnohat
Moderator

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

gamma95 wrote:
Việc lấy hash trong 2 trường hợp này là có thể.

Với version cũ của 1 số browse ( trình duyệt ) có lỗi có thể thực hiện Cross-Site-Cookies-Read.
Việc đọc input hidden field còn dễ hơn qua các lệnh cơ bản của Javascript.  

bạn nohat nói cụ thể hơn được ko?? smilie)  


Hì xin được giải thích thêm ( gamma95 biết rồi còn giả chưa biết smilie )
Đầu tiên là đọc cookie:
vì dụ các phiên bản cũ của IE cho phép chạy activeX FileSystemObject là một trong các activeX cho phép truy cập file, còn tiếp theo cậu hiểu ý tớ rồi chứ.

Và đọc input hidden field:
document.all.field.value;


Còn các lỗ hổng khác thì ..... nhìu nhìu. :cry:

tái bút: không mượn kim anh conmale châm nhau nhá 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) 08/02/2007 12:59:31 (+0700) | #29 | 40663
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
Hì xin được giải thích thêm ( gamma95 biết rồi còn giả chưa biết )
Đầu tiên là đọc cookie:
vì dụ các phiên bản cũ của IE cho phép chạy activeX FileSystemObject là một trong các activeX cho phép truy cập file, còn tiếp theo cậu hiểu ý tớ rồi chứ.

Và đọc input hidden field:
document.all.field.value;


Còn các lỗ hổng khác thì ..... nhìu nhìu.  

dùng một vài bug của của IE thì mình có biết, nhưng ko muốn bàn ở đây (vì cái này ko mang tính tổng quát, phải phụ thuộc vào trình duyệt của victim)
còn chuyện
Và đọc input hidden field:
document.all.field.value; 

cái này thì chỉ có victim đọc đc, cái quan trọng là nohat làm cách nào để lấy giá trị của hidden field của victim về ( lợi dụng CSRF) ??
Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Question]   Thảo luận: cross site request forgery (CSRF hay XSRF) 12/02/2007 14:28:58 (+0700) | #30 | 41297
114v
Member

[Minus]    0    [Plus]
Joined: 08/07/2006 23:27:00
Messages: 191
Offline
[Profile] [PM]
Theo em thì nên tạo 1 session gọi là keyspecial với nội dung là username của mod + với 1 key(có thể là key nhất định, hoặc ngẫu nhiên từ trong bảng user, để chắc hơn mình chơi cộng thêm cái pass đã mã hóa luôn)

Khi muốn làm những việc của mod, chỉ việc check xem nó có trùng không và tạo 1 trang xác nhận rồi check referer từ trang đó nữa. Không biết cách của em vậy đã ổn chưa? Theo em thì chưa ổn, sửa cái này đúng là khó thật, lơ mơ thì toi như chơi. Kiểu này thì chỉ có mod xóa luận lý rồi admin vào CP xóa thật sau :wink:
[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|