공백 필터링이 되고 있다.
그래서 '|' 기호는 띄어쓰기가 없어도 된다는 점을 이용하여 값을 넣어보았다.
pw='||id='admin
딱봐도 DB에 admin이란 id가 없는 것 같다.... 스읍..
그래서 이럴때 사용 가능한 union select 기법을 사용해보기로 했다.
그렇게되면 공백을 사용하여야하는데
공백은 여러가지 우회방법이 있는데 이번에는 필자가 애용하는 %0a를 사용하여 풀었다.
블로그들을 보니 union select를 이용해서 푼 풀이가 많지 않은 것 같다.
그래서 자세히 적어보려고 한다.
union은 기본적으로 병합의 의미를 갖고 있으며 sql에서는 두개의 쿼리를 이어주는 역할을 한다.
고로 필자는 기존 "select id from play_sql08 where pw=''" 쿼리문을 사용하지 않고 그 뒤에 새로운 쿼리문을 병합(union)해서 사용하려고 한다.
사용방법은 첫 질의문이 끝난 뒤에 union을 붙혀서 쓰는 것이다.
예를 들자면
이런식의 사용이 가능하다.
정답부터 말을 해버렸지만 직접 실습을 통해 원리를 살펴보면 좋다.
우리는 result[id]가 'admin'으로 들어가면 된다.
그 점을 기억하고 DB에 어떤식으로 들어가는지 확인해보자.
이런식으로 적어주면 기존 데이터가 출력되는게 아니라 뒤에 적어준 1,2가 들어왔다.
여기서 주의할점은
문제에서는 select 'admin' 이라고 한개의 데이터만 적어주었지만, 이번 예제에서는 1과 2를 적어주었다.
그 이유는 컬럼의 개수때문으로 출력해주는 컬럼의 개수에 맞춰서 데이터를 적어줘야한다.
현재는 id, pw 두개의 컬럼이 있기 때문에1과 2 두개를 넣어준 것이고, 예제서는
select id ~~ 로 id 값 하나만 불러오기 때문에 'admin' 하나만 적어주면 된다.
문제와 비슷한 예제문을 만들어보자면
이런식으로 동작하기 때문에 문제가 풀린 것이며 union 앞의 질의문은 거짓으로 해주어햐 한다는 것도 잊으면 안된다.