Login Bypass 3 - Order by
문제
주어진 계정으로 로그인하였고, Request 값을 살펴본다.
SQL Injection 공격을 위해 해당 Request proxy를 repeater로 보낸다.
기초적인 SQL 인젝션 공격은 들어가지 않는 것을 확인하였다.
SQL UNION 기법을 사용해본다.
- SQL UNION 기법 : 여러 개의 SELECT 결과를 하나로 합치는 것
ex)
SELECT name FROM users UNION SELECT title FROM posts;
→ users 테이블의 name 칼럼과 posts 테이블의 title 칼럼을 하나의 결과로 병합해주는 쿼리이다.
SQL UNION 을 사용하기 위한 선제조건이 있는데,
→ 두 SELECT 절의 칼럼 개수와 데이터 타입이 일치해야 한다는 것입니다. 그래야 두 테이블의 데이터를 문제없이 하나로 합칠 수 있습니다.
그래서 컬럼수가 일치해야 유니언을 사용할 수 있다.
칼럼수를 확인 하는 방법은 다음과 같다. order by
→ 제공된 계정 doldol을 활용하여, 비밀번호는 그대로 두고 아이디에 order by를 사용하여 컬럼수가 몇개인지 확인해본다.
order by 3 에서 error코드인 200 OK가 나왔다.
즉, 컬럼수는 2개이다.
→ 아이디 컬럼, 비밀번호 컬럼 (이렇게 두개라는 것을 간접적으로 알 수 있다)
where id = ‘’ and pw=‘’ (이와 같이 가정을 해본다)
UNION을 기준으로 {2개의 열(아이디,비밀번호)를 가진 DB를 합치는 작업}
- 첫번째 select 는 빈칸
- 두번째 select에서는 접속하고자 하는 아이디 normaltic3 와 임의의 랜덤 비밀번호 dol1234를 만들어서 삽입을 한다.
where id = ‘' union select 'normaltic3' , 'dol1234' -- ’ and pw=‘’
아이디: ' union select 'normaltic3' , 'dol1234' --
비밀번호 : dol1234 (위에서 만든 임의의 비밀번호와 일치해야함)
* UNION SELECT로 여러 행을 만들어보고, 정렬 순서를 바꿨을 때 로그인되는 계정이 바뀐다면 → 서버는 첫 번째 행만 사용하고 있다.