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

2019. 1. 11. 20:16Web Hacking/Webhacking.kr


안녕하세요!


오늘도 비교적 쉬운

 150점짜리 문제! 

27번을 풀어보겠습니다!


문제를 들어가니 이렇게 뜨네요!

대놓고 나는 sql injection이다


문제의 방향을 바로 제시해 줬죠?

구문 저희가 inject해서 

원하는 값을 도출하면 되겠죠?



일단 먼저 sql injection 하려면

뭐가 필터링 되어 있고, 어떻게 해야 풀리는지

코드를 봐야해서 F12를 눌러서 

소스코드를 보려 했더니

index.phps라고 있네요!


오호 그럼 저기로 이동해 볼까요?






근데 이동하기 전에

저는 항상 몇 개씩

궁금해서 랜덤한 값을 

입력해 보았습니다!


1을 넣으니 아래와 같이 guest가 뜨네요! 






그리고 이번엔 syntax error나 

오류 메세지가 어떻게 나오나

(왜냐면 오류코드가 

힌트가 되니까요)

확인해보려고 '를 입력하니 

쿼리 에러라고 뜨네요!


뭐 이 정도만 하고 그러면 

index.phps로 이동해볼게요!

코드 보러 고고!






일단 한 줄씩 해석을 하자면

no 값이 있을 때! 

모든 게 시작되네요!


그리고 바로 eregi 함수가 와서 

사용자가 지정한 문자열을 필터링

하네요!

#, union , from , challnege, select, /, limit, =, 0x등이 있네요!

그리고 밑에 쿼리문이 있네요!


id를 challenge 27 table에서 가져오는데

조건이 있오!


id가 guest 이고

no 값이 ($_GET[no])이여야 하오


근데 문제가 풀리려면 

쿼리 값이 admin이여야 풀리고

guest면 guest를 출력해라!


근데 제가 아까 그냥 1 대입했는데,

guest가 출력 됐으니 

id ='guest'  and no=1가 

참이라는 뜻이네요!


즉 guest는 no=1이구나!


그러면 admin의 no는 몇 번 일까?

이렇게 생각을 해봤습니다!


근데 원래 php에서 

문자열은 ' ' 혹은 " " 안에 전달되고

숫자는 ' '나 " "없이 그냥

쓰이잖아요!


예) id='admin' <---- admin이 문자열이라 ' '안에 넣음

no=1 <------ 1은 ' '나 " "로 감쌀 필요 없이 그냥 대입가능!


근데 여기서는 no = ( )를 추가적으로 넣으셨네요! 

그러면 저희가 저 괄호를 빠져나오려면  

숫자 뒤에 )를 입력해야 겠네요!


바로 다음 사진과 함께 설명할게요!







Get 방식이니까 url 창에다가 했습니다!

자 그리고 일단 id를 저희는 

admin으로 하고 싶은데


select id='guest'로 고정 되어 있으니

앞의 문장을 거짓으로 만들고,


그 뒤에다가 저희가 

원하는 id='admin'을 넣어야 겠죠?

그래서 no=0을 넣으려 했는데

뒤에다가 )를 붙였습니다!


왜냐?

그래야지 no=( 0)가 되서 no가 닫히잖아요

물론 원래 뒤에 있던 ) 는 계속 남아 있게되죠!

근데 괜찮아요 이거 맨뒤에서 

주석처리 하면 되니까요!


그리고 바로 뒤에다가 or을 

입력하고 저희가 원하는

참인 문장을 입력하면 되죠!

id like 'admin' 

=를 못쓰니 like으로 대체했습니다!

admin은 문자열이니 ' '로

감싼거구요!


그리고 맨뒤에 남은 ) 요놈 없앨려고 

--+ 입력해서 주석처리했습니다!


그리고 enter를 눌렀는데

query error가 뜨네요!


흠.... 뭐지....?

로직은 분명히 맞는데

' '나 " "가 필터링 되는 기능이 있나...





그래서 그냥 ' '와 " " 를 버리고


다르게 접근하였습니다!


no가 각각의 사용자에게 부여되는 값처럼

보여서 ( 이건 los-eagle 문제에도 비슷한 게 존재해서 경험상 유추가능..)


admin의 no 값을 guess 한거죠!

근데 저희가  솔직히 어느 세월에

일일이 다 찾아요 ㅋㅋ


그래서 살짝 마법을 부렸죠!

 guest의 no 값은 1이고


admin의 no 값은 

그러면 뭐 최소한 1보단 크겠네?

(시작이 1부터라는 가정하에...)


오키 그러면 뭐 식 세워 봅시다!


똑같이 0)해서 no = (0) 닫아주고

뒤에 or 넣고

저희가 원하는 참 값 넣으면 되죠!

no가 1보다 크다 

no>1


그리고 맨 마지막에는 ) 때문에 

주석 --+를 입력하니!

문제가 풀리네요!!!


근데 url창 말고 

일반 밑에 있는 입력창에

똑같이 입력해봤는데 

안되더라구요!


그래서 앞으로도 그렇고 제일 확실하게

get방식이면 url창에다가 입력하세요!


그럼 오늘도 고생하셨습니다!