본문 바로가기
category/웹해킹(webhacking.kr)

웹해킹(webhacking.kr) - 18번

by 자운대고라니 2020. 10. 28.
반응형

안녕하세요??

자운대 고라니입니다.

오늘은 wargame.kr old-18번 문제를 풀어보겠습니다.


문제에 들어가보시면 대놓고 SQL INJECTION이라고 나와있군요.

일단 아래쪽 view-source를 활용하여 php소스코드를 확인하겠습니다.

 

이렇게 나와있는데 여기서 쿼리문을 먼저 분석해볼게요.

select id from chall18 where id='guest' and no=$_GET[no] // admin's no = 2

($_GET[no]는 우리가 입력할 text이다.)

 

옆에 주석처리를 확인하면 알 수 있듯이 no라는 데이터가 2일때 정답이 admin으로 로그인이 되면서 문제를 풀 수 있네요.

일단 no에 1을 넣어보니까 guest가 로그인 되더라구요.

 

그렇다면 대충 테이블의 형태를 추측할 수 있죠

 

      id            no

guest            1

admin          2

 

그렇다면  어떤 데이터를 넘겨서 sql injection을 성공할 수 있을까요?

3 or no=2이라는 값을 넣었다고 가정할게요.

select id from chall18 where id='guest' and no=3 or  no=2// admin's no = 2

 

and 연산은 or연산보다 우선순위가 높아요(and 후 or 연산이 적용됨)

그래서

id='guest' and no=3 (FALSE)

no=2 (TRUE)

이기때문에 no=2라는 'admin'의 계정으로 로그인이 가능하게되요.

그래서 3 or no=2 라는 데이터를 넣어봤어요.

 

preg_match 함수에 의해서 걸려서 injection이 불가능하다.

그렇다면 이를 우회하는 방법을 찾아보자.

 

3 or no=2 중 공백부분이 굳이 띄어쓰기가 아니어도 된다는 점을 활용해야한다.

이를 활용하여 url encoding을 통해서 우회해보자.

 

1. TAB을 뜻하는 %09

2. \n을 뜻하는%0a

 

두가지 값으로 답을 구할 수 있다.

나는 첫번째 방법을 사용해보았다.

 

 

그림에 나와있듯이 대입하고, 엔터를 눌러보면

답이 나온다.

반응형

댓글