[Discussion] Luật chống lại Timing Attack (PHP) |
07/07/2011 03:30:13 (+0700) | #1 | 242948 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
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:
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){} |
|
|
|
[Discussion] Luật chống lại Timing Attack (PHP) |
07/07/2011 16:38:44 (+0700) | #2 | 242996 |
|
chiro8x
Member
|
0 |
|
|
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
|
|
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){} |
|
|
|
[Discussion] Luật chống lại Timing Attack (PHP) |
23/07/2011 12:22:14 (+0700) | #3 | 243961 |
|
merlinhi
Member
|
0 |
|
|
Joined: 07/10/2004 03:41:11
Messages: 8
Offline
|
|
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 Lấy ghế ngồi nghe thôi ) |
|
|
|
|
[Discussion] Luật chống lại Timing Attack (PHP) |
25/07/2011 12:16:42 (+0700) | #4 | 244091 |
vd_
Member
|
0 |
|
|
Joined: 06/03/2010 03:05:09
Messages: 124
Offline
|
|
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. |
|
|
[Discussion] Luật chống lại Timing Attack (PHP) |
29/08/2011 00:04:41 (+0700) | #5 | 246108 |
khuongduybui
Member
|
0 |
|
|
Joined: 25/08/2011 20:01:20
Messages: 7
Offline
|
|
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 ) |
|
|
|