# SQL Injection in Wordpress core (CVE-2022-21661)
[Ngocnb](/@ngocnb.915?source=post_page-----
a451c492897-----------------------------------)
# Giới thiệu
Cuối năm 2021, team minh đa phat hiện ra lỗ hổng SQL Injection trong phần core
của Wordpress va mới đay thi Wordpress cũng đa tung ra bản va cho lỗi nay, cho
nen hom nay minh viết bai nay để chia sẻ về lỗ hổng ma team minh đa tim được.
Noi qua một chut về wordpress thi no la 1 CMS ma nguồn mở được sử dụng nhiều
nhất tren thế giới. Được sử dụng nhiều vi tinh tiện dụng của no khi cho phep
developers co thể tự xay dựng plugin va theme để quản lý website, phần core
của wordpress sẽ cung cấp cac function để plugin/theme gọi tới va sử dụng cac
chức năng ma wordpress đa cung cấp như format data, query DB, … Trong những
class ma wordpress đa cung cấp thi chung minh đa tim thấy lỗi SQL Injection
trong class ma WP cung cấp dung để query DB: WP_Query.
# Phan tich lỗi
Trong phien bản 5.8.3, wordpress đa fix lỗi nay, so sanh commit thay đổi thi
co thể thấy trong function `clean_query` đa được them phần kiểm tra
`$query['field']` trước khi xử lý biến `$query['terms']`.
![](https://images.seebug.org/1641802317823-w331s)
Function `clean_query` được gọi từ `get_sql_for_clause`. Đọc code của ham sẽ
thấy cong việc của ham nay la tạo ra cac clause cho điều kiện trong 1 query
SQL, cụ thể cong việc của no sẽ la xử lý dữ liệu nhận được, ghep dữ liệu đo
thanh 1 điều kiện trong query SQL va trả no lại cho ham cha. Vậy nen co thể
control được dữ liệu trả về của ham nay, đồng nghĩa với việc ta co thể control
được query SQL va thực hiện SQL Injection.
![](https://images.seebug.org/1641802343736-w331s)
Quay trở lại ham `clean_query`, khi chưa co thay đổi nay, mặc định cac gia trị
trong `$query['terms']` sẽ chỉ được xoa trung lặp va sau đo gọi đến
`$this->transform_query( $query, 'term_taxonomy_id' );`.
Để tranh rơi vao `if` thi `$query['taxonomy']` cần phải rỗng hoặc la 1 gia trị
để `is_taxonomy_hierarchical` return false.
![](https://images.seebug.org/1641802359523-w331s)
Ở function `transform_query` sẽ kiểm tra `$query['field'] ==
$resulting_field`, nếu đung sẽ return va khong xử lý gi them, vậy nen nếu biến
`$query['field']` la `term_taxonomy_id` thi chung ta co thể thoat khỏi ham ma
khong lam thay đổi gia trị biến `$query['terms']`.
(So sanh ở đay đang sử dụng`==` va bị lỗ hổng Loose comparisons, trong 1 số
trường hợp co thể sử dụng lỗi nay để tạo ra 1 cau điều kiện theo ý muốn).
![](https://images.seebug.org/1641802365079-w331s)
Sau khi thoat khỏi ham, luồng code sẽ trở về vị tri được gọi ham `clean_query`
la ham `get_sql_for_clause`, gia trị trong biến `$query['terms']` sẽ được sử
dụng trực tiếp lam điều kiện của query SQL va dẫn đến SQL Injection.
![](https://images.seebug.org/1641802392058-w331s)
Vậy tom lại, để co thể xảy ra SQL Injection cần co 2 điều kiện sau:
* `$query['field']` la `term_taxonomy_id`
* `$query['taxonomy']` trống hoặc `is_taxonomy_hierarchical($query['taxonomy']) === false`
Flow dẫn đến lỗi như sau:
![](https://images.seebug.org/1641802407985-w331s)
# Khai thac
Mặc du đay la lỗi ở core của wordpress nhưng cach ma phần core wordpress sử
dụng lại khong trigger được lỗi nen minh đa chuyển sang hướng tim lỗi trong
cac plugin va theme. Plugin/theme sẽ gọi đến class `WP_Query` khi muốn query
DB, cach nhận biết lỗi từ source code la khi dung `WP_Query($data)` va $data
la cai minh co thể control được.
Vi dụ: `new WP_Query(json_decode($_POST['query_vars']))` thi payload sẽ co
dạng:
```
query_vars={"tax_query":{"0":{"field":"term_taxonomy_id","terms":["<inject>"]}}}
hoặc
query_vars={"tax_query":{"0":{"taxonomy":"nav_menu","field":true,"terms":["<inject>"]}}}
```
Khi dựng moi trường để test lỗi, bật chức năng DEBUG sẽ giup ta co thể phat
hiện SQL Injection qua error-based:
![](https://images.seebug.org/1641802464929-w331s)
# Kết luận
Trong bản va của wordpress đa them phần kiểm tra `$query['field']` trước, nếu
khong sẽ convert `$query['terms']` sang integer nen khong thể xảy ra SQLI.
Do số lượng plugin va theme của wordpress kha nhiều, nen team minh mới chỉ tập
trung tim kiếm những cai co lượt download > 100k (bản miễn phi), ngoai ra
những plugin/theme bản trả phi hoặc < 100k lượt download thi chung minh chưa
co thời gian để tiếp tục lam.
Kết quả la đa tim được kha nhiều plugin va theme bị ảnh hưởng bởi lỗ hổng (cả
authen va unauthen).
Team minh đa report lỗ hổng nay cho ZDI vao cuối thang 9 va sau 3 thang lỗi đa
được Wordpress fix trong core của họ. Cụ thể timeline như sau:
![](https://images.seebug.org/1641802489491-w331s)
暂无评论