저번에 식별과 인증을 분리해서 검사하는 로직에서의 이론을 살펴보았다. 오늘은 실전(?)편!
식별과 인증을 분리해서 검사하는 로직에서의 SQLi - 1
이번엔 식별과 인증을 분리하는 로직에서 생각해보고자 한다.select pw from member where id = 'cat'위와 같은 경우가 분리해서 검사하는 경우라 볼 수 있겠다!그럼 저번에 했던 동시에 검사하는 경우와
ragdo11.tistory.com
식별과 인증을 동시에 하는 로직으로 생각하고 이번에도 공격자가 cat 계정으로 접속하기 위해 아래와 같이 id 파라미터에 값을 넣어보았다.
어라 이번엔 되지 않는다. 개발자 입장에서 공격자가 or 1=1 이나 주석 처리로 인증을 우회해버리니까 그에 대한 차원으로서 로직을 변경해서 나름 신경 써서 막은 것이라 할 수 있다! 하지만..
식별과 인증 분리 파트에서 이론 공부를 했듯이, union을 이용해서 우회가 가능하다.
다만 SQL문이 어떤 식으로 이루어져있을지 알 수 없기 때문에 여러가지를 고려해봐야 한다.
select id,pw from member where id='-'
select pw from member where id='-'
...
select * from member where id='-'
그렇기 때문에 union문을 쓰기 위해서는 컬럼의 개수를 정확히 맞춰야 하지만 공격자 입장에서는 소스 코드를 볼 수 없으니 컬럼의 개수를 모르고 어쩔 수 없이 컬럼의 개수를 하나하나 맞춰보는 수 밖에 없다.
하지만 컬럼의 개수를 좀 더 빠르게 알아보는 방법이 있는데 order by 절을 이용하는 것이다.
+Order by??
order by는 오름차순이나 내림차순으로 정렬을 해주는 명령어인데 order by 뒤에 숫자를 붙이면 특정 위치의 컬럼을 정렬해주는데 이를 이용하여 컬럼의 개수를 알아낼 수 있다.
order by를 이용해 정렬한 결과이다. order by 1을 했을 때 첫 번째 필드인 id를 정렬한 결과를 보여주고, order by 2를 했을 때는 두 번째 필드인 pw를 정렬한 결과를 보여준다. 만약 그러면 test 테이블에는 없는 3번째 필드를 정렬하려고 한다면..?
당연히 오류가 발생한다. 이를 이용하여 order by가 참일 때와, 거짓일 때의 반응 차이를 이용하여 컬럼의 개수를 유추할 수 있게 되는 것이다!! 쉽죠잉?
공격자는 참/거짓에 따른 반응 차이를 위해 아이디와 패스워드가 guest인 계정을 만들고, order by 절을 사용하면서 컬럼의 개수를 유추한다.
그렇게 숫자를 대입하던 도중 1과 2에서는 로그인이 성공했지만 3에서는 로그인이 실패하게 된다.
이로 인해서 현재 아래와 같은 SQL문을 쓰고 있다고 유추할 수 있게 된다.
select id,pw from member where id='-'
이론때 했던 대로 union select 문을 이용해 공격을 마무리 하면 된다.
무려 admin으로 로그인을 우회할 수 있다!!
'SQL Injection > SQL Injection' 카테고리의 다른 글
Union Based SQLi (0) | 2024.06.13 |
---|---|
식별과 인증 동시/분리 처리 + Hash 실습 파트 (0) | 2024.06.11 |
식별과 인증 동시/분리 처리 + Hash (0) | 2024.06.11 |
식별과 인증을 분리해서 검사하는 로직에서의 SQLi - 1 (0) | 2024.06.11 |
식별과 인증을 동시에 하는 로그인 로직에서의 SQLi (+Access Control) (0) | 2024.06.10 |