image.png

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:

image.png

Ở đâ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õ:

image.png

image.png

Ở đâ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

image.png

Nhưng mà khi :

image.png

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 .