Game/webhacking.kr

[200] prob59

ellen28 2015. 7. 1. 20:03

200점짜리 59번 문제이다. 


join, login폼이 있고, 문제의 소스를 제공해준다.

소스를 확인!


소스를 볼때 라인이 있으면 더 편할 것 같아서 소스는 Sublime Text2!! 예쁘다!

2 ~17 라인을 보면 sql쿼리문을 실행시켜 뭔갈 받아오는걸 보니 로그인하는 과정이고, 

18~24는 insert문을 써서 id와 phone을 guest lv로 db에 저장한다. 


두번째 라인부터 좀더 자세히 살펴보면 POST방식으로 로그인할때 받은 아이디[lid]와 번호[lphone]를 받아와서

쿼리문에 넣어 해당하는 id를 받아온다. 

그리고 해당하는 id가 존재할 경우 id와 lv를 출력한다. 

그리고 lv가 admin일경우 @clear


18번째 라인부터 살펴보면 가입하는 과정인데, phone의 길이가 20자가 넘을경우 exit,

또는 id에 admin이란 단어가 있을 경우 exit,

phone에도 admin등등 여러 단어를 필터링하고 있다. 


문제를 해결하기 위해서는 lv를 admin으로 설정해주어야한다. 

그러면 id나, phone에 admin이라는 단어가 들어가야하는데 그럴경우 모두 필터링을 해주기 때문에 다른 방식을 생각해야한다. 그리고 char같은 문자열을 바꿀 수있는 것도 필터링한다.


그러므로 reverse함수를 이용한다.

reverse함수는 인자로 들어가는 문자열의 값을 거꾸로 변환해 반환한다고 한다.


db에 insert해주는 구문을 다시 살펴보면, 

insert into c59 values( '$_POST[id]', $_POST[phone], 'guest') 

무조건 lv는 guest로 설정이 된다. 

그러르모 phone값을 조작하여 lv까지 설정해주고, 뒤는 주석처리(--) 해주기로 한다.


phone은 정수형으로 ''를 쓰지 않으므로 sql injection을 하기가 수월하다.

하지만 1,reverse(admin));-- 처럼 phone에 넣어주면 길이 제한이 있어서 걸러지게 된다.


다른 칼럼에서 먼저 값이 설정이 되면, 다른 칼럼에서 이 값을 참조해서 사용할 수 있다고 한다.

그러므로 id 칼럼에 nimda를 써주고 이값을 phone에서 이용한다. 

여기서 주의!!!!!! 분명 제대로 입력한 것 같았는데 왜인지 계속 문제가 안풀려서 미루어놓고있었다 ㅠㅜ

같은 동아리 언니의 도움으로 문제를 풀수있었는데 ;.;

문제는 1,reverse(id));-- 한후 왜 인지모르겠지만 띄어쓰기를 한번하고 제출해야

제대로 로그인이 되면서 문제가 풀린다..;


200점 짜리 문제였지만 힘들었다ㅠ!