
CVE-2025-22783의 PoC
WordPress 플러그인
Component name SEO Plugin by Squirrly SEO
Vulnerable version <= 12.4.01
Component slug squirrly-seo
Component link https://wordpress.org/plugins/squirrly-seo/
Vulnerability class A3: 인젝션
Vulnerability type SQL 인젝션
Contributor +
Squirrly SEO 플러그인은 특정 키워드를 기반으로 소스 페이지와 대상 페이지를 선택할 수 있는 내부 링크 기능을 통해 웹사이트의 SEO를 개선할 수 있게 해줍니다. 내부 링크 관리 페이지(/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks)에서 각 링크의 키워드, 소스 페이지, 대상 페이지 및 상태를 관리할 수 있습니다.
Squirrly SEO 플러그인 12.4.01 이하 버전에서는 내부 링크 관리 페이지에서 생성된 내부 링크를 검색할 수 있습니다. 사용자(Contributor+)가 입력한 검색어가 검증 없이 데이터베이스 쿼리에 직접 전달될 때 SQL 인젝션 취약점이 발생합니다.
검색 결과는 내부 링크 관리 페이지에 직접 표시되지 않지만, SLEEP 함수와 같은 시간 기반 SQL 인젝션 기법을 사용하여 데이터베이스 정보를 추출할 수 있습니다.
Squirrly SEO 플러그인 12.4.01 이하 버전이 설치된 대상 사이트에 Contributor 이상의 권한을 가진 계정으로 로그인합니다.
그런 다음 아래 URL에 접근하면 SQL 인젝션 페이로드의 IF 문 조건 '1=1'이 항상 참이므로 SLEEP(5) 함수가 실행되어 5초 후에 페이지가 로드됩니다.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
반면에 IF 문 조건을 '1=2'로 변경하면 결과 값이 거짓이므로 페이지가 즉시 로드됩니다.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
Squirrly SEO 플러그인의 내부 링크 관리 페이지(/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks)에서 내부 링크를 검색할 때 /wp-content/plugins/squirrly-seo/models/Qss.php 파일의 getSqInnerlinks 함수를 호출하여 데이터베이스에 쿼리합니다.

이때 변수 $query_where가 SQL 쿼리에 직접 삽입되는 것을 확인할 수 있습니다. 변수 $query_where의 값이 어떻게 구성되는지 살펴보겠습니다:
$search에는 내부 링크 검색 시 입력한 검색어가 포함되며, sanitize_text_field 함수를 사용하여 사용자 입력 데이터를 처리합니다.$search는 조건절의 일부로 사용되어 변수 $query_where에 저장됩니다.$query_where에 추가 조건이 추가되고, apply_filters 함수를 통해 필터가 적용됩니다.따라서 내부 링크 검색 시 사용자가 입력한 검색어는 sanitize_text_field 함수로 처리되지만, 이 함수는 SQL 인젝션 공격을 방지할 수 없습니다. SQL 쿼리에 사용되는 특수 문자(작은따옴표('), 주석(#) 등)는 필터링되지 않으며, SQL 인젝션 페이로드가 포함된 변수 $search가 적절한 이스케이프 없이 데이터베이스 쿼리에 전달될 때 SQL 인젝션 취약점이 발생합니다.
⚠️ 구현된 PoC 코드는 관리자 계정으로 로그인하여 취약점 재현에 필요한 최소 권한(Contributor+)을 가진 계정을 생성한 다음, 해당 계정을 사용하여 취약점을 트리거합니다.

다음으로 아래 명령어를 입력하여 PoC 코드를 실행합니다.
Required modulerequests
python poc.py
