
Bị ngay ở tham số author__not_in , ở đây giả sử nếu tham số đó ko phải là một mảng thì sao. Thì theo code nó sẽ chạy xuống hàm này :
$author__not_in = implode( ',', (array) $query_vars['author__not_in'] );
Sẽ ra sao nếu ta chèn payload như sau:

Ở đây có thể thấy là khi ta đưa một chuỗi SQL injection thì hàm implode kia cũng trả về y chuỗi ban đầu, đây chính là root core ban đầu.
Với query ban đầu là :
$old_request =
"SELECT $found_rows $distinct $fields
FROM {$wpdb->posts} $join
WHERE 1=1 $where
$groupby
$orderby
$limits";
$this->request = $old_request;
Ở đây chuỗi cuối cùng sẽ thành là : SELECT [columns]
FROM [table_prefix]posts
WHERE 1=1
AND [table_prefix]posts.post_type IN ('post', 'page', 'attachment')
AND ([table_prefix]posts.post_status = 'publish')
AND [table_prefix]posts.post_author NOT IN (Chỗ ta kiểm soát )
Đến đây ta tìm được lổ hổng SQL nhưng mà làm sao để gọi hàm này đây . Ở đây có 2 chỗ cần làm rõ:


Ở đây tức là nó nhận nè ở api : http://localhost/wp-json/wp/v2/posts nó có nhận tham số đó , còn api : http://localhost/wp-json/wp/v2/posts/1 nó không nhận . Rõ rồi nhưng mà tại sao nó ko thực hiện được rõ ràng trong code nó bị lỗi mà . Ở đây đúng là lỗi code nhưng mà mấu chốt là nó bị ràng validate trước khi đi vào goi callback handle . Quan sát cái này

Nhưng mà khi :

Vấn đề khi validate thì nó Check param và santitize tương ứng , khi mà nó duyệt đến :
"path": "/wp/v2/posts/1?author_exclude=0) or 1=1-- -”
Thì thực chất nó ko nhận cái tham số author_exclude để xử lí nên nó sẽ pass qua cái bước validate và ko lỗi , nhưng mà như lúc nãy đã nói thì nó sẽ thực hiện callback handle của thằng đứng sau nó tức là của GET /wp/v2/post mà api này nhận tham số đó nên nó xử lí và SQL được .