비박스의 SQL Injection (GET/Search)와 비슷한 방법으로 풀어볼 것이다.
[난이도 : low]
페이지 구조를 먼저 살펴보자.
메뉴에서 영화를 하나 고르고 Go 버튼을 누르면 해당 제목의 영화에 대한 정보를 보여주고 있다.
(GET/Search)와 다르게 입력하는 부분이 없고 정보도 한 줄밖에 나오지 않는다.
GET 메소드를 사용하고 있기 때문에 파라미터 값이 URL에 노출될 것이다. URL을 잘 살펴보자.
movie=1, action=go 두 개의 파라미터가 들어간다.
페이지 동작 부분을 확인하자. movie의 값에 따라 영화가 출력되는 것을 확인할 수 있다.
movie=3으로 바꾸면 3번째에 해당하는 영화가 출력된다. 따라서 우리가 변조할 파라미터는 movie 값이다.
SQL Injection이 가능한지 알아보자.
싱글쿼터(')를 입력했을 때 오류가 뜬다면 SQL Injection이 가능할 것이다.
쿼리에 들어가는 값을 참으로 만들어줌으로써 SQLi를 실행할 수 있다.
쿼리가 참이 되어 영화가 출력되었다.
싱글쿼터(')를 쓰지 않게 주의하자. DB에 들어가는 값이 문자열이 아니라 숫자이기 때문에 쿼터로 묶어주는 부분이 없다.
필자가 예상하는 쿼리는 다음과 같다.
SELECT * FROM movie WHERE id=3;
파라미터로 받는 값과 컬럼 값이 일치하는 영화를 출력해주는 형식일 것이다.
1. 데이터베이스 정보 알아내기
이제 union을 사용해서 데이터베이스의 정보를 알아낼 것이다.
그런데 데이터베이스 안의 값을 입력하면 해당 번호에 해당하는 영화를 출력해 줄 것이다. union을 출력하려면 어떻게 해야 할까? 데이터베이스에 없는 값을 입력하면 union에 입력한 값을 보여줄 것이다.
정석대로라면 숫자를 1씩 늘려가며 컬럼 개수를 찾아야 하지만 GET/Search에서 컬럼 개수가 7개임을 알았으니 생략하겠다.
?movie=0 union select 1,2,3,4,5,6,7#&action=go
2, 3, 5, 4가 출력되었다. 숫자는 컬럼 위치에 해당한다.
노출되는 컬럼에 데이터베이스와 버전 정보를 알아내는 함수를 사용해 DB 정보를 알아내자.
?movie=0 union select 1,database(),version(),user(),5,6,7#&action=go
DB 이름 알아내기 : database()
버전 정보 알아내기 : version(), @@version
user 정보 알아내기 : user()
컬럼의 위치가 2,3,5,4이므로 2에 DB이름, 3에 버전, 4에 로그인된 유저 정보가 출력되었다.
DB 이름은 bWAPP, 버전은 5.0.96-0ubuntu3, user는 root@localhost이다.
2. 테이블명 알아내기
DB 이름을 알아냈으므로 information_schema에서 테이블명과 컬럼명을 알아낼 차례다.
information_schema는 mysql에서 DB의 메타 정보를 모아둔 DB다. 버전 정보를 구글링하면 mysql인 것으로 추측할 수 있다.
?movie=0 union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schema="bWAPP"#&action=go
지금 출력되는 blog는 information_schema에서 가장 상단에 있는 테이블 이름일 것이다.
튜플을 한 개씩 보여주고 있으므로 limit 기능을 사용해서 원하는 줄을 출력하도록 해야 한다.
limit n -> n개의 튜플 출력
limit a, b -> a-1부터 b-1줄까지 출력
limit 1,2 -> limit 2,3 ... 등으로 한 줄씩 출력하며 테이블 명을 알아내는 수밖에 없을 것 같다.
?movie=0 union select 1,table_name,3,4,5,6,7 from information_schema.tables where table_schema="bWAPP" limit 1, 2#&action=go
bWAPP DB 안에 테이블은 총 5개가 존재했다. blog, heroes, movies, users, visitors
아마 이 페이지에서 사용되는 테이블은 movies겠지만, 우리는 영화 정보를 탈취할 목적이 아니다.
사용자 정보를 탈취하기 위해 users 테이블 내의 정보를 알아낼 것이다.
3. 컬럼명 알아내기
테이블명을 알아냈으므로 users 테이블 내의 컬럼명을 알아낼 것이다.
?movie=0 union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_schema="bWAPP" and table_name="users" limit 1#&action=go
limit 1부터 차례대로 컬럼명을 출력하면 컬럼은 총 9개가 있다.
id, login, password, email, secret, activation_code, activated, reset_code, admin
4. DB 내의 데이터 출력하기
여기서 중요해 보이는 컬럼인 login과 password의 내용을 출력해보자.
테이블명과 컬럼명을 전부 알아냈으므로 UNION SELECT를 이용하면 쉽게 알아낼 수 있다.
movie=0 union select 1,login,password,4,5,6,7 from users limit 1,2#&action=go
이렇게 하면 DB에 등록된 사용자의 login과 password를 알아낼 수 있는데, 2번째 줄에 bee 계정의 login과 password 값이 저장되어 있었다.
실제로 bWAPP 내의 DB를 확인해보면 다음과 같이 user 정보가 저장되어 있다.
우리는 SQLi를 통해 비박스 내에 저장되어 있는 user 정보를 알아낸 것이다.
password는 해시값으로 암호화되어 저장되고 있지만, 해당 버전에서는 취약한 sha1 함수를 쓰기 때문에 해시 변환 사이트에 해당 해시 값을 넣으면 비밀번호를 알아낼 수 있다.
아래 사이트를 이용했다.
https://md5hashing.net/hash/sha1/
'Web Hacking > BWAPP' 카테고리의 다른 글
비박스(bWAPP) - Robots File (0) | 2020.11.22 |
---|---|
비박스(BWAPP) Broken Auth - Insecure Login Forms (0) | 2020.11.16 |
비박스(BWAPP) SQL Injection - Login Form/Hero (0) | 2020.11.16 |
비박스(BWAPP) SQL Injection - GET/Search (0) | 2020.11.02 |