1. Trang chủ
  2. » Công Nghệ Thông Tin

Hacker Professional Ebook part 277 pptx

6 89 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 89,69 KB

Nội dung

SELECT * FROM counts WHERE /* comments */ addresse=' 25 street of the roubys' yêu cầu sau sẽ được thực hiện: SELECT * FROM counts WHERE addresse=' 25 street of the roubys' Sự sử dụng các kí tự này trong injection sql ở đây, chủ yếu là để chúng ta tạo ra một phần không có ý thức của yêu cầu thực thi, để nhảy qua các điều kiện, nó hơi giống với phương pháp 'jump' trong cracking. (những điều nói đến ở đây có vẻ như ko thực tế lắm nhưng nó sẽ giúp bạn hiểu đc cái nguyên lý cốt lõi của vấn đề, đừng coi thường nó, đừng nóng vội) Trở lại ví dụ của chúng ta với sự sử dụng kiến thức mới trong đó: Để tới tài khoản của John, chỉ cần gõ giống như $login: John' # => thực hiện yêu cầu sau: SELECT uid FROM admins WHERE login=' John' # ' AND password = ' ' và như thế phần ' AND password ='' sẽ được bỏ qua. Sự tiêm nhiễm này có thể được sử dụng cho nhiều mục đích khác nhau. Tưởng tượng một ví dụ rằng có vài level của administration ( hãy gọi các trường của bảng 'admin' là 'admin_level' ) Trong trường hợp này một sự tiêm nhiễm sẽ cho biến login giá trị 'GOLD admin_level=1 # thể hiện trong yêu cầu sau: Select uid from admins where login=''GOLD admin_level=1# and password='' Một cách khác sử dụng sql để ghi một user/admin trong sql đó là sẽ không trực tiếp kiểm tra login và password trong một yêu cầu sql , nhưng lúc đầu cố gắng rút ra một mật khẩu gắn với một đăng nhập , với một dòng như sau: $req = "SELECT password FROM admins WHERE login='$login'"; Sau đó đoạn mã này sẽ kiểm tra nếu mật khẩu đã nhập vào là tốt sau đó sẽ rút ra bảng admins. Một lần nữa hệ thống này là không đáng tin bởi chức năng INTO OUTFILE của sql (hay INTO DUMPFILE). Một ví dụ: SELECT * FROM counts INTO OUTFILE '/complete/path/to/file.txt' mọi nội dung của bảng 'table' trong file /complete/path/to/file.txt sẽ được ghi. Do đó nếu với ví dụ của chúng ta một kẻ vào giá trị biến login: John'INTO DUMPFILE'/path/to/site.txt yêu cầu sau sẽ được thực hiện: SELECT password FROM admins WHERE login=' John' INTO DUMPFILE '/path/to/site/file.txt' vê mật khẩu của John sẽ được ghi vào file http://[địachỉ]/file.txt. Để có tất cả mật khẩu , một biểu thức sẽ phải được sử dụng luôn trả lại giá trị 'ok', ví dụ khi cho biến login giá trị : 'GOLD 1=1 INTO OUTFILE'/path/to/site/file.txt Tuy nhiên có vài điều kiện sử dụng INTO OUTFILE (hoặc INTO DUMPFILE) như sau: -Cần hiển thị đầy đủ đường dẫn của file trong đó có chứa kết quả -File đó phải chưa tồn tại (điều sẽ bị ngăn cản , ví dụ ngăn cản thay thế các file như /etc/passwd) -Phải có đặc quyền quản lí file Cũng có sự khác nhau giữa OUTFILE và DUMPFILE. Nếu một yêu cầu rút ra với cột nó sẽ rõ ràng bị chia thành với cột trong file với OUTFILE , với DUMPFILE thì sẽ chỉ có một cột duy nhất. Chú ý rằng file đã tạo ra sẽ có thể thực thi bởi mọi người (nobody). Tuỳ chọn INTO OUTFILE vẫn có thể đi xa hơn một chút nữa. Hãy tưởng tượng rằng chúng ta có một tài khoản tên là 'unix' trên site có kiểu yêu cầu này. Do đó chúng ta có thể thay đổi thậm chí cả password (??!!) . Nếu một người đặt một mã php ở đó,và anh ta gõ vào trong form này giống như $login: unix'INTO OUTFILE'/path/to/site/file.php **** Sẽ có một chú ý nhắc nhở chúng ta về mã php trong file php sẽ có thể thực hiện sau đó. Tôi chỉ ra những điều đó giống như các ví dụ khác của tôi, chúng chỉ là những ví dụ, do đó có những cái khác cũng có thể được sử dụng (ở đây có thể là mã trong một lời nhắn,trong các profile ). Một kẻ cũng có thể sử dụng hàm này để làm ngập đĩa cứng, nhưng điều đó có thể sẽ chiếm nhiều thời gian. Injection sql trong yêu cầu dạng SELECT cũng làm chúng ta có thể nghiên cứu một chút ít chuyên môn, trong các cái khác nhờ vào 'LIKE'. Tôi sẽ bắt đầu lại, để giải thích điểm này, yêu cầu bắt đầu $req = "SELECT uid FROM members WHERE login='$login' AND password='$pass'"; nhưng tôi nói lại một lần nữa là tôi có thể làm tất cả với các ví dụ khác, yêu cầu hiện trên sự giới thiệu (bạn phải hoàn toàn hiểu sâu phần này nó không phải là ví dụ trong trường hợp trước). Một yêu cầu sql thuần tuý (không có injection): SELECT * FROM counts WHERE msg LIKE '%hop' tất cả các phần tử từ bảng 'table' sẽ được rút ra, nơi trường 'msg' kết thúc bởi 'hop'. SELECT * FROM counts WHERE msg LIKE 'hop%' mọi phần tử trong bảng 'table' sẽ được rút ra, nơi trường 'msg' bắt đầu bởi 'hop'. SELECT * FROM counts WHERE msg LIKE '%hop%' mọi phần tử trong bảng 'table' sẽ được rút ra, nơi mà trường 'msg' chứa 'hop'. SELECT * FROM counts WHERE msg LIKE 'h%p' mọi phần tử từ bảng 'table' sẽ được rút ra, nơi trường 'msg' bắt đầu với 'h' và kết thúc với share 'p'. SELECT * FROM counts WHERE msg LIKE 'h_p' mọi phần tử từ bảng 'table' sẽ được rút ra, nơi trường 'msg' bắt đầu với 'h' và kết thúc với share 'p', và chỉ chứa một kí tự tại điểm của dấu gạch _ Chúng ta hãy chuyển qua injection."LIKE" có thể cho phép chúng ta 'rough forcer' thông tin về cơ sở dữ liệu. Ví dụ, nếu chúng ta muốn biết nếu từ đầu tiên của mật khẩu của user Bob, có thể cho giá trị tương tự cho biến login:Bob' AND password LIKE 'a%' # với yêu cầu sau: SELECT uid FROM members WHERE login='Bob' AND password LIKE 'a%' # ' AND password = ' ' Nếu kết quả trả lại trong tài khoản của Bob ,điều đó có nghĩa là mật khẩu bắt đầu bằng chữ A, nếu không ít nhất ta cũng biết được rằng chữ bắt đầu không phải là A và thử lại với các chữ khác cho tới khi nó được tìm ra , sau đó bắt đầu với các từ thứ 2,thứ 3, vv Injection SQL đôi khi dễ dàng nếu nó được áp dụng 2 lần, dựa vào sự sử dụng SQL. Bởi vì cơ sở SQL injection bắt đầu với các hiểu biết về ngôn ngữ SQL. Ví dụ, một khó khăn phát sinh nếu muốn thực hiện sự 'tấn công thô bạo này" (rough force) đó là khi không biết độ dài của mật khẩu. Do đó có thể là đã tới kết thúc của mật khẩu mà chương trình vẫn tiếp tục tìm kiếm nó. Giải pháp đặt ra ở đây là kiểm tra trước với hêm LENGTH(). Nếu biến login giá trị tương tự $login:Bob' AND LENGTH(password)=6 #,sẽ thu được yêu cầu sau : SELECT uid FROM members WHERE login='Bob' AND LENGTH(password)=6 # ' AND password = ' ' Nếu mật khẩu của Bob dài 6 kê tự nó sẽ được tìm thấy trong tài khoản của anh ta. Làm lại yêu cầu trên : $req = "SELECT email, website FROM members WHERE name LIKE ' %$search% ' ORDER BY name"; để nói một chút về ORDER BY. Tính hữu ích này không có gì đặc biệt nhưng rất cần nói về nó. Yêu cầu trên có thể rút thông tin từ các user mà một cái giả của họ chứa đựng các giá trị của #. Tôi thay đổi một chút yêu cầu của việc bắt đầu để không thể sử dụng INTO OUTFILE hiệu quả. Hãy thử đặt một giá trị tương tự tại biến search $search: % ' ORDER BY uid # như yêu cầu: SELECT * FROM members WHERE name LIKE ' % % ' ORDER BY uid #% ' ORDER BY name và gửi chúng ta thông báo về tất cả các thành viên đã được sắp xếp thứ tự. Điều này có thể có ích để xác định người quản trị , người chắc chắn đã đăng kí đầu tiên. Thỉnh thoảng cũng có thể sắp xếp họ bởi cấp bậc quản lý (nếu như có một trường user_level chuẩn), theo mật khẩu, bằng cách gán cho biến search giá trị : % ' ORDER BY password #,bằng độ dài của các khóa chính : % ' ORDER BY LENGTH(password) # , vv Thú vị hơn là làm các sự so sánh , i.e. trong trường hợp này, nếu được chúng ta thậm chí có thể đăng kí chính chúng ta như một thành viên, và biết mật khẩu của chúng ta, một thứ mà có thể so sánh nó dựa vào vị trí của nó với mật khẩu của những người khác. Đơn giản hơn, yêu cầu sau thuộc loại như vầy:

Ngày đăng: 04/07/2014, 12:20