[목차]

 

 

1. 분석

2. 참고

 

 

https://los.rubiya.kr/

 

 

 

 


 

 

 

1. query : select id from prob_gremlin where id='' and pw=''

 

 

<?php
  include "./config.php";
  login_chk();
  $db  = dbconnect();

  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attakc another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

  $query = " Select * from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";

  $result = @mysql_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("greblin");
  highlight_file(__FILE__);  
?>

 

 

 

 

 

 

 

[분석]

 

 

_ . () 세 종류의 기호가 필터링 되고 있고

id 값은 무엇을 넣어도 문제가 해결된다고 한다.

 

 

이 경우 암호 부분은 생각할 것도 없이

SQL Injection의 대표적 쿼리인

' or '1'='1' --

를 조금 변경해 사용하면 된다.

 

 

or 연산으로 값을 참으로 만들어 주면

암호 부분은 별도 입력이 필요 없으니

주석 처리를 위해 # 을 넣어준다.

 

 

하지만 # 문자가 필터링 되고 있어

query에 출력이 되지 않는다.

 

 

이럴 경우 해당 문자를

URL encoding으로 변환해 넣어주면 된다.

# = %23

 

 

정답은

?id=takudaddy' || 1=1 %23

 

 

 

 


 

 

 

[참고]

 

 

?id=takudaddy' or 1=1 %23

입력해도 같은 결과인데 or 대신 || 를 입력한 이유는

많은 경우 'or'이란 키워드를 필터링하기 때문.

 

이럴 경우를 대비해 비교적 덜 알려진 키워드나

함수 등을 사용하는 습관을 들이도록 하고

 

SQL Injection 문제는

시스템에서 필터링하고 있는 문자들이

무엇인지 파악하는 것이 중요하다.

 

 

 

 

 

 

728x90

+ Recent posts