2012-04-23 20 views
15

Tôi đã đọc về tiêm sql và tôi hiểu cách nó hoạt động nếu có một biểu mẫu mà người dùng có thể nhập tên người dùng và thông tin đăng nhập của mình. Những gì tôi không nhận được là làm thế nào các trang web mà không có một trang đăng nhập có thể dễ bị tấn công sql.Kiểm tra xem một trang web có dễ bị Sql Injection

http://thecybersaviours.com/how-to-find-out-if-a-website-is-vulnerable-to-sql-injection

Nó nói chỉ thêm một 'hoặc ''=' để kiểm tra nó. Tôi không hiểu làm thế nào điều này giúp để xác định xem một lỗi tồn tại. Truy vấn đang được xây dựng ở đâu cả.

+2

BẤT CỨ hộp văn bản hoặc đầu vào trên bất kỳ trang nào mà người dùng có thể nhập và nhập dữ liệu có thể có SQL injection nếu mục nhập của người dùng được chuyển vào lệnh SQL. – DOK

+0

có thể trùng lặp của [SQL injection là gì?] (Http://stackoverflow.com/questions/601300/what-is-sql-injection) – CanSpice

Trả lời

16

SQL injection là nỗ lực phát hành các lệnh SQL tới cơ sở dữ liệu thông qua giao diện trang web, để lấy thông tin khác. Cụ thể, thông tin này được lưu trữ thông tin cơ sở dữ liệu như tên người dùng và mật khẩu.

Quy tắc đầu tiên về việc bảo vệ bất kỳ tập lệnh hoặc trang nào đính kèm vào một cá thể cơ sở dữ liệu là Không tin tưởng người dùng nhập.

Ví dụ của bạn đang cố kết thúc chuỗi bị bỏ qua trong câu lệnh SQL. Để hiểu điều này, trước tiên bạn cần phải understand SQL statements. Trong ví dụ của bạn thêm một ' đến một paramater, 'tiêm' của bạn đang hy vọng cho các loại vật liệu làm tuyên bố:

chọn tên người dùng, mật khẩu từ những người dùng ĐÂU username = '$ username'

Bằng phụ thêm một ' để tuyên bố rằng, sau đó bạn có thể thêm paramaters SQL bổ sung hoặc truy vấn .: ' OR username --

chọn tên người dùng, mật khẩu của người dùng TỪ ĐÂU username = '' OR tên người dùng - '$ username

Điều đó là loại tiêm (một loại; Truy vấn định hình lại). Đầu vào của người dùng trở thành một câu lệnh được tiêm vào câu lệnh SQL được viết sẵn.

Nói chung có ba loại phương pháp SQL injection:

  • Query định hình lại hoặc chuyển hướng (trên)
  • nhắn
  • Lỗi dựa (Không như người dùng/mật khẩu)
  • Blind Tiêm

Đọc trên SQL Injection, How to test for vulnerabilities, understanding and overcoming SQL injection và câu hỏi này (và các câu hỏi liên quan) trên StackOverflow about avoiding injections.

Edit:

Theo như thử nghiệm trang web của bạn cho SQL injection, hiểu nó nhận được rất nhiều phức tạp hơn chỉ 'nối thêm một biểu tượng'. Nếu trang web của bạn là quan trọng, và bạn (hoặc công ty của bạn) có thể đủ tiền mua nó, hãy thuê một người kiểm tra bút chuyên nghiệp. Nếu không, this great exaxmple/proof có thể cho bạn thấy một số kỹ thuật phổ biến mà người ta có thể sử dụng để thực hiện thử nghiệm tiêm.Ngoài ra còn có SQLMap có thể tự động hóa một số thử nghiệm cho SQL Injection và cơ sở dữ liệu tiếp quản các tình huống.

2

Bất kỳ đầu vào nào từ khách hàng đều là những cách dễ bị tổn thương. Bao gồm tất cả các biểu mẫu và chuỗi truy vấn. Điều này bao gồm tất cả các động từ HTTP.

Có giải pháp của bên thứ 3 có thể bò một ứng dụng và phát hiện khi tiêm có thể xảy ra.

0

Bài kiểm tra phải được thực hiện trên một trang mà truy vấn một cơ sở dữ liệu để có thường đó là một trang đăng nhập bởi vì đó là trang đó có thể làm tổn hại nhất nhưng có thể là một trang không an toàn là tốt.

Thông thường bạn sẽ có truy vấn cơ sở dữ liệu của mình sau đăng nhập an toàn nhưng nếu bạn chỉ có một danh sách các mục hoặc thứ gì đó mà bạn không quan tâm nếu thế giới nhìn thấy tin tặc có thể thêm một số lần chèn sql vào cuối chuỗi truy vấn.

Mấu chốt với SQL Injection là người làm việc tiêm sẽ phải biết rằng bạn truy vấn cơ sở dữ liệu vì vậy nếu bạn không truy vấn một cơ sở dữ liệu thì không có sql tiêm có thể được thực hiện. Nếu biểu mẫu của bạn được gửi đến cơ sở dữ liệu thì có thể họ có thể SQL Injection đó. Luôn luôn thực hành tốt để sử dụng các thủ tục được lưu trữ để chọn/chèn/cập nhật/xóa hoặc đảm bảo bạn chuẩn bị hoặc thoát ra tất cả các câu lệnh sẽ được nhấn vào cơ sở dữ liệu.

1

Trang đăng nhập không phải là phần duy nhất của trang web dựa trên cơ sở dữ liệu tương tác với cơ sở dữ liệu.

Bất kỳ người dùng có thể chỉnh sửa đầu vào được sử dụng để xây dựng một truy vấn cơ sở dữ liệu là một điểm vào tiềm năng cho một cuộc tấn công SQL injection. Kẻ tấn công có thể không nhất thiết phải đăng nhập vào trang web với tư cách là quản trị viên thông qua cuộc tấn công này, nhưng có thể làm những việc khác. Họ có thể thay đổi dữ liệu, thay đổi cài đặt máy chủ, v.v. tùy thuộc vào tính chất tương tác của ứng dụng với cơ sở dữ liệu.

Gắn thêm ' vào đầu vào thường là một thử nghiệm khá tốt để xem liệu lỗi đó có tạo ra lỗi hoặc tạo ra hành vi không mong muốn trên trang web hay không. Đó là dấu hiệu cho biết đầu vào của người dùng đang được sử dụng để tạo truy vấn thô và nhà phát triển không mong đợi một báo giá duy nhất, thay đổi cấu trúc truy vấn.

Hãy ghi nhớ rằng một trang có thể được an toàn chống SQL injection trong khi người khác có thể không. Ví dụ, trang đăng nhập có thể được tăng cường chống lại các cuộc tấn công như vậy. Nhưng một trang khác ở nơi khác trong trang web có thể mở rộng. Vì vậy, ví dụ, nếu một người muốn đăng nhập như một quản trị viên thì người ta có thể sử dụng SQL injection trên trang kia để thay đổi mật khẩu quản trị. Sau đó quay trở lại trang đăng nhập hoàn toàn không có SQL và đăng nhập với tư cách quản trị viên.

0

Cách dễ nhất để tự bảo vệ mình là sử dụng các thủ tục được lưu trữ thay vì các câu lệnh SQL nội tuyến.

Sau đó sử dụng "đặc quyền tối thiểu" cho phép và chỉ cho phép truy cập vào các thủ tục lưu trữ và không trực tiếp đến bảng.

+0

** Thận trọng: ** Hành vi sử dụng các thủ tục được lưu trữ không phải là * của chính nó * một bảo vệ chống lại SQL injection. Người ta vẫn cần phải hiểu những gì người ta đang làm. http://publicvoidlife.blogspot.com/2012/01/stored-procedures-and-sql-injection.html – David

+0

Bạn đúng. Sử dụng các thủ tục lưu sẵn có thể bảo vệ bạn khỏi việc tiêm SQL khi người viết chúng, biết cách sử dụng chúng. Nhưng chúng tôi có thể nói tương tự cho mọi thứ khác. SQL máy chủ bảo mật hoạt động, khi DBA biết những gì ông đang làm. Hoặc làm thế nào về một nhà phát triển hiển thị chuỗi kết nối trong một thông báo lỗi, vì vậy danh sách đi vào và một. Tôi đoán những gì tôi đang cố gắng để nói, đó là lớp tối thiểu của kinh nghiệm hoặc tài năng dự kiến. –

+0

Thật vậy. Tôi chỉ muốn tránh hiểu sai từ người dùng mới bắt đầu (chẳng hạn như OP), những người có xu hướng chạy trốn với những tác động sai trái của một tuyên bố. Làm cho thế giới trở thành một nơi tốt đẹp hơn và tất cả những điều đó :) – David

3

Tiêm SQL có thể được thực hiện trên bất kỳ đầu vào nào mà người dùng có thể ảnh hưởng không được thoát đúng cách trước khi được sử dụng trong truy vấn.

Một ví dụ sẽ là một biến get như thế này:

http//www.example.com/user.php?userid=5 

Bây giờ, nếu các mã PHP kèm theo đi một cái gì đó như thế này:

$query = "SELECT username, password FROM users WHERE userid=" . $_GET['userid']; 
// ... 

Bạn có thể dễ dàng sử dụng SQL injection ở đây quá:

http//www.example.com/user.php?userid=5 AND 1=2 UNION SELECT password,username FROM users WHERE usertype='admin' 

(tất nhiên, không gian sẽ phải được thay thế bằng %20, nhưng điều này dễ đọc hơn. Ngoài ra, đây chỉ là một ví dụ làm cho một số giả định hơn, nhưng ý tưởng phải rõ ràng.)

Các vấn đề liên quan