Người hướng dẫn: Hãy nói về cách chúng ta có
thể ngăn chặn những lỗ hổng này ngay bây giờ.
Điều đầu tiên là rất nhiều lỗ hổng này tồn
tại do chức năng mà chúng cung cấp.
Ví dụ, vấn đề tải lên tệp mà chúng tôi gặp phải,
nó cho phép người dùng tải lên bất kỳ phần mở rộng tệp nào,
bất kỳ loại tệp nào, điều này sẽ không xảy ra, không
có cách nào để người dùng tải lên bất kỳ tệp
nào họ muốn.
Có thể nếu bạn muốn họ tải ảnh lên, thì hãy
đảm bảo rằng họ đang tải ảnh lên, hãy
kiểm tra các loại tệp.
Nếu bạn đang mong đợi họ tải lên một bài hát, tệp MP #, hãy
đảm bảo rằng đó là tệp phương tiện, không phải
là PHP hoặc mã thực thi.
Thông thường, bạn không bao giờ nên cho
phép người dùng tải lên bất kỳ tệp thực thi nào.
Bộ lọc có thể được sử dụng để kiểm tra xem, để kiểm
tra phần mở rộng và đảm bảo rằng
tệp đang được tải lên là JPEG hay bất cứ thứ gì.
Nhưng đó không phải
là cách hay, cách tốt nhất là kiểm tra loại tệp
và đảm bảo rằng loại tệp là ảnh, hoặc là tệp phương tiện, thay
vì kiểm tra phần mở rộng vì điều
đó cũng có thể bị bỏ qua.
Loại lỗ hổng thứ hai mà chúng tôi
đã xem xét là lỗ hổng thực thi mã.
Trong những lần khai thác này, chúng tôi có thể chạy bất kỳ mã nào chúng
tôi muốn trên máy tính mục tiêu.
Một lần nữa nên tránh chức năng này,
bạn nên tránh cho phép người dùng chạy bất kỳ loại mã nào
trên máy chủ của bạn.
Cố gắng tránh tất cả các chức
năng này như var pass through
và tất cả các chức năng này cho phép người
dùng chạy mã hệ điều hành trên máy chủ.
Nếu bạn hoàn toàn phải sử dụng một cái gì đó giống
như nó, thì hãy đảm bảo rằng bạn phân tích đầu vào trước khi thực thi nó.
Ví dụ, trong ví dụ, chúng ta đã thấy nơi mã đang
thực hiện ping và nó sẽ ping bất cứ thứ gì chúng ta đặt trong
hộp văn bản.
Vì vậy, tôi đặt ở đây / $ textbox chỉ để cho thấy rằng
đây là đầu vào mà chúng tôi đặt trong hộp văn bản.
Đây là những gì chương trình thực sự trông như
thế nào nếu nó trông quá phức tạp, hãy quên nó đi,
chúng ta chỉ đang nói về khái niệm ở đây.
Vì vậy, chúng ta sẽ nói về điều này ở đây.
Vì vậy, giả sử bạn đặt những gì chúng tôi đã làm
là chúng tôi đặt một IP bình thường,
sau đó chúng tôi đặt dấu chấm phẩy, và sau đó chúng tôi đặt một lệnh mà
chúng tôi muốn thực hiện vì vậy chúng tôi chỉ lấy ví dụ ls -la.
Vấn đề với điều này là ứng dụng web được sử dụng
để thực hiện theo cách của nó, sao chép nó và chạy nó ở đây.
Mà khi bạn thực hiện lệnh này, nó sẽ thực
hiện ping đầu tiên, sau đó sẽ thực hiện lệnh ls -la, đó là lệnh
mà chúng ta muốn.
Những gì bạn cần làm là, ví dụ, nếu bạn phải làm điều đó, những
gì tôi khuyên là bạn chỉ cần không sử dụng các chức năng này.
Nếu bạn phải sử dụng một hàm như thế này, thì những
gì bạn nên làm là kiểm tra xem đầu vào có phải là những gì bạn
đang mong đợi hay
không, ví dụ: bạn mong đợi một địa chỉ IP
và không có gì khác, vì vậy bạn có thể sử dụng
regex để đảm bảo, bây giờ tôi Tôi sẽ không nói
về regex hay regex là gì, về
cơ bản regex là một quy tắc đảm
bảo rằng đầu vào sẽ có định dạng
sau.
Vì vậy, nó cần một chữ số, chữ
số dấu chấm chữ số dấu chấm chữ số dấu chấm chữ số mà
nếu tôi đặt bất cứ điều gì khác,
thì ứng dụng web sẽ từ chối nó.
Bạn cũng có thể đảm bảo rằng không có
dấu chấm phẩy và không có khoảng
trắng, vì vậy mọi thứ đều đến như một thứ
và sau đó nó được thực thi.
Một lần nữa, đây là một cách để làm cho nó an toàn hơn
nhưng điều tốt nhất là tránh các chức năng này.
Loại lỗ hổng thứ ba mà chúng
tôi đã xem xét là bao gồm tệp và chúng tôi
đã xem xét hai loại.
Bao gồm tệp cục bộ cho
phép chúng tôi bao gồm bất kỳ tệp nào trên hệ
thống và sau đó đọc các tệp
sẽ gây ra lỗ hổng tiết lộ tệp và sau đó bạn có thể đọc
bất kỳ tệp nào trên máy chủ và sau đó chúng
tôi xem xét bao gồm tệp từ xa đó là rất
nguy hiểm cho phép chúng
tôi bao gồm bất kỳ tệp nào từ bất kỳ máy chủ web nào
để chúng tôi có thể bao gồm các trình bao PHP và sau đó nhận
kết nối từ máy tính mục tiêu.
Để ngăn chặn những điều này, trước
hết, hãy đảm bảo rằng bạn đã ngăn chặn việc đưa vào tệp từ xa.
Vì vậy, đề phòng trường hợp xảy
ra sự cố, mọi người không thể bao gồm các tệp từ bên ngoài máy chủ
của bạn và bạn có thể làm điều đó giống
như cách chúng tôi đã bật nó
bằng PHP ini bằng cách tắt allow_url_fopen
và allow_url-include.
Và nếu chúng ta truy cập vào Metasploitable
ở đây, tôi sẽ chỉ cho bạn rất nhanh,
vì vậy nếu chúng ta sử dụng sudo nano là trình soạn thảo văn bản / etc / PHP
/ cgi / php. ini, cùng một tệp mà chúng
tôi đã sử dụng, đây
là tệp cho cài đặt PHP.
Nếu bạn mở tệp đó và
bây giờ tôi sẽ thực hiện Control
+ W và tìm allow_url.
Và bạn muốn đảm bảo rằng allow_url_fopen
được đặt thành Tắt và allow_url_include
cũng được đặt thành Tắt.
Control + X + Y và enter và điều đó
sẽ lưu nó cho bạn.
Cách khác để ngăn chặn những
khai thác này là sử dụng bao gồm tệp tĩnh,
vì vậy thay vì sử dụng bao gồm tệp động
mà chúng ta đã thấy, bạn có thể viết mã cố định các tệp
mà bạn muốn đưa vào mã và không
lấy chúng bằng GET hoặc POST.
Ví dụ, những gì đang xảy ra trong các ví dụ mà chúng tôi thấy
trong các ví dụ về lỗ hổng bảo mật là chúng tôi có một
trang được gọi là trang hoặc chỉ mục. php.
Và sau đó là chỉ số này. php nhận một tham số được gọi là trang
và sau đó nó lấy một trang khác,
ví dụ, tin tức. php.
Và nó bao gồm tin tức này. php trong mã.
Vậy mã trông như thế nào?
Trong mã PHP, bạn sẽ thấy một cái gì đó giống như bao gồm.
Vì vậy, về cơ bản điều này sẽ
làm và trông giống như thế này, tôi tin rằng, điều
này làm được, nó bao gồm bất cứ
điều gì xuất hiện sau tham số trang.
Vì vậy, mã sẽ tự động lấy bất cứ thứ gì có sau tham số trang
và đưa nó vào trang hiện tại để nó sẽ nằm trong
chỉ mục. trang php.
Được rồi, điều này rất
tệ vì ngay cả khi nó không GET, đôi
khi mọi người sử dụng POST
và trong POST, bạn sẽ không
thấy điều này nên nó sẽ được đăng nhưng bạn có thể
sử dụng proxy như Burp proxy
và điều này sẽ giống như vậy.
bạn có thể sửa đổi nó và làm cho
nó bao gồm bất cứ thứ gì bạn muốn và sau đó nó được
hiển thị trên trang.
Những gì chúng tôi thực sự muốn làm là chúng tôi muốn người dùng không thể
thao tác với những gì sẽ được đưa vào, vì vậy nếu bạn muốn
đưa vào một trang có tên là tin tức. php, chỉ đưa nó vào bên
trong mà không cho phép
người dùng thay đổi
nó.
Tôi biết bạn sẽ lập trình mã
của mình để nó trông như thế này nhưng người dùng, chúng tôi
biết, chúng tôi đã thấy cách người dùng
có thể chơi với cái này và chỉ cần đưa
nó vào bất cứ thứ gì họ muốn.
Cách tốt nhất để làm điều đó là chỉ
cần đưa nó vào trang. php để mã của
bạn không sử dụng bất kỳ biến nào.
Nó khó được mã hóa, nó có thể làm cho mã của bạn dài
hơn nhưng nó an toàn hơn nhiều.