이번에도 mssql 환경이다. 필터링은 이전 문제와 비슷한 것 같다. Error 처리하는 부분이 있어서 이번 문제도 Error Based SQL Injection 일 수도 있겠다. 마지막 solve 부분에 다음과 같은 주석이 달려있다.
// you have to pwn 5th column
우리가 원하는 pw 값은 테이블의 5번째 열에 있는 것 같다. 5번째 열의 이름을 반드시 알아내야만 한다.
우선 가장 중요한 점은 query 의 select 뒤에 *(asterisk)가 있다는 것이다. 모든 column 의 데이터를 뽑겠다는 것이다. 또한 group by 를 이용하여 데이터들을 그룹화하여 뽑아낼 때 흔히 범하는 실수들이 있다.
group by 를 쓰겠다는 이야기는 select 로 선택한 column 들에 대하여 group by 로 정의한 column 들을 기준으로 그룹화하겠다는 이야기다. 예를 들어 같은 부서에 속한 직원들의 급여 평균을 뽑고 싶다면 'select dept, avg(salary) from db group by dept' 과 같은 query 를 작성할 수 있을 것이다.
여기에 추가하여 같은 부서에 속한 직원들의 급여 평균을 구하는 것은 똑같지만 성별을 구분하여 뽑아본다면 어떻게 해야할까? 'select dept, sex, avg(salary) from db group by dept, sex' 와 같이 query 를 작성해야 할 것이다.
그러나 만약에 위와 같은 상황에서 group by 뒤에 dept 만을 적으면 어떤 일이 일어날까? SQL Fiddle (http://sqlfiddle.com/)에서 테스트 해보았다.
Group by Test
다음과 같이 환경을 구성하고 정상적으로 정렬된 table의 모습이다. 부서와 성별을 기준으로 급여의 평균을 출력한 모습이다. 그럼 group by 뒤에 부서만을 적으면 어떻게 될까?
SQL Fiddle 에서 MSSQL 환경도 지원하는 것으로 알고 있었는데 지금은 사라져있다. 우선 SQLite 환경으로 진행했다. 출력된 것을 보면 a 부서에서는 남성만, b 부서에서는 여성만 집계된 것을 알 수 있다. 우리가 원하지 않는 데이터다.
MSSQL 에서는 이와 같이 적는다면 'mssql 집계 함수나 group by 절에 없으므로 select 목록에서 사용할 수 없습니다.' 라는 오류 메세지를 출력한다고 한다. 똑똑한 친구인 것 같다. 이 점을 이용하여 원래 문제에도 적용하자.
문제의 코드에서 볼 수 있듯이 'id'라는 이름을 가진 column 은 이미 알고 있다. group by 뒤에 id column 만을 적어보자.
pw=' group by id--
오. pw 라는 column이 집계함수나 group by 절에 속해 있지 않는다고 나온다. 이 오류 메세지 flow를 계속 이용하면 될 것 같다.
앗. column 이름이 숫자로 시작한다. 숫자로 시작하거나 특수문자, 띄어쓰기가 있는 경우에는 쿼터나 대괄호로 묶어주어야 한다.
column 이 5개가 끝이다. 오류 메세지는 순서가 빠른 것부터 출력되는 것 같다. 일단 id 를 제외한 column 의 순서는 pw -> "45a88487" -> "13477a35" -> "9604b0c8" 이다. pw 만 group by 에 넣어보자.
id 가 첫 번째 column 인 것 같다. 또한 아래와 같이 having 절을 이용해 첫 번째 column 을 찾는 방법도 있다.
이제 5th column name을 찾았으니 이를 이용한 간단한 query를 작성해 보자. pw를 알아야 하는 것이니 아마 pw 값은 varchar로 되어있을 것이다. 정수형과 비교하여 오류를 발생시키자.
pw=' or id='admin' and "9604b0c8"=1--
그러나 정답이 저 값이 아니란다. 알 수가 없다. 앞에 id 에 admin 을 추가적으로 던져줘봤다. 이 방법 저 방법 다 시도해보는 수밖에 없다.
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - mummy (0) | 2021.10.05 |
---|---|
Lord of SQL Injection - siren (0) | 2021.10.05 |
Lord of SQL Injection - poltergeist (0) | 2021.10.03 |
Lord of SQL Injection - cyclops (0) | 2021.10.03 |
Lord of SQL Injection - chupacabra (0) | 2021.10.03 |