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 Luật chống lại Timing Attack (PHP)  XML
  [Discussion]   Luật chống lại Timing Attack (PHP) 07/07/2011 03:30:13 (+0700) | #1 | 242948
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Em vẫn đang tiếp tục phát triển mấy cái module cần thiết cho việc xây dựng website. Sau khi vượt qua một số trở ngại khá đáng kể thì lại có thêm trở ngại mới xuất hiện. Vì nghĩ việc lập trình liên quan rất lớn tới phát triển và bảo mật sau này nên cũng cất công tìm hiểu đôi chút.

Lần này vấn đề em gặp phải là blind sql injection/timing attack sau đây là luật em xây dựng để ngăn chặn việc ấy xãy ra. Timing attack là gì em nêu ở dưới nguồn từ https://www.owasp.org/. Rất mong được cùng mọi người thảo luận xung quanh vấn đề.

1. Phá luật được em tạo ra bên dưới như thế nào.

2. Cách sửa đổi các luật ấy để có thể không block nhầm dữ liệu và sửa thế nào cho hợp lý.

Code:
<?php

$str = "99' union select top 1 table_name from --etes twa another data"; //data

if(preg_match("/^([\'\)\"a-zA-Z0-9])+([0-255[:ascii:]])+select+([0-255[:ascii:]])+([\-])+([0-255[:ascii:]])+$/",strtolower($str))||preg_match("/^([\'\)\"\(a-zA-Z0-9])+([0-255[:ascii:]])+benchmark+([0-255[:ascii:]])+([\-])+([0-255[:ascii:]])+$/",strtolower($str))){
	echo("Attack report !.");
}
?>


Timing Attack

A Timing Attack depends upon injecting the following MySQL query:
Code:
SELECT IF(expression, true, false)


Using some time-taking operation e.g. BENCHMARK(), will delay server responses if the expression is True.
Code:
BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'))

- will execute 5000000 times the ENCODE function.

Depending on the database server performence and its load, it should take just a moment to finish this operation. The important thing is, from the attacker's point of view, to specify high number of BENCHMARK() function repetitons, which should affect the server response time in a noticeable way.

Example combination of both queries:
Code:
1 UNION SELECT IF(SUBSTRING(user_password,1,1) = CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE user_id = 1;


If the server response was quite long we may expect that the first user password character with user_id = 1 is character '2'.
Code:
(CHAR(50) == '2')


Using this method for the rest of characters, it's possible to get to know entire password stored in the database. This method works even when the attacker injects the SQL queries and the content of the vulnerable page doesn't change.

Obviously, in this example the names of the tables and the number of columns was specified. However, it's possible to guess them or check with a trial and error method.

Other databases than MySQL also have implemented functions which allow them to use timing attacks: 
while(1){}
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 07/07/2011 16:38:44 (+0700) | #2 | 242996
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
http://weakpoint.org/sqli.php
Link test blind sql ijection / timing attack.


2 luật trên đã được em sửa như sau.
Code:
/^(?(?=[0-255[:ascii:]])[0-255[:ascii:]]|[\'\)\"a-zA-Z0-9])+select+([0-255[:ascii:]])+([\-\;\#\/\d00])+(?(?=[0-255[:ascii:]])[0-255[:ascii:]])+$/


Code:
/^(?(?=[0-255[:ascii:]])[0-255[:ascii:]]|[\'\)\"a-zA-Z0-9])+benchmark+([0-255[:ascii:]])+([\-\;\#\/\d00])+(?(?=[0-255[:ascii:]])[0-255[:ascii:]])+$/


Rất mong nhận được sự quan tâm.
while(1){}
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 23/07/2011 12:22:14 (+0700) | #3 | 243961
[Avatar]
merlinhi
Member

[Minus]    0    [Plus]
Joined: 07/10/2004 03:41:11
Messages: 8
Offline
[Profile] [PM]
Bạn định dùng regex để lọc câu query ngăn chặn sql injection phải ko? Mình ko rành regex lắm, nhưng cái link Time Attack của bạn hay đấy smilie Lấy ghế ngồi nghe thôi smilie)
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 25/07/2011 12:16:42 (+0700) | #4 | 244091
vd_
Member

[Minus]    0    [Plus]
Joined: 06/03/2010 03:05:09
Messages: 124
Offline
[Profile] [PM]
Nếu là SELECT, BENCHMARK, SeLect ... thì sao?

Tốt nhất là bạn nên sanitize các param đưa vào câu SQL thay vì kiểm soát toàn bộ url. Ví dụ chỗ nào cần là number only thì dùng regex để kiểm tra hoặc cast về integer.
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 29/08/2011 00:04:41 (+0700) | #5 | 246108
khuongduybui
Member

[Minus]    0    [Plus]
Joined: 25/08/2011 20:01:20
Messages: 7
Offline
[Profile] [PM] [Email] [WWW]
Cái Timing Attack này nghe qua cũng thú vị nhưng nó chẳng qua là một kiểu bruteforce, chỉ cần mã hóa cẩn thận chút và thay đổi mã thường xuyên thì nó mò cả đời cũng không ra. Có nguy hiểm chăng là người ta có thể lợi dụng nó để DOS hệ thống của bạn.
Mà điều này thì đã thuộc vào chống SQL injections rồi nên mình thấy chỉ cần escape string là được, không cần mấy cái regexp rắc rối này, trừ khi bạn định để cho users trực tiếp nhập SQL queries vào ( :O )
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 29/08/2011 18:06:38 (+0700) | #6 | 246156
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]

vd_ wrote:
Nếu là SELECT, BENCHMARK, SeLect ... thì sao?

Tốt nhất là bạn nên sanitize các param đưa vào câu SQL thay vì kiểm soát toàn bộ url. Ví dụ chỗ nào cần là number only thì dùng regex để kiểm tra hoặc cast về integer. 


Mình chỉ block 2 cái đó thôi, bạn muốn viết hoa viết thường thế nào cũng được. Check bằng url mình đưa ấy thank smilie.
while(1){}
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 29/08/2011 20:12:35 (+0700) | #7 | 246165
vd_
Member

[Minus]    0    [Plus]
Joined: 06/03/2010 03:05:09
Messages: 124
Offline
[Profile] [PM]
@chiro8x

my bad, bạn đã dùng strtolower() để xử lý được hoa thường, tuy nhiên tui vẫn giữ ý kiến là giải pháp tốt nhất vẫn là kiểm tra các thông số đưa vào SQL thay vì nối chuỗi để thành sql.

Việc kiểm tra các keyword sql cũng như kiểm tra param đưa vào xem coi có trùng với pattern của sql không là một việc khá phức tạp, không thể chỉ dùng 1 hoặc 2 regex là có thể giải quyết được (bạn xem thêm ModSecurity Core Rule Set, phần rule SQL injection để thấy một số regex phát hiện sql injection).

Bạn cũng tham khảo thêm http://blog.spiderlabs.com/2011/07/modsecurity-sql-injection-challenge-lessons-learned.html để thấy một số kỹ thuật tránh detection.

[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 04/09/2011 20:12:53 (+0700) | #8 | 246490
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]

khuongduybui wrote:
Cái Timing Attack này nghe qua cũng thú vị nhưng nó chẳng qua là một kiểu bruteforce, chỉ cần mã hóa cẩn thận chút và thay đổi mã thường xuyên thì nó mò cả đời cũng không ra. Có nguy hiểm chăng là người ta có thể lợi dụng nó để DOS hệ thống của bạn.
Mà điều này thì đã thuộc vào chống SQL injections rồi nên mình thấy chỉ cần escape string là được, không cần mấy cái regexp rắc rối này, trừ khi bạn định để cho users trực tiếp nhập SQL queries vào ( :O ) 

Ưhm ! có thể can thiệp từ cpanel để đặt quyền cho 1 user nhưng cấm SELECT thì cấm thế nào giờ. Ghi nhận ý kiến của bạn.
while(1){}
[Up] [Print Copy]
  [Discussion]   Luật chống lại Timing Attack (PHP) 04/09/2011 20:16:02 (+0700) | #9 | 246491
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]

vd_ wrote:
@chiro8x

my bad, bạn đã dùng strtolower() để xử lý được hoa thường, tuy nhiên tui vẫn giữ ý kiến là giải pháp tốt nhất vẫn là kiểm tra các thông số đưa vào SQL thay vì nối chuỗi để thành sql.

Việc kiểm tra các keyword sql cũng như kiểm tra param đưa vào xem coi có trùng với pattern của sql không là một việc khá phức tạp, không thể chỉ dùng 1 hoặc 2 regex là có thể giải quyết được (bạn xem thêm ModSecurity Core Rule Set, phần rule SQL injection để thấy một số regex phát hiện sql injection).

Bạn cũng tham khảo thêm http://blog.spiderlabs.com/2011/07/modsecurity-sql-injection-challenge-lessons-learned.html để thấy một số kỹ thuật tránh detection.

 
Chủ đề mình đưa ra chỉ nói về timing attack thôi. Không giấu gì bạn đang làm web game sử dụng ajax và jquery nên chỉ cần chống cái timing attack là chủ yếu, nhưng mình sẽ tìm hiểu thứ bạn nói.
while(1){}
[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|