안녕하세요. 오늘은 webhacking 46번 문제를 풀어보겟습니다.

홈페이지로 들어가 46번 문제를 눌러주세요.

또 sql문이군요. 쿼리 전송을 해봅시다.

뭐라고 뜨는군요. 일단 소스를 봅시다.

index.phps가 있네요. 함 들가봅시다. 

당연히 solve부터 봐야 합니다.  q[0]=="admin"이면 해결된다네요. 위의 if문을 한번 봅시다.

q의 값과 get[lv]의 값이 들어왔을 경우 아래의 문구를 출력한다는군요.

$q[0] information<br><br>money : $q[1]

그런데 아까 우리가 레벨1을 전송시켰을때 문구가 하나 떳지요? 다시 한번 봅시다.

zzibong information

money : 10000

음 보니까 get[lv]의 값이 1일경우 q[0]의 값은 zzibong가 되구요. q[1]의 값은 10000이 되네요.우리는 이 q[0]의 값은 admin이으로 만들어야 합니다. 어떻게 해야 할까요?

일단 level값에 1이 아닌 다른 수를 입력해 보았습니다. 그런데 어떠한 값을 넣어도 1외에는 별 내용을 출력하지 않니다. 일단 바로 위의 q를 한번 봅시다.

$q=@mysql_fetch_array(mysql_query("select id,cash from members where lv=$_GET[lv]"))

mysql_fetch_array는 앞의 문제에서도 설명했다시피 DB의 레코드셋을 php배열로 가져오는 함수입니다. 레코드셋이란 레코드들의 집합이지요.  mysql_query는 sql문을 실행하는 함수이구요. 뒤쪽의 문구를 보면 id와 cash를 검색하라고 나와있습니다. 

뒤쪽의 where이 있는걸로 보아 대충 조건에 맞는 아이디와 cash를 검색하라는 것 같습니다.

그런데 우리는 get[lv]에만 손댈 수 있습니다. 그러니까 이 값을 지정하여 admin인 id를 불러와야 합니다. 아까 쿼리전송 하신분은 아시겠지만 lv의 값은 1외에는 아무 문구도 안뜹니다. 즉 lv1의 아이디는 zzibong이고 그외에는 없다는 것이지요. 그렇기 때문에 lv에 상관없이 id가 admin인 것을 불러 와야 합니다. 그렇게 할려면 다음과 같이 되야 합니다.

where lv=0 or id='admin'

이것이 무슨 뜻이나면 where 다음조건을 만족시키는 것을 검색하라

조건은 lv=0 이거나 id가 admin인 id를 가져와라 라는 뜻입니다. lv의 값은 1외에는 없기 때문에 or을 붙여 앞의 lv조건을 무효화 시킨 것입니다. or이기 때문에 lv값이 틀려도 그 다음의 조건이 만족하면 장땡이기 때문입니다. 그 다음의 조건은 id가 admin인것입니다. 이렇게 해서 admin인 id를 불러올 수 있습니다. 그러면 이제 저것을 그대로 대입하면 되느냐구요? 

그렇게 되면 참 좋겠습니다만... 안되네요.

이유는 몇가지가 있지요. 일단 소스를 다시 한번 보시면

$_GET[lv]=str_replace(" ","",$_GET[lv]);

가 있습니다. 이것은 입력받은 lv의 값중 띄어쓰기가 있을경우 그 뛰어쓰기를 무효화 시킨다는 소리입니다. 즉 우리가 입력하려는 lv=0 or id='admin'에는 띄어쓰기가 있으니 그 띄어쓰기를 무효화 시킨다는 것이지요. 그래서 우린 이것을 우회하기 위해 %0a를 씁시다.

그러면 lv=0%0aor%0aid='admin'가 됩니다. 그래서 이것을 그대로 넣었는데 또 되지 않았습니다. 문법이 틀린 것은 아닌데 말입니다. 그러면 역시 그거 하나밖에 없죠.

앞 문제에서 설명했다시피 php에는 magic_quotes_gpc라는 함수가 존재한답니다. 이 함수는 '(홑따옴표), "(큰따옴표), \(이스케이프), %00(null) 값에 대해 앞에 \ 문자를 붙임으로써 공격을 방지하는 기능을 가지고 있답니다. 만약 이 함수가 실행되었다면 우리가 입력한 '의 앞에 이스케이프가 붙게 되서 결국 에러가 생겨버립니다. 즉 우리는 '를 대신할 만한 것을 써야합니다. 앞에서 썻던 함수 char을 또 쓰겠습니다.

 lv=0%0aor%0aid=char(97,100,109,105,110)가 되겠네요. lv값에 넣는거니 lv를 빼면 

정답은 0%0aor%0aid=char(97,100,109,105,110)가 되겠네요. 넣어줍시다. 참고로 앞의 숫자는 0이든 1이든 3이든 상관없습니다. 버리는 조건이니까요.

컨트롤c를 눌러 복사해서 붙여넣었더니 숫자만 붙여넣기가 되었습니다. 그래서 일일이 입력해주었습니다.


.... 안되네요. 아무래도 칸에 넣어서는 안되는 모양입니다. 주소값을 봅시다.


분명 적은것과 다르게 lv값이 바뀝니다. 그래서 이번엔 직접 주소창에 적어보겠습니다.


엔터를 쳐줍시다.


네 이것으로 문제풀이를 마치겠습니다.




'Webhacking' 카테고리의 다른 글

webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 36번 문제  (0) 2015.07.30
webhacking - 35번 문제  (0) 2015.07.29
webhacking - 32번 문제  (0) 2015.07.29
Posted by englishmath
,