본문으로 바로가기

SQLinjection공격

category Study/web 2017. 7. 27. 06:31


K.Knock 동아리에서 sql인젝션이 무엇인지 알아보라고 자체적으로 제작한 문제이다.


처음 들어가면 위와같은 화면이 나온다.


소스를 살펴보자


주석을 통해 힌트를 주었다.


해당 파일을 보니 아래와 같은 소스가 나왔다.



저 코드를 한줄씩 살펴보다보면 쿼리문을 담는 변수인 q에서 취약점이 존재함을 알 수 있다.


변수 no에 따옴표가 없어 명령을 스페이스바로 구분해낼 수 있다.


한가지 더 알수있는 정보는 id가 admin인 계정을 찾아내면 된다는 것이다.



위와같이 입력하게되면 


select id from account_info where id = '$id' and pw = '$pw' and no =1 or id='admin'


위와같은 쿼리가 완성되며 or를 기준으로 오른쪽이 참이니 참에 해당하는 값을 반환하게 된다



성공!


그렇다면 id가 admin이라는 힌트 없이 풀어보자





no라는 항목은 아마도 유저에게 부여되는 넘버라고 추정해볼 수 있다.


그리고 대부분 이런 값은 UNSIGNED로 설정해놓는다.




양수이므로 0보다 no가 크다는 조건을 넣어보았다.


물론 or을 기준으로 좌측은 거짓이고 우측은 참이므로 우측의 값을 가져올텐데


해당하는 결과가 여러개라면 첫번째 결과를 가져올것이다.




guest로 로그인을 성공했다.


1씩 늘려봐도 알 수 있지만 소스코드에서 3을 필터링한것을 보아 3에 중요계정이 있음을 추측해볼 수 있다.



실제로 no가 2보다 크다는 식을 넣어주니 아래와 같이 admin으로 로그인 할 수 있었다.



이는 생김새를 보아 base64로 추정할 수 있다.


webhacking.kr의 디코딩기능을 이용하면 답을 얻을 수 있었다.



'Study > web' 카테고리의 다른 글

MySQL :: Every derived table must have its own alias  (1) 2018.08.02
HTTP request Brute Force Attack  (0) 2017.07.27
OWASP Top 10 - 2017  (2) 2017.07.06
OWASP란?  (0) 2017.07.06
MySQL 주요 명령어 정리  (0) 2017.06.29