2011-10-12 31 views
7

Trước tiên, tôi không cố gắng hack hoặc làm bất cứ điều gì bất hợp pháp. Nghĩ rằng tôi cho các bạn biết. Tôi có một khách hàng muốn tôi làm một số sửa đổi trên hệ thống của mình, khi tôi nhìn vào nó, tôi nhận thấy rằng NOTHING đã bị trốn thoát. Tôi không nói đùa, không có gì đang được trốn thoát. Tôi giải thích với anh ta rằng nó không an toàn để có một hệ thống như thế. Sau đó anh ta nói với tôi rằng anh ta có hệ thống của mình như thế này trong vài năm và không có gì xảy ra cả. Tôi cần phải cho anh ta thấy rằng hệ thống của anh ta không an toàn, nhưng tôi thực sự không biết thực hiện tiêm sql. Dưới đây là một số truy vấn sử dụng $ _GET và không được thoát.cần hỗ trợ với tiêm sql

SELECT *,DATE_FORMAT(joined,'%M %d, %Y') as \"Joined\" FROM `members` WHERE `name` LIKE '".$ltr."%' ORDER BY points DESC LIMIT $page,50 

Dưới đây là một số khác:

SELECT * FROM groups WHERE id=$thisladder[grid] 

Điều duy nhất mà tôi thấy rằng "có thể" làm sạch $ _GET là chức năng này:

if (!ini_get('register_globals')) { 
    $superglobals = array($_SERVER, $_ENV, 
     $_FILES, $_COOKIE, $_POST, $_GET); 
    if (isset($_SESSION)) { 
     array_unshift($superglobals, $_SESSION); 
    } 
    foreach ($superglobals as $superglobal) { 
     extract($superglobal, EXTR_SKIP); 
    } 
} 

Có thể là các chức năng trên có thể được khử trùng các biến. Và có, hệ thống cũng sử dụng đăng ký globals, đó cũng là xấu.

Tôi cũng đã sao lưu, chỉ trong trường hợp.

+2

Bạn có muốn biết cách ngăn chặn việc tiêm SQL hoặc chứng minh cho khách hàng của mình rằng nó không an toàn không? – skyuzo

+3

Ôi trời, không chỉ họ không thoát khỏi bất cứ điều gì, nhưng họ * rõ ràng * mô phỏng chức năng 'register_globals' nếu nó bị vô hiệu hóa! Đây là lần đầu tiên! – rid

+0

Tôi không biết làm thế nào để chứng minh điều đó. Nhưng tôi biết rằng mysql_real_escape và báo cáo chuẩn bị là con đường để đi. – user962449

Trả lời

6

Không thể nói tốt hơn http://xkcd.com/327/.

Nhưng sau đó một lần nữa, như Marc B nói, quên SQL injection, register_globals là nhiều, tồi tệ hơn nhiều. Không bao giờ nghĩ rằng tôi thực sự nhìn thấy nó mô phỏng, chỉ trong trường hợp nó tắt.

+0

Thiên Chúa chúng tôi là những nerds như vậy, không thể ngừng cười vào những hình ảnh lol. Vì vậy, globals là tồi tệ nhất so với tiêm? o_0 – user962449

+0

@ user962449, với 'register_globals', bạn chỉ có thể thay thế giá trị của bất kỳ biến nào bằng cách đơn giản bao gồm nó trong yêu cầu GET của bạn, ví dụ. – rid

5

Một số điều thú vị để hiển thị 'người bạn' của bạn như thế nào ngu ngốc mã của ông là:

http://example.com/badscript.php?_GET[]=ha+ha+I+pwned+your+GET+superglobal 
http://example.com/badscript.php?_SESSION[issuperuser]=1 

loại này điều là CHÍNH XÁC tại sao register_globals là một ý tưởng hoàn toàn F'ingly khờ dại như vậy, và (sau FAR quá dài) cuối cùng đã được đặt thành mặc định là TẮT.

Quên SQL injection - đoạn mã ngu ngốc đó cho phép tiêm biến PHP từ xa.

+0

Điều này giống như mẹ của tất cả các tiêm ... –

+0

@Marc B: Tôi cầu xin sự khác biệt, mã đó sẽ không hoạt động cho dù có đăng ký hình cầu hay không. '$ _SESSION' có thể bị ghi đè nếu nó bị tắt và phiên chưa được khởi tạo, nhưng' session_start' có thể đã xóa nó. Bạn có thể muốn tham khảo một phiên bản PHP cho đến khi điều đó là có thể khi đăng ký globals được đặt thành bật. – hakre

+0

@hakre: đủ chính xác, phiên một phụ thuộc hoàn toàn vào khi session_start được gọi là tương đối so với các hình cầu giả đăng ký. Chỉ cần sử dụng điều này để chứng minh cách BAD register_globals có thể có khả năng như thế nào. –

1

nếu mã đăng nhập nhìn một cái gì đó như thế này:

$query = 'SELECT id FROM users WHERE username=\''.$_POST['username'].'\' AND password=\''.$_POST[password].'\''; 
$result = mysql_query($query); 
etc, etc... 

thử gõ này vào các lĩnh vực đăng nhập

username = "whatever" 
password = "' OR 1" 

có ý nghĩa?

+0

Mật khẩu được băm. Vì vậy, tôi đoán kịch bản không phải là xấu:/ – user962449

+0

sau đó sử dụng "OR 1" cho tên người dùng thay thế. – dqhendricks

+0

Lưu ý, rằng tôi không wiz với tiêm sql. SO tôi chỉ cần gõ ''OR 1'? – user962449

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