본문 바로가기

보안공부/Webhacking.kr 풀이

webhacking.kr 18번 문제 풀이 - SQL주사기

WEBHACKING.KR 18번 문제 풀이

SQL주사기 ]


오늘은 webhacking.kr의 18번 문제를 풀어보자.


index.phps를 누르면 사이트의 코드가 나오는데, PHP 부분만 떼어서 확인해보자.

<? 
if($_GET[no]) 
{ 

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

if($q[0]=="guest") echo ("hi guest"); 
if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 

} 

?> 


이제 이 코드를 분석해보자.

<? 
if($_GET[no]) 
{ 

GET 메소드로 받은 no값이 있으면 다음을 실행한다.

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack");

넘겨받은 no값에 스페이스, /, (, ), 세로 탭, |, &, union, select, from, 0x가 포함되어 있으면 no hack을 띄워주고 종료한다.

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

select id from challenge18_table where id='guest' and no=[넘겨받은 값] 쿼리를 실행하여 $q에 배열의 형태로 저장한다.

if($q[0]=="guest") echo ("hi guest"); 

$q 배열의 첫번째 값(0)이 guest라면 hi guest를 띄워준다.

if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 

} 

?> 

$q 배열의 첫번째 값(0)이 admin이라면 문제를 해결하게 되며, hi admin!이 출력된다.


만약 우리가 저 칸에 1을 넣어준다면 다음과 같은 SQL문이 완성된다.

select id from challenge18_table where id='guest' and no=1


이 명령문을 실행했을때 다음과 같이 출력됨으로 보아 1에 해당하는 값은 guest이다.


그럼 admin은 0 또는 2일것으로 예상된다.

스페이스는 필터링 대상이니 HTML에서의 Line feed처리를 해주는 %0a값으로 fill해준다.


따라서 주소값에서 데이터를 ?no=0%0aor%0ano=2를 해주면 문제가 해결된다.




WEBHACKING.KR 18번 문제 클리어!