[어설픈] webhacking.kr 18번 문제풀이

2019. 3. 9. 23:31Web Hacking/Webhacking.kr

안녕하세요! 

오늘은 100점짜리 

webhacking.kr 문제를 풀어보도록 하겠습니다!


문제에 들어가니 아래와 같이 뜨네요!

바로 index.phps가 있으니

저기에 SQL injection 할 때

필터링 되는 단어나 규칙이 적혀있겠죠?


아래와 같이 소스코드가 나오네요!

Get 방식으로 no라는 parameter를 쓰네요!


그리고 eregi 함수 문자열 필터링을 하네요!

\ , / , | , \t, &, union, select, from , 0x 등을 하네요!

사실 \과 & 사이에 공백도 있어서

공백도 필터링 하는데

이건 injection하면서 알았습니다..


그리고 q변수에 mysql_fetch_array 결과 값을 담네요!

쿼리는 "id = guest고 (no= 사용자가 입력한 no값) 충족하는 id를 18번 테이블에서 가져와라!"


그 다음 if문에서 결과 값에서

q[0] => id 값이 들어간 부분

q[0]가 guest면 hi guest! 메세지를 띄우고

q[0]가 admin이면 풀리고 hi admin!이라고 뜨네요!


그래서 저는 문제를 풀기위해

쿼리를 어떻게 짜야할지 생각을 했습니다


parameter가 no이기에

no 중심적으로 생각해보면,

no는 통상적으로 sql injection 할때

number로  사용되서(문제풀이 경험상) 

사용자의 고유 넘버를 의미하는 경우가 많고

number는 ' ' 싱글쿼터 안에 안 넣는데


쿼리를 보니 no에는 '나 "가 없죠?

sql injection할 때 일반적으로 

문자열 바깥으로 나와야 하는데 

그럴 필요가 없죠?


즉 바로 injection이 가능하다!


guest가 1번인가?하고 

1을 입력하니 

hi guest가 떠서


admin은 2번인가?

admin=2 이라는 가정을 깔고

아래와 같은 쿼리문을 작성했습니다!


(근데 admin이 2라는 보장도 없고 3이라는 보장도 없으니

쿼리에 admin>1 이게 차라리 낫겠죠?)




그래서 결과값을 확인하니 

제가 위에서 말한 공백이 필터링 된 것을 

알 수 있었습니다!


공백이 url 인코딩된 값으로 %20이거든요!




근데 sql injection을 하기 위해서는 

공백 우회가 필수입니다!


왜냐면

no=2orno=2 

저렇게 공백 없이 입력하면

공격쿼리로 인식이 되지 않기 때문입니다!

 

그래서 저는 구글에 가서

공백 우회라고 입력을 하니


맨 위에 어떤 분이

자신의 블로그에 이렇게 잘

정리해 주셨더라구요!


<출처> 블로그 게시글 주소: https://binaryu.tistory.com/31 


그래서 첫 번째

%09를 %20(공백)을 대신해서

아래와 같이 넣었습니다!


근데... 이상하게 안되더라구요!

no hack!

이라고 뜨네요... 



그래서 %09 대신

2번째에 있는

%0a를 입력했습니다!

그랬더니 풀리네요!


간단한 php 공백 필터링만

찾으면 되는 함수였습니다!