2023. 11. 30. 22:04ㆍnormaltic 취업반 5기/과제
2번 과제
- 과제 목표 : 실습 웹 어플리케이션에서 'doldol' 데이터만 출력하라. (doldol 데이터 하나만 출력되도록!)
- 추가 조건 : 과제에 쓰이는 쿼리문은 모른다는 가정하에 진행한다.
2번 과제 실습
2번 과제를 풀기 위한 실습용 웹 어플리케이션 기능은 내 정보 검색이다. 내 정보를 검색하기 위해서는 입력창에 비밀번호를 입력하는 것으로 보인다. 일반적으로 사용자의 정보를 DB에 저장할 때 사용자의 아이디를 기본키로 설정하여 식별에 쓰이도록 한다. 이는 중복된 아이디를 방지하여 사용자들을 유일하게 식별할 수 있도록 하는 효과를 발휘한다.
그러나 비밀번호는 중복이 될 수도 있기 때문에 사용자 식별에는 적합하지 않다. 이러한 정보들을 취합하여 SQL Injection을 쓰기 위해 해당 어플리케이션에 쓰이는 쿼리문이 어떤 형태로 구성되어 있는지 가정해 볼 수 있다.
- SELECT * FROM TABLE WHERE PASSWORD = '입력 비밀번호' : 쿼리문 그대로 비밀번호만으로 사용자를 식별하여 사용자 정보를 조회
- SELECT * FROM TABLE WHERE ID = '아이디' AND PASSWORD = '입력 비밀번호' : 이미 쿼리문에 아이디가 입력되어있는 상태에서 해당 아이디에 대응하는 비밀번호를 입력하여 사용자 정보를 조회
- SELECT * FROM TABLE WHERE PASSWORD = '입력 비밀번호' AND ID = '아이디' : 2번 쿼리문과 같은 구성이나 아이디와 비밀번호의 위치가 반대인 상태로 사용자 정보를 조회
우선적으로 1번, 2번 쿼리문과 3번 쿼리문을 주석을 사용하지 않음으로써 나눠볼 수 있다. 만약 주석을 사용하지 않은 쿼리문을 삽입하였을 때 적용이 된다면 1번과 2번 쿼리문 중 하나라는 것을 의미하며 적용이 되지 않거나 오류가 발생한다면 3번 쿼리문이라는 것으로 추측할 수 있다.
1) 1번, 2번 쿼리문과 3번 쿼리문 분류
주석 없는 쿼리문을 사용하여 적용이 된 것으로 보아 3번 쿼리문은 후보에서 탈락하여 1번, 2번 쿼리문 중 하나인것으로 알 수 있다. 그리고 모든 사용자 정보를 출력하여 'doldol'계정의 정보를 확인할 수 있었다. 그렇다면 이번에는 1번 쿼리문과 2번 쿼리문 중 어느 쿼리문이 맞는 쿼리문인지 확인하기 위해 각 계정의 비밀번호를 입력하여 그 결과를 확인해 보자.
2) 1번 쿼리문과 2번 쿼리문 분류
각 사용자의 비밀번호 'aaaa', 'qqqq', '1234', 'test1234'를 입력했더니 '1234' 말고는 모두 결과가 존재하지 않는다고 한다. 이러한 현상으로 보아 해당 어플리케이션의 쿼리문은 각 사용자를 비밀번호로 식별하는 것이 아니라 'normaltic' 사용자의 비밀번호를 입력하여 'normaltic' 사용자의 정보만을 검색하는 쿼리문인 것으로 확인이 되었다. 즉, 2번 쿼리문에 해당된다.
3) 'doldol' 사용자 정보 출력 방법
'doldol' 사용자의 정보만을 출력하는 방법으로는 SQL Injection으로 가능하다. 2번 쿼리문 뒤에 OR ID = 'doldol' 쿼리문을 삽입함으로써 앞에 쓰여 있는 AND 연산자로 인한 연산 결과를 FALSE로 만들어 ID가 'doldol'인 사용자 정보를 조회 가능하다. 이를 가능케 하려면 ID에 해당하는 컬럼명을 찾아야 하기 때문에 여기서 UNION SQL Injection을 사용한다.
4) UNION SQL Injection
UNION SQL Injection은 다음과 같은 과정으로 진행된다.
- SQL Injection 작동 여부
- COLUMN 개수 찾기
- 출력되는 COLUMN 위치 찾기
- DB 이름 찾기
- TABLE 이름 찾기
- COLUMN 이름 찾기
- DATA 추출
[1] SQL Injection 작동 여부
이 단계는 확인이 되었으므로 다음 단계로 넘어간다.
[2] COLUMN 개수 찾기
'ORDER BY 5'를 삽입하였더니 오류가 발생하는 것으로 보아 쓰이는 컬럼은 네 개인 것으로 확인이 되었다.
[3] 출력되는 COLUMN 위치 찾기
쿼리문 삽입 결과 모든 컬럼에서 데이터가 출력되는 것이 확인이 되었다.
[4] DB 이름 찾기
현재 DB 이름을 조회한 결과 'segfault_sql'라는 이름으로 확인이 되었다.
[5] TABLE 이름 찾기
12' UNION SELECT 1,table_name,3,4 from information_schema.tables where table_schema = 'segfault_sql' #라는 쿼리문을 삽입하여 'segfault_sql' DB에 존재하는 테이블을 조회한 결과 'game, member, secret, secret_member'의 테이블들을 확인했고 'doldol'이라는 사용자에 대한 정보를 얻기 위해서 'member' 테이블의 컬럼명을 확인하자.
[6] COLUMN 이름 찾기
12' UNION SELECT 1,column_name,3,4 from information_schema.columns where table_name = 'member' #라는 쿼리문을 삽입하여 'member' 테이블에 존재하는 컬럼명을 확인하였다. 이 중 사용자의 아이디가 저장되어 있을 가능성이 높은 'user_id'와 'id' 컬럼으로 확인하도록 하자.
[7] DATA 추출
컬럼명 'user_id'로 삽입한 결과 오류가 발생했으므로 해당 컬럼에는 데이터가 저장되어있지 않다는것을 알 수 있다.
컬럼명 'id'로 삽입한 결과 정상적으로 작동이 되어 'doldol' 사용자에 대한 정보만 출력이 되었다.
'normaltic 취업반 5기 > 과제' 카테고리의 다른 글
[normaltic 취업반 5기] 2023-12-06 7주차 과제 : SQL 3, 4, 5번 문제 (0) | 2023.12.07 |
---|---|
[normaltic 취업반 5기] 2023-12-02 6주차 과제 : 3번 과제 (2) | 2023.12.02 |
[normaltic 취업반 5기] 2023-11-15 4주차 과제 : 2번 과제 (0) | 2023.11.17 |
[normaltic 취업반 5기] 2023-11-08 3주차 과제 : 추가 과제 (0) | 2023.11.11 |
[normaltic 취업반 5기] 2023-11-08 3주차 과제 : 3번 과제 (0) | 2023.11.11 |