webhacking/sql, sql injection

rubiya.kr 1번.

qkqhxla1 2014. 8. 28. 13:11

http://rubiya.kr/sqli/


딱봐도 rubiya님이 만든(맞겠죠?) sqli연습 코너입니다.


http://rubiya.kr/sqli/prob1.php


워게임 목적보다는 쿼리문이 어떻게 완성되는지 출력함으로써 시작하시는 분들이 원리파악을 더 쉽게


할수 있겠네요. 진짜 대회문제를 가져온 webhacking.kr보다 공부에는 더 도움이 될 거 같습니다....


<?php 
  
include "./dbconn.php"
  include 
"./solve.php"
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); #필터링 함수인 preg_match를 썼지만 굳이 select,substr등의 키워드를 필터링하기보다 내부 db나 information_schema등의 db자료를 못 쓰게하기위한 기본적인 필터링으로 보입니다..
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  
$query "select id from prob1 where id='{$_GET[id]}' and pw='{$_GET[pw]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) solve(); 
  
highlight_file(__FILE__); 
?>


GET방식으로 id와 pw를 받아서 필터링을 한다음 쿼리를 완성시켜 출력하고, 쿼리문을 db


에서 돌렸을때 결과가 존재하면 통과네요.


http://rubiya.kr/sqli/prob1.php?id=syn3ck&pw=syn3ck 처럼 GET방식으로 id,pw를 입력했을 경우 


쿼리문이 query : select id from prob1 where id='syn3ck' and pw='syn3ck'


로 완성되는걸 볼 수 있습니다. 


쿼리문에서 어떤 결과라도 나오면 성공인데, 쿼리문을 살펴보면 id와 pw가 모두 일치해야만


어떤 결과값이 나올수 있음을 예상할수 있습니다. 그런데 당연히 우리는 비밀번호를 모르니,


id만 일치하게끔 쿼리문을 만들어주고, pw는 주석문으로 막아버리면 될 것 같습니다.


대부분의 인젝션에 존재하는 계정인 guest로 테스트를 해보자면..


id = guest'#, pw=1234 등으로 하면 아래처럼 쿼리문이 완성되어 guest계정이 있으면 제대로


통과가 될 것으로 보입니다..


select id from prob1 where id='guest'#' and pw='syn3ck' 주석처리


GET방식으로 전달할 시에는


?id=guest'#&pw=guest 단순 이런식으로 URL을 전달하면 #이 URL에서 유효한 문자이기에 쿼리문


으로 전달이 되지 않으므로 #을 인코딩한 %23으로 전달을 하면


http://rubiya.kr/sqli/prob1.php?id=guest%27%23&pw=guest


성공했다고 나옵니다. MYSQL의 다른 주석인 -- ,(--뒤에 한칸 띔)이나 ;%00의 널값을 전달해도


제대로 인식하네요.

'webhacking > sql, sql injection' 카테고리의 다른 글

rubiya.kr 3번  (0) 2014.08.28
rubiya.kr 2번  (0) 2014.08.28
시간 기반 sql 인젝션.  (0) 2014.08.22
효율적인 블라인드 인젝션  (0) 2014.08.20
숫자 뽑아오기.  (0) 2014.08.19