안녕하세요. 오늘은 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를 눌러 복사해서 붙여넣었더니 숫자만 붙여넣기가 되었습니다. 그래서 일일이 입력해주었습니다.
[출처] [Webhacking.kr] 46번 (300) 풀이|작성자 Teamline
.... 안되네요. 아무래도 칸에 넣어서는 안되는 모양입니다. 주소값을 봅시다.
분명 적은것과 다르게 lv값이 바뀝니다. 그래서 이번엔 직접 주소창에 적어보겠습니다.
엔터를 쳐줍시다.
네 이것으로 문제풀이를 마치겠습니다.
[출처] [Webhacking.kr] 46번 (300) 풀이|작성자 Teamline
'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 |