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

2019. 1. 2. 23:54Web Hacking/Webhacking.kr

안녕하세요! 

오늘은 webhacking.kr 26번 문제풀이를 진행하도록 하겠습니다!

이번 문제도 100점 짜리라 비교적 쉬운 문제네요!


우선 26번을 클릭해서 들어가보면 이렇게 바로 뜨네요!

index.phps ....

뭐 그냥 닥치고 이것밖에 없으니 

여기에 접속해라!라는

뉘앙스로 들리기 때문에


군말없이 들어가 보겠습니다!




들어가보니 이런 소스가 있네요!

여기서 이 코드를 해석하면 끝나겠네요!


근데 코드가 상당히 간단하네요!

위에 부분은 뭐 문제 푸는 거에 영향이 없는 코드고

<?  if (eregi("admin") 이 부분부터 코드를

보시면 됩니다!


eregi가 문자 검출하는 함수인데,

사용자가 지정한 문자열과 일치하면

특정 명령을 수행하라!

이 정도로 알고 계시면 될 것 같습니다!


예를 들어 eregi("어설픈",$_GET[id])라고 되어 있으면

GET 방식으로 받아온 id 값에 어설픈이라는 문자열이 있으면~~~

이런식으로 이해 하시면 됩니다 !


근데 이 경우는 admin이라는 문자열이 검출되면,

no!를 echo라는 함수로 출력하고

exit(); 함수를 종료시키네요

뭐 한마디로 꺼진다는 소리죠..


근데 만약 id의 값이 admin이 아니라면 

if문의 영향을 안받기 때문에 if문을 skip하고 

다음 줄에 있는 명령어를 실행합니다!


GET방식으로 얻은 id값을 url decode해서 

이 값을 id 값에 넣어라!

 

※아 여기서 알아두셔야 할 중요한 거 하나!

php의 경우 웹 서버와 브라우저 사이에 데이터를 주고 받을 때

브라우저(크롬,익스플로러,파이어폭스) => 웹서버로 무언가를 보낼 때

브라우저에 입력한 값을 url encoding해서 웹서버로 보냅니다.

웹서버의 php에서는 이를 url decoding을 해서 값을 받아 봅니다!


브라우저(무조건 인코딩함) ==============>웹서버( 무조건 받아서 디코딩함)


저렇게 이해하시면 될 것 같아요!


그리고 마지막에 decode 한 id값이 admin이면 문제가 풀린다!


뭐 이제 코드풀이는 끝났으니 문제를 해결하러 




저는 일단 구글에 가서 url encoding을 하려고 url encoding을 검색했었어요!

그래서 일반 사이트에 가서 url encoding 사이트에 들어가서 admin을 입력하니

encoding 값이

밑에 처럼 똑같이 뜨더라구요....


분명히 이게 아닌데... 

그대로일리가 없는데..encode면 뭔가 바뀌어야 하는데....


이상하게 생각해서 url encode에 대해서 더 찾아봤습니다!



그래서 결국에 찾은게 URL Encoding 표가 있더라구요!


여기서 찾아보니 각 문자들을 이렇게 변환 시킬 수 가 있네요!

그래서 하나하나씩 찾아보니


a=%61

d=%64

m=%6D

i=%69

n=%6E 


그래서 쭉 합치면 %61%64%6D%69%6E 이렇게 됩니다!


자 그럼 이걸 입력하면 문제가 풀릴까요?

한번 입력해보러 가보겠습니다!



GET방식이기 때문에 ?를 붙이고 뒤에 변수 이름이 계속 id= 

이런 형태로 값을 대입합니다!

그래서 저 인코딩 된 값을 넣었더니!


no!라고 뜨면서 id에는 admin이 출력되네요?!?!


자 왜그럴까요?


이건 제가 앞에서 

여기서 알아두셔야 할 거 하나!

에서 설명했듯이,


자동으로 url decoding을 해준다는거...

그래서 원래 eregi는 admin이 아닌데 어떻게

우리를 검출해냈지?

우리는 %61%64%6D%69%6E 이렇게 입력했는데

이게 어케 admin인줄 알지?


라고 생각하겠지만,

사실은 서버쪽에서 %61%64%6D%69%6E 를 디코딩을 해서

admin으로 인식을 했기 때문에 eregi함수가 알 수 있었던 것입니다!



그래서 저희는 어떻게 해야한다?

한번 더! 인코딩을 한다!

그러면 eregi도 검출을 못하겠죠?


왜냐?

두번 인코딩을 하면 

한번 디코딩해서 eregi에 전달된 값이  %61%64%6D%69%6E이기 때문이죠!


그래서 한번 더 인코딩을 하게되면 저 값이 뜹니다!

 



그래서 저 값을 복사해서

url창에다가 입력을 해주면 문제가 풀립니다!


고생하셨습니다!