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 bảo mật Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản  XML
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 07/05/2012 16:00:01 (+0700) | #31 | 262655
[Avatar]
chiro8x
Member

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

WinDak wrote:
Nhìn vào "blacklist" này dễ thấy ngay 1 cách bypass để chèn các truy vấn sql. Xin hỏi anh em nào nhìn thấy không ? 


Code:
union+select+1+from+....


Dùng "+" thay cho kí tự [space] 0x20 (32 dec).

Sửa cái này lại đã.
Code:
$kiemtra = str_replace($tukhoa, '*',strtolower($cautruyvan));


Nếu là MS SQL thì có thể dùng:

Code:
sel/**/ect%20...
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 07/05/2012 17:25:43 (+0700) | #32 | 262664
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]
@chiro8x:
smilie chính xác, đây mình cho rằng là điểm yếu của 'blacklist' tự tạo, nếu không "rành" thì dễ dàng bypass được.

chiro8x có giải pháp gì không ?
-- w~ --
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 07/05/2012 17:45:37 (+0700) | #33 | 262667
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Lúc trước mình suy nghĩ về việc dùng hàm preg_match(); ( http://www.pcre.org/ ) để cản, mình chú ý vào các truy vấn SQL chứa SELECT.

Trong một bài mình đã từng đề cập:
/hvaonline/posts/list/39497.html


Vì thiếu hiểu biết nên luật được mình tìm ra chưa chuẩn xác trong quá trình tìm hiểu thêm mình đã bỏ sót khi người ta kết thúc query string bằng %00 hoặc #. Mình đang tính viết lại bằng pre_match(); , khuyết điểm của nó là hơi tốn tài nguyên, nhưng cản truy vấn trước khi gọi mysql_query().

Mình không tin tưởng cái mysql_real_escape_string(); lắm, tại mình sợ là có những phương pháp khác có thể vượt qua nó nhưng lại ngoài tầm hiểu biết của mình, và sợ là nó làm dị biến dữ liệu.

Mã kiểm tra mình làm như sau:
Code:
<?php
if(!function_exists("sqlj")){
   function sqlj($data){
      //Check here
   }
}

if(!function_exists("sqlj_check")){
   function sqlj_check($data){
      $key = NULL;
      $value = NULL;
      foreach($data as $key => $value){
         if(sqlj($value))exit();
      }     
   }
}

sqlj_check($_GET);
sqlj_check($_POST);
sqlj_check($_COOKIE);
?>


Không biết có noob quá không smilie.
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 07/05/2012 18:12:27 (+0700) | #34 | 262670
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]
=P chiro8x có thể viết hết cái

//Check Here  


được không ? chứ nhìn thế này thì không biết có gì khác cái cũ.
-- w~ --
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 07/05/2012 18:29:07 (+0700) | #35 | 262673
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Code:
return preg_match("/^([\'\)\"a-zA-Z0-9])+([0-255[:ascii:]])+select+([0-255[:ascii:]])+([\-])+([0-255[:ascii:]])+$/",strtolower($data))?true:false;


Vẫn là cái củ mà ! chưa fix được mấy bửa nay máy tớ cháy main board mang đi sửa smilie.
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 08/05/2012 03:35:15 (+0700) | #36 | 262689
[Avatar]
WinDak
Researcher

Joined: 27/01/2002 11:15:00
Messages: 223
Offline
[Profile] [PM]
Thế thì có lẽ cái hàm check của chiro8x còn yếu hơn cái trong bài này =P

Thay vì kiểm tra dữ liệu đầu vào có phải sql injection / xss / lfi / lrf không smilie sẽ tốt hơn nhiều nếu kiểm tra điều ngược lại !! ( và tốt hơn nữa nếu sử dụng cả 2).

Còn riêng về sql injection thì cách an toàn nhất là sử dụng câu truy vấn có chuẩn bị - "prepared statements" và sử dụng một cách chính xác.
-- w~ --
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 08/05/2012 06:10:47 (+0700) | #37 | 262693
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Mình cũng tính sử dụng một hàm đánh giá dựa trên tần số xuất hiện, chẳng hạn như tính các từ, các kí tự hay được dùng trong SQL injection/XSS/Remote file inclusion/Local file inclusion. Đếm số từ trong dữ liệu gửi lên và tính tần số của nó và có block hay không, dựa trên tần số xuất hiện, và số lần xuất hiện ở lần kế tiếp.

Nghe bạn nói vậy mình thấy đáng lo ngại thật, chắc phải mổ xẽ mấy cái open source xem người ta làm ăn thế nào, hôm bữa mỗ xẽ cái opencart thấy nó vẫn dùng str_replace(); lọc path traversal attack.

@Cách trên có khuyết điểm là cũng cần có dictionary, và khi dữ liệu lớn viết truy vấn kiểu gì cũng đc.
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 08/05/2012 06:17:09 (+0700) | #38 | 262694
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]
Cái OpenCart tớ nói nó thay đổi và tạo một class sử dụng str_replace(); cũng với hàm phân tách chuổi explode();

Nhưng lại bypass bằng cái Unicode / UTF-8 encoded directory traversal.
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 23/05/2012 15:03:50 (+0700) | #39 | 263873
hachoa59
Member

[Minus]    0    [Plus]
Joined: 11/09/2011 23:49:01
Messages: 9
Offline
[Profile] [PM]
Dic trên vẫn chưa được bạn à vì có thế câu truy xuất hoặc .. dạng hex thì chương trình bó tay
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 23/05/2012 16:24:55 (+0700) | #40 | 263883
[Avatar]
quocbao9996
Member

[Minus]    0    [Plus]
Joined: 19/09/2011 20:34:11
Messages: 62
Location: 192.168.1.1
Offline
[Profile] [PM] [Email] [Yahoo!]

WinDak wrote:
Nhìn vào "blacklist" này dễ thấy ngay 1 cách bypass để chèn các truy vấn sql. Xin hỏi anh em nào nhìn thấy không ? 


Ta mã hoá câu truy vấn phải không anh

Em mới học PHP, có gì mong anh chỉ giáo
Đây là cụm chữ được thêm vào cuối mỗi thông điệp của bạn. Cụm chữ này không bắt buộc phải có và chỉ giới hạn tối đa 255 chữ cái.
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 25/05/2012 13:38:08 (+0700) | #41 | 263988
[Avatar]
chiro8x
Member

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

quocbao9996 wrote:

WinDak wrote:
Nhìn vào "blacklist" này dễ thấy ngay 1 cách bypass để chèn các truy vấn sql. Xin hỏi anh em nào nhìn thấy không ? 


Ta mã hoá câu truy vấn phải không anh

Em mới học PHP, có gì mong anh chỉ giáo 


Cậu mã hoá thế nào ? sao tự dưng phán trớt quớt thế ?.
while(1){}
[Up] [Print Copy]
  [Question]   Phòng chống SQL Injection bằng PHP, hiệu quả đơn giản 25/05/2012 14:21:42 (+0700) | #42 | 263994
[Avatar]
quocbao9996
Member

[Minus]    0    [Plus]
Joined: 19/09/2011 20:34:11
Messages: 62
Location: 192.168.1.1
Offline
[Profile] [PM] [Email] [Yahoo!]

chiro8x wrote:

quocbao9996 wrote:

WinDak wrote:
Nhìn vào "blacklist" này dễ thấy ngay 1 cách bypass để chèn các truy vấn sql. Xin hỏi anh em nào nhìn thấy không ? 

Ta mã hoá câu truy vấn phải không anh
Em mới học PHP, có gì mong anh chỉ giáo 

Cậu mã hoá thế nào ? sao tự dưng phán trớt quớt thế ?. 


Em chỉ hỏi thôi chứ không hoàn toàn là phán

Em thấy chủ topic có dùng $cautruyvan = $_SERVER['QUERY_STRING'], do đó nếu như ta encode cái url đó, ví dụ em đưa dữ liệu GET vào là index.php?input=%63%68%72%20%28. Nếu dùng $cautruyvan = $_SERVER['QUERY_STRING'] thì $cautruyvan sẽ có giá trị là %63%68%72%20%28 trong khi đó PHP lại hiểu là "chr(" -> vượt qua được cái black list. echo $_SERVER['QUERY_STRING'] và echo $_GET['input'] sẽ cho 2 giá trị input khác nhau. Cái mã hoá này là URL Encoding

Em mới học PHP, có gì không biết mong các anh chỉ giáo thêm
Đây là cụm chữ được thêm vào cuối mỗi thông điệp của bạn. Cụm chữ này không bắt buộc phải có và chỉ giới hạn tối đa 255 chữ cái.
[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|