Mysqli_real_escape_string trong wp

SQL Injection là một kiểu tấn công cơ sở dữ liệu trong đó kẻ tấn công cố gắng đánh cắp thông tin từ cơ sở dữ liệu của ứng dụng web. Điều này thậm chí có thể dẫn đến thực thi mã từ xa tùy thuộc vào môi trường ứng dụng web và phiên bản cơ sở dữ liệu

SQL Injection xảy ra do quá trình khử trùng đầu vào của người dùng kém. Nếu bạn lấy đầu vào từ người dùng bằng một số ngôn ngữ lập trình (PHP, ASP. NET) và chuyển trực tiếp đến cơ sở dữ liệu của máy chủ mà không áp dụng bất kỳ bộ lọc nào trên đầu vào, điều này có thể dẫn đến lỗ hổng SQL Injection

Ví dụ: mã PHP sau dễ bị tấn công SQL Injection vì nó chuyển trực tiếp đầu vào của người dùng vào cơ sở dữ liệu. Kẻ tấn công có thể tạo truy vấn cơ sở dữ liệu độc hại của riêng mình để trích xuất dữ liệu từ cơ sở dữ liệu

// Thông tin người dùng được lưu trữ trong id variable
$id = $_GET[‘id’];

// Dữ liệu nhập của người dùng được thực thi trực tiếp trong< database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id’";

// Trong trường hợp có lỗi hoặc . mysql_error . mysql_error . mysql_error . mysql_error success, the results are returned to user
$result = mysql_query($getid) or die(

’ . mysql_error() . '' );
$num = mysql_numrows($result);

Mặt khác, một ví dụ mã an toàn của mã như vậy để tương tác với cơ sở dữ liệu được đưa ra. Nó lấy đầu vào của người dùng và lọc bất kỳ ký tự độc hại nào khỏi nó, sau đó chuyển nó vào cơ sở dữ liệu

$id = $_GET ['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);

Tiêm SQL bình thường và mù

Tiêm SQL bình thường

Trong SQL Injection bình thường, nếu kẻ tấn công cố gắng đặt một trích dẫn (‘) làm đầu vào, khi trích dẫn đơn này được thực thi trong cơ sở dữ liệu, cơ sở dữ liệu sẽ phản hồi với một lỗi. Lỗi được in tại trình duyệt của kẻ tấn công

Mysqli_real_escape_string trong wp

Mã chịu trách nhiệm cho lỗi này là

// nếu cơ sở dữ liệu phản hồi với an error,or die()function gets executed
to print the error

$result = mysql_query ( $getid ) or die(

’ . mysql_error() . ‘’ );

Trong SQL Injection thông thường, kẻ tấn công có thể thấy kết quả lỗi và dễ dàng xác định và khai thác

Tiêm SQL mù

Trong trường hợp Blind SQL Injection, khi một truy vấn độc hại như một trích dẫn được thực thi, lỗi cơ sở dữ liệu không được hiển thị trên trình duyệt của kẻ tấn công hoặc nó được hiển thị theo cách rất chung chung mà kẻ tấn công không thể xác định và khai thác dễ dàng

Mysqli_real_escape_string trong wp

Mã phụ trợ chịu trách nhiệm cho việc này được đưa ra dưới đây

$result = mysql_query ( $getid); // Removed ‘or die’ to suppress mysql errors

Trong Blind SQL Injection, kẻ tấn công không thể nhìn thấy kết quả đầy đủ, do đó loại SQLi này khó xác định và khai thác nhưng nó có mức độ rủi ro tương tự như SQLi thông thường

Kỹ thuật phát hiện Blind SQL injection

Mặc dù có thể phát hiện lỗi SQL injection thông thường bằng cách gửi một dấu nháy đơn (‘) làm đầu vào và kiểm tra lỗi đầu ra, nhưng không thể phát hiện ra lỗi Blind SQL injection bằng kỹ thuật này vì nó không hiển thị bất kỳ lỗi SQL nào. Có nhiều kỹ thuật để phát hiện một Blind SQL injection, một số kỹ thuật được đưa ra như sau

TRUE và FALSE Dựa trên phát hiện

Một trong những đặc điểm của Cơ sở dữ liệu bao gồm MySQL là hành vi khác nhau đối với câu lệnh Đúng và Sai. Ngay cả khi cơ sở dữ liệu không hiển thị bất kỳ lỗi nào, chúng tôi có thể quyết định bằng cách sử dụng câu lệnh Đúng và Sai. Hãy xem xét kịch bản sau đây,

Trang sau dễ bị tấn công bởi Blind SQL injection, đưa ra một câu lệnh đúng sẽ hiển thị tất cả các mục nhập trong cơ sở dữ liệu

1‘ hoặc 1=1#

Mysqli_real_escape_string trong wp

Đưa ra một truy vấn Sai làm đầu vào sẽ không hiển thị bất kỳ dữ liệu nào

1‘ hoặc 1=2#

Mysqli_real_escape_string trong wp

Ngay cả khi trang web không hiển thị bất kỳ lỗi nào, sự khác biệt giữa hai trang cho biết rằng các truy vấn của chúng tôi đang được thực hiện thành công trong cơ sở dữ liệu

Phát hiện dựa trên THỜI GIAN

Có một chức năng trong cơ sở dữ liệu bao gồm MySQL, MS-SQL và các chức năng khác cho sự chậm trễ. Chúng ta có thể sử dụng hàm SLEEP() trong truy vấn của mình, nếu phản hồi của cơ sở dữ liệu chậm, điều đó có nghĩa là truy vấn của chúng ta được thực thi thành công và trang web dễ bị tấn công bởi Blind SQL Injection

1‘ AND sleep(15)#

Mysqli_real_escape_string trong wp

Có một chức năng tốn thời gian khác “BENCHMARK” có thể được sử dụng để trì hoãn phản hồi của cơ sở dữ liệu

1‘ AND BENCHMARK(10000000,SHA1(1337))#

Dòng trên sẽ thực thi hàm SHA1() 10000000 lần trong cơ sở dữ liệu, điều này sẽ làm tăng thêm độ trễ đáng kể trong phản hồi

Mysqli_real_escape_string trong wp

Blind SQL dựa trên thời gian trong các cơ sở dữ liệu khác

MSSQL. ID=1;chờ độ trễ '0. 0. 10’–

ORACLE SQL. AND [RANDNUM]=DBMS_PIPE. RECEIVE_MESSAGE(‘[RANDSTR]’,[SLEEPTIME])

PostgreSQL. AND [RANDNUM]=(CHỌN [RANDNUM] TỪ PG_SLEEP([SLEEPTIME]))

SQLite. AND [RANDNUM]=LIKE(‘ABCDEFG’,UPPER(HEX(RANDOMBLOB([SLEPTIME]00000000/2))))

Trích xuất thông tin cơ sở dữ liệu

Bước đầu tiên của việc trích xuất cơ sở dữ liệu là xác định số cột trong cơ sở dữ liệu. Sau đó cố gắng tìm các cột dễ bị tổn thương để trích xuất thêm dữ liệu

Blind SQL Injection hoạt động khác với các số cột khác nhau trong truy vấn "theo thứ tự"

1‘ đặt hàng theo 1#

Mysqli_real_escape_string trong wp

Mệnh đề trên đúng vì trong một cơ sở dữ liệu luôn tồn tại ít nhất 1 cột. Bây giờ hãy thử với một số lượng rất lớn

1‘ đặt hàng theo 10000#

Mysqli_real_escape_string trong wp

Phản hồi cơ sở dữ liệu khác với phản hồi trước đó. Bây giờ hãy thử với 2 cột

Mysqli_real_escape_string trong wp

Câu lệnh đã hoạt động, điều đó có nghĩa là cơ sở dữ liệu có 2 cột trở lên. Bây giờ hãy thử với 3 cột

1‘ đặt hàng theo 3#

Mysqli_real_escape_string trong wp

Cơ sở dữ liệu không gửi bất kỳ phản hồi nào, điều đó có nghĩa là cơ sở dữ liệu chỉ có 2 cột. Bây giờ chúng tôi sẽ cố gắng kết xuất danh sách các bảng trong cơ sở dữ liệu, chúng tôi sẽ sử dụng truy vấn sau cho điều đó

1' union all select 1,group _ concat(table _name) from information_schema.
bảng trong đó bảng _ schema=database()#

Mysqli_real_escape_string trong wp

Có hai bảng trong cơ sở dữ liệu phụ trợ “sổ lưu bút & người dùng”. Bảng “người dùng” có thể chứa tên người dùng và mật khẩu. Để trích xuất tên cột từ bảng, hãy chèn truy vấn sau

1' hợp tất cả chọn 1,nhóm _ concat(cột _name) from information_schema.
cột có bảng _ schema=database()#

Mysqli_real_escape_string trong wp

Bây giờ chúng tôi đã trích xuất tên cột, điều này bao gồm cột người dùng và mật khẩu. Các cột này lưu trữ tên người dùng và mật khẩu của khách hàng

Bây giờ chúng tôi sẽ cố gắng trích xuất dữ liệu bằng truy vấn sau

1' liên kết tất cả chọn 1,nhóm _ concat(người dùng,mật khẩu) từ người dùng#

Mysqli_real_escape_string trong wp

Và đó là cách bạn có thể khai thác Blind SQL Injection mà không cần dựa vào lỗi. Mật khẩu đầu ra được băm hầu hết thời gian, có thể được giải mã bằng các công cụ như John The Ripper hoặc Hashcat

Phần kết luận

Blind SQL Injection là loại SQLi không hiển thị lỗi cơ sở dữ liệu hoặc phản hồi bằng một thông báo rất chung chung. Đó là lý do tại sao rất khó xác định lỗ hổng Blind SQL Injection trong một trang web. Sau khi được phát hiện, bạn có thể khai thác nó dễ dàng bằng quy trình thủ công hoặc tự động bằng SQLmap

Mysqli_real_escape_string trong wp

IDC ONET

ONET IDC thành lập vào năm 2012, là công ty chuyên nghiệp tại Việt Nam trong lĩnh vực cung cấp dịch vụ Hosting, VPS, máy chủ vật lý, dịch vụ Tường lửa Anti DDoS, SSL… Với 10 năm xây dựng và phát triển, ứng dụng