※ 작년 말 ~ 올해 초에 작성한 라이트업으로 사이트 개편 전의 문제가 섞여있습니다.  ※ 

 

 

 

 

문제 하단의 ‘index.phps’를 클릭하면 하단의 코드가 나온다.

 

 

 

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!"); 
} 

} 

 

 get 방식으로 no의 값을 받으면 아래의 코드들이 실행되게 된다. 그리고 만약 입력 받은 값에 공백, /, \(, \), \t, |, &, union, select, from, 0x 등의 문자열이 있을 경우 exit에 의해 종료된다. 그리고 쿼리문의 결과 데이터를 배열 형식으로 저장해서 배열의 첫번째 데이터가 “admin”이라면 문제가 풀리게 된다. 임의로 숫자를 대입해보자.

       

 

임의로 0, 1, 2를 대입해보았다. 주소에 no=0, no=1, no=2 형식으로 들어가게 되고, 1을 대입했을 때 ‘hi guest’라고 뜨는 것을 볼 수 있다. select id from challenge18_table (where((id=’guest’) and (no=1)))이라는 쿼리문이 실행되면 q[0]guest라는 문자열이 저장되는 것이다. 그렇다면 특정 no 값에 ‘admin’ 데이터를 담고 있을 것이다. 이때 공백을 넣을 경우 조건문이 종료되므로 공백을 무시하는 ‘%0a’를 사용해야 한다.

 

 

 

no=2%0aor%0ano=2를 입력하면 idguest이고 no=2이거나(거짓, 1을 제외한 아무 값이나 넣어도 된다.), no2인 값을 쿼리문에 저장하게 된다. no=2인 값에 ‘admin’ 데이터를 담고있는 것이다.

728x90

'CTF > 웹 해킹' 카테고리의 다른 글

webhacking.kr challenge 20  (0) 2020.06.26
webhacking.kr challenge 19  (0) 2020.06.26
webhacking.kr challenge 17  (0) 2020.06.26
webhacking.kr challenge 16  (0) 2020.06.26
webhacking.kr challenge 15  (0) 2020.06.26