Trở thành CODE select count(*) from users where userName='john'' and userPass=''' or 1=1 ' Và câu SQL trên trở nên vô nghĩa. * Cấm những từ "nhạy cảm": Thông qua 1 số ví dụ trên , chúng ta dễ dàng nhận ra những từ nhạy cảm của SQL là ;, , select, insert và xp_ . Bằng cách tạo ra 1 hàm để loại bỏ những từ trên: CODE <% function killChars(strWords) dim badChars dim newChars badChars = array("select", "drop", ";", " ", "insert", "delete", "xp_") newChars = strWords for i = 0 to uBound(badChars) newChars = replace(newChars, badChars(i), "") next killChars = newChars end function %> Sử dụng kết hợp giữa stripQuotes và killChars để loại bỏ những từ "nhạy cảm" 1 cách triệt để , hãy xem nếu câu SQL Injection có dạng : CODE select prodName from products where id=1; xp_cmdshell 'format c: /q /yes '; drop database myDB; Sẽ trở thành: CODE prodName from products where id=1 cmdshell ''format c: /q /yes '' database myDB Và hoàn toàn vô nghĩa. * Giới hạn những gì họ nói: Bằng cách giới hạn những Textbox và input càng ngắn càng tốt , bạn sẽ giảm thiểu nguy cơ tối đa bị tấn công bằng Injection. Ngoài ra phải kiểm tra những input có dạng số (VD như Product=1) bằng hàm IsNumeric() Kết luận: Những ví dụ trên này chỉ giúp bạn hình dung về SQL Injection và suy nghĩ như Hackers. Thật không thể nào bảo đảm được rằng có 1 cách nào đó có thể chống lại lỗi này và tự bạn phải liên tưởng ra các tình huống cụ thể để bảo vệ server của bạn. Mặc dù trên đây chúng ta chỉ đưa ra ví dụ với Mircosoft SQL Server , nhưng lỗi SQL Injection xuất hiện trong tất cả các phiên bản của SQL như MySQL , Oracle và không thể sửa chữa bởi nhà cung cấp vì đó là lỗi sơ xuất của người lập trình web. Những kiến thức, ví dụ trên đây chỉ nhằm mục đích học tập, bạn không được sử dụng chúng để phá hoại. Chúng tôi không chịu trách nhiệm về bất cứ hành vi nào do người đọc bài viết này gây ra. hvaonline.net Kỹ Thuật, tư duy khai thác SQL Injec trong Forum (bài 1) Chào các bạn! Hôm nay chúng ta sẽ nghiên cứu về cách thức khai thác lỗi SQL inject trong Forum nhé! Việc hack forum dính SQl inject là cũng cơ bản khá giống việc hack SQL inject trong các SHOP,WEB mà chúng ta đã hack thôi! kiến thức để tìm hiểu thì bạn chỉ cần biết một ít câu lệnh SQL và thông thạo việc sử dụng ,cài đặt, quản lý Forum là ok! Hò! Bắt đầu nào: Việc tìm ra một Site dính SQL thì chúng ta có thể sử dụng BUG được puplic trên các diendan về hacking ! còn khi mà người ta đã cho mình Code Exploitx rồi thì chẳng còn gì để nói! nhưng nếu người ta không public thì chỉ còn cách tự tìm lấy thôi! Tôi sẽ trình bày cho bạn thật dễ hiểu và sẽ dùng DEMO để cho các bạn thực hành luôn! 1. chúng ta sẽ thực hành với lỗi Mod UOCNGUYEN : Trong Code Uocnguyen của nó! thì có đoạn: Trích: function showwish(){ global $DB, $ibforums, $std; $wish = $ibforums->input['id']; $DB->query( "SELECT * FROM ibf_wish_main WHERE ID LIKE {$wish} LIMIT 1"); đoạn code bị lỗi là: Trích: $wish = $ibforums->input['id']; vì giá trị id được input vào không được kiểm tra là dạng number hay char nên nó bị dính lỗi SQl inject. link bị lỗi của nó: http://72.36.192.69/~phucducc/demo/uocnguy wwish&id=1' bạn nhập user/pass: demo / demo vào để xem ! xuất hiện thông báo lỗi: Trích: mySQL query error: SELECT * FROM ibf_wish_main WHERE ID LIKE 1' LIMIT 1 mySQL error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 mySQL error code: Date: Wednesday 22nd of March 2006 02:51:09 AM hò! Chúng ta chú ý đến cái đoạn này trong thông báo lỗi : Trích: SELECT * FROM ibf_wish_main WHERE ID LIKE 1' LIMIT 1 đây là câu lệnh truy vấn mà sử dụng để lấy các thông tin về phần uocnguyen . do ID không được kiểm soát nên khi thêm dấu phẩy vào thì nó báo lỗi! bây giờ chúng ta sẽ đi nghiên cứu cách để lấy các dữ liệu về mật khẩu của admin : Nếu bạn đọc được SQL thì sẽ hiểu là dấu * trên là chỉ nó lựa chọn truy vấn mọi colum có trong table ibf_wish_main ! vậy bây giờ ta sẽ lợi dụng lỗi SQL injec để truy vấn các thông tin cần thiết trong table ibf_members (là nới chứa các thông tin về MEM) để bắt đầu hack thì chúng ta phải vô hiệu hóa câu truy vấn của nó! nghĩa là làm cho câu lệnh truy vấn trên của nó không trả về giá trị gì cả! và đó là lý do mà khi các bạn đọc các code exploixt của người khác thì các bạn thấy có mấy dấu là lạ sau link lỗi của nó! chúng ta có các ký tự thường hay dùng để vô hiệu hóa câu lệnh truy vấn của Victim : /* hoặc ) hoặc )/ hoặc ); hoặc là đưa giá trị input của nó thành giá trị âm! nghĩa là nó đang là 1 thì mình cho về -1 ! có khi là vừa thêm giá trị âm vừa thêm các ký tự metal /* phía sau nũă! các bạn nghiên cứu thêm nhé! bây giờ! thì tôi dùng cách đưa giá trị input của nó thành âm để vô hiệu hóa câu lệnh truy vấn của nó: như sau: http://72.36.192.69/~phucducc/demo/uocnguy =showwish&id=-1 bạn thấy đấy! phần "uớc nguyện là " đã không còn giá trị gì! vì câu lệnh truy vấn của nó đã bị vô hiệu hóa! nên nó chẳng trả về giá trị gì nữa! và bây giờ chúng ta có thể thêm vào sau nó một câu lệnh truy vấn của chúng ta và nó sẽ Run ngay! hò! đến đây thì chúng ta bắt đầu sử dụng câu lệnh UNION ! nó có nhiệm vụ kết hợp 2 câu lệnh SELECT với nhau (tất nhiên là 2 câu lệnh SELECT phải có cùng các colum! ) tôi khuyên bạn chưa biết thì nên tìm đọc phần câu lệnh UNION đi! OK! bước quan trọng là đây: các bạn nhìn vào hình bên dưới: thì các bạn sẽ thấy là trogn table ibf_wish_main có 8 column! và vấn đề là cái MOD uocnguyen được xây dụng để chỉ có 8 column trogn table của nó! nên câu lệnh truy vấn của nó khi dùng ký tự * là để thể hiện sự truy vấn 8 column đó! và như thế thì câu lệnh SELECT thứ 2 của chúng ta cũng sẽ phải là chỉ có 8 column! và có 2 cách để thực hiện câu truy vấn của bạn: bạn có thể làm như sau: a. Select lần lượt các column của nó từ giá trị 1 đến khi nào mà nó báo hết rồi! (không trả thêm giá trị nào nữa!) nghĩa là bạn thay * bằng giá trị 1,2,3,4, bạn hiểu rồi chứ! vậy thì ta sẽ có câu lệnh truy vấn của Mođ uocnguyen là: http://72.36.192.69/~phucducc/demo/uocnguy 0union%20SELECT và tiếp theo http://72.36.192.69/~phucducc/demo/uocnguy 0union%20SELECT cho đến : http://72.36.192.69/~phucducc/demo/uocnguy 0union%20SELECT thì ta được là: Trích: Ước nguyện của 2 2 đến từ 3 2 ước nguyện vào ngày 2000-00-04 Ước nguyện là : 8 vậy thì chúng ta có là phần hiện thị của nó là phần số 2 và số 8! đó chính là các giá trị của column trong table ibf_wish_main. . IsNumeric() Kết luận: Những ví dụ trên này chỉ giúp bạn hình dung về SQL Injection và suy nghĩ như Hackers. Thật không thể nào bảo đảm được rằng có 1 cách nào đó có thể chống lại lỗi này và tự bạn