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번 문제 클리어!
'보안공부 > Webhacking.kr 풀이' 카테고리의 다른 글
webhacking.kr 25번 문제 풀이 - NULL TO FLAG (0) | 2018.07.18 |
---|---|
webhacking.kr 24번 문제 풀이 - FILTERED LOCALHOST (0) | 2018.07.17 |
webhacking.kr 17번 문제 풀이 - 콘솔계산기 (0) | 2018.07.10 |
webhacking.kr 14번 문제 풀이 - indexOf (0) | 2018.07.09 |
webhacking.kr 6번 문제 풀이 - 감싸고바꾸고 (0) | 2018.07.07 |