Problem
Problem Analysis
가장 기본적인 문제로 아무 결과나 조회가 되면 solve인 문제다.
보통은 id와 pw가 전부 맞아야 결과를 불러오지만 기본적인 쿼리문 자체를 조작해버려 다른 값을 가져오게 할 수 있다.
예를 들어
select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'
이 구문에서 parameter에서 id 값과 pw 값이 각각에 해당하는 위치에 들어가게 되는데
pw 위치에 싱글 쿼터를 입력하게 된다면 어떻게 될까?
해당 sql 구문을 끝내고 또 입력이 가능한 것이다.
예를 들어 id에는 admin pw에는 1'을 입력하면
select id from prob_gremlin where id='admin' and pw='1''
이렇게 된다.
이럴 경우 마지막에 싱글 쿼터가 하나 남아 아예 오류가 발생해 작동하지 않는다.
이 경우 MYSQL에서 주석 처리를 나타내는 #을 입력해주면 되는데 #은 URL에서도 특수한 기능을 하여 encoding 값인 %23을 입력해야 한다.
그럼 #을 입력하게 되면
select id from prob_gremlin where id='admin' and pw='1'#'
이렇게 되어 어찌저찌 구문은 완성할 수 있다. 다만, 구문을 완성해도 결국 아무 일도 일어나지 않는다. 여기에 추가적인 작업을 해주어야 하는데 싱글 쿼터로 끝낸 후 우리는 추가적인 구문 자체를 입력할 수 있다. 예를 들어 함수(sleep, benchmark 등) 혹은 논리 키워드(AND, OR 등)을 입력할 수 있어 추가적인 활동을 시킬 수 있다.
자 그럼 이 구문을 id와 pw는 상관하지 않고 결과를 불러오려면 어떠한 키워드를 입력해야 할까?
저 구문을 쪼개 보면
select id from prob_gremlin
where id='admin' and pw='1'
이렇게 두 개의 구문으로 나눌 수 있다. 첫 번째는 불러올 값의 칼럼 이름과 테이블 명이 적혀있고 두 번째에는 값을 불러오는데 조건을 더하는 부분이다.
여기서 첫 번째 구문은 불러올 위치와 값을 정해주는 것이니 상관은 없고 최종적으로 불러올 값을 정하는 연산을 하는 부분은 두 번째 부분이다.
따라서 추가적 연산을 통해 또 다른 값을 불러오도록 유도해야 한다.
그래서 사용할 수 있는 키워드는 OR이다.
OR은 '또는'을 의미하는데 앞의 조건이 맞지 않아도 뒤의 조건이 참이면 해당 값을 불러온다.
그래서 두 번째 부분이 거짓이라도 OR로 참을 만들어주면 값을 불러올 것이다.
Exploit
정리해서 결국은 OR 키워드를 이용해 pw와 id와 상관없이 참으로 만들어주면 된다. 단순히 참으로 만들면 되기 때문에 참을 의미하는 1을 입력하고 오류를 발생시키지 않도록 남은 싱글 쿼터를 주석으로 처리해주면 된다.
?id='ad'&pw=1' OR 1%23
※이렇게 하면 가장 첫 번째의 값을 불러온다.
'Web Hacking > LOS(Lord Of SQL injection)' 카테고리의 다른 글
[LOS] darkelf #6 (0) | 2021.03.29 |
---|---|
[LOS] wolfman #5 (0) | 2021.03.29 |
[LOS] orc #4 (0) | 2021.03.29 |
[LOS] goblin #3 (0) | 2021.03.29 |
[LOS] cobolt #2 (0) | 2021.03.29 |