Tìm hiểu SQL Injection và cách phòng chống

1. SQL Injection là gì? 2. Ví dụ khai thác SQL Injection 3. Phòng chống tấn công SQL Injection 4. Kết luận 1. SQL Injection là gì? ...

1. SQL Injection là gì? 
2. Ví dụ khai thác SQL Injection 
3. Phòng chống tấn công SQL Injection 
4. Kết luận

1. SQL Injection là gì?
Lỗ hổng SQL Injection: Là lỗ hổng bảo mật xảy ra khi người lập trình thực hiện các câu truy vấn cơ sở dữ liệu, do không lọc dữ liệu đầu vào dẫn đến hacker có thể gửi những truy vấn bất hợp pháp. Từ đó, có thể đánh cắp được toàn bộ cơ sở dữ liệu, bao gồm: tài khoản, mật khẩu, địa chỉ email... Nguy hiểm hơn, hacker có thể kiểm soát toàn bộ nội dung website và chiếm quyền điều khiển máy chủ..


2. Khai thác SQL Injection

Ví dụ bạn có Form login

Và đoạn code xử lý trên server:
if(isset($_POST['username']) && isset($_POST['password'])){
 $sql = "SELECT * FROM tbl_user WHERE username='". $_POST['username'] . "' AND password = '" .$_POST['password'] ."'";
}
Đoạn code trên hoạt động bình thường, không vấn đề gì xảy ra cho đến khi hacker đăng nhập với trường User là ' OR '1' = '1 và Password là ' OR '1' = '1
Và câu truy vấn cơ sở dữ liệu kiểm tra đăng nhập trở thành:
SELECT * FROM tbl_user WHERE username = '' OR '1' = '1' and password = '' OR '1' = '1'
BUZZ, hacker đăng nhập thành công mà không cần có tài khoản đăng nhập. Nguyên nhân do đoạn code trên không lọc dữ liệu khi hacker nhập vào.

3. Phòng chống tấn công SQL Injection

Cách khắc phục khá đơn giản, nguyên tắc là kiểm soát chặt chẽ dữ liệu mà người dùng nhập vào.
Ví dụ với biến id tại đường dẫn sau: http://domain.com?id=5.

Có những cách sau:
  • Ràng buộc kiểu dữ liệu 
$id = $_GET['id'];
//Ràng buộc kiểu dữ liệu số
$id = isset($_GET['id'])?(string)(int)$_GET['id']:false;
  • Loại bỏ các ký tự độc hại
Trong trường hợp này ta sẽ loại bỏ các ký tự không phải là số
$id = isset($_GET['id'])?(string)(int)$_GET['id']:false;
$id = str_replace('/[^0-9]/', '', $id);
$sql= 'SELECT * FROM tbl_user WHERE id= ' . mysqli_real_escape_string($id);
  • Sử dụng PDO
if (isset($_GET['id'])){
  $id = $_GET['id'];
   if ( is_numeric($id) == true){
    try{
      $dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd');
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $q = "SELECT username 
          FROM users
          WHERE id = :id";
      // Prepare the SQL query
      $sth = $dbh->prepare($q);
      // Bind parameters to statement variables
      $sth->bindParam(':id', $id);
      // Execute statement
      $sth->execute();
      $sth->setFetchMode(PDO::FETCH_ASSOC);
      $result = $sth->fetchColumn();
      print( htmlentities($result) );
      $dbh = null;
    }
    catch(PDOException $e){
      http_response_code(500);
      die('Error establishing connection with database');
    }
   } else{
    http_response_code(400);
    die('Error processing bad or malformed request');
   }
}

4. Lời kết 

SQL Injection là một lỗ hổng cực kỳ nguy hiểm, nó có thể dẫn tới việc bạn bị chiếm quyền quản trị website hoặc nguy hiểm hơn là kẻ xấu có thể sửa, xóa toàn bộ nội dung website với mục đích phá hoại. Để tránh lỗ hổng này, bạn nên trang bị firewall application (Nổi tiếng nhất và miễn phí là mod security - hỗ trợ Apache, IIS và Nginx) để lọc các kiểu tấn công phổ biến.

Ngoài ra, bạn cần thường xuyên theo dõi, cập nhật các bản vá lỗ hổng bảo mật nếu sử dụng các CMS phổ biến như Joomla, Wordpress, Drupal... trên các diễn đàn bảo mật uy tín.

Bài viết tới mình sẽ hướng dẫn các bạn cài đặt Firewall application nổi tiếng MOD SECURITY

Related

Thủ thuật 789382951923007798

Post a Comment

  1. Replies
    1. You must test with very very long long comment. This can break your blog and design layout.

      Delete
  2. :contact: contact me on fiverr/tiennguyenvan to do a task for you.

    ReplyDelete

emo-but-icon

Follow Us

Hot in week

Recent

Comments

Side Ads

Text Widget

Connect Us

item