webhacking/sql, sql injection

rubiya.kr 20번.

qkqhxla1 2014. 9. 4. 12:53

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


<?php 
  
include "./dbconn.php"
  include 
"./solve.php"
  if(
preg_match('/prob|_|\.|\(\)|#|-/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(
strlen($_GET[pw])>6) exit("No Hack ~_~"); 
  
$query "select id from prob20 where pw=('{$_GET[pw]}') and id!='admin'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) solve(); 
  
highlight_file(__FILE__); 
?>


길이가 6자를 넘으면 안되고, #,-주석문이 필터링.


기본 쿼리문 : select id from prob20 where pw=('') and id!='admin'


id가 존재하기만 하면 클리어랬으니 union으로 값을 만들어주거나 항상 참으로 만들어줘서


다른값을 뽑아내면 됨. 6글자를 넘어가면 안되니 union은 못쓴다고 생각해보면.


''도 숫자와 비교가 가능하다는걸 생각해냄.




이런식으로 ''는 숫자 0으로 취급되서 비교됨.


하지만 괄호 씌운거와 안씌운 차이가 존재.




mysql은 왼쪽부터 연산이 진행됨. pw=''<2; 는


(pw='')<2; 이고,  pw=''의 결과는 0.(pw가 ''인 열이 있던 없던 pw=''의 값은 0.) 그리고 0<2;는 항상 


참이므로 모든 열의 결과가 반환.


하지만 pw=(''<2); 는 pw=(0<2);가 되고, pw=true; 로 변하며 pw=1이라고 변환된다.(true는 숫자로 


치면 1) 그러므로 pw=1인 결과의 열이 출력된다.


20번에 대입해서 생각해보면


select id from prob20 where pw=('') and id!='admin' 에서 '>2)등으로 pw에 입력


후 뒷부분을 막아버리면 성공. 


query : select id from prob20 where pw=(''>2);') and id!='admin'


)뒤의 ;는 ;%00으로 이것도 주석문 대신 쓸 수 있다.


http://rubiya.kr/sqli/prob20.php?pw=%27%3E2);%00



------------------------------------------------


지금 와서 추가하는데 (15년 2월 10일) 내가 저건 푼건 우연인것같다. 동료와 삽질해본결과


('')<2;%00 처럼 푸는게 제작자님 의도 같다.... (''>2);%00의 경우에는 pw=0인 컬럼이 없으면


답으로 인정이 절대로 안된다....

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

rubiya.kr 15번.  (0) 2014.09.06
webhacking.kr 13번.  (2) 2014.09.04
mysql max,min함수  (0) 2014.08.31
mysql 이상한 주석문  (0) 2014.08.31
webhacking.kr 9번.  (16) 2014.08.31