[LOS] gremlin

Yennytime·2023년 1월 12일
0

Lord of SQL Injection

목록 보기
1/20
post-thumbnail

<?php
  include "./config.php"; # config.php
  login_chk(); # 로그인 체크
  $db = dbconnect(); # DB 연결확인
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); # 데이터베이스에서 쿼리 조회
  if($result['id']) solve("gremlin"); # 조회한 쿼리의 결과에 ID가 있다면, 
  highlight_file(__FILE__); # 파일을 하이라이트 적용 상태로 출력
?>

🔺 코드 분석

  1. config.php (config = 구성)
    웹의 정보를 설정하는 부분과, CI의 라이브러리, 헬퍼, 드라이버 또는 CI의 기능 들의 사용여부를 설정
    config.php를 불러와 적용.
    config.php를 불러왔다고 config.php가 되는 게 아님.

  2. login_check()
    로그인 된 상태인지 확인

  3. dbconnect()
    데이터베이스에 연결

  4. if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
    GET방식으로 id를 받으며, id에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.

  5. if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
    GET방식으로 pw를 받으며, pw에 prob, _, ., () 가 들어있고, /i 대소문자를 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.

🔹 preg_match()

preg_match('/대조 할 문자/','입력한 문자', $matches); 
// $matches 뒤에 PREG_OFFSET_CAPTURE를 사용할 수 있다.
  • 패턴이란 일정한 형식을 의미하며, 패턴 검사에 사용
  • 특정한 문자를 필터링할 때 사용
  1. $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
    id와 pw 둘 중 하나를 참으로 만들어주면 해당 쿼리문을 우회 가능

  2. echo "<hr>query : <strong>{$query}</strong><hr><br>";
    $query를 불러옴 (6번 참고)

  3. $result = @mysqli_fetch_array(mysqli_query($db,$query));
    순번을 키로 하는 일반 배열과 컬럼명을 키로 하는 연관배열 둘 모두 값으로 갖는 배열을 리턴
    [일반배열 + 연관배열 = 결과값 리턴]

  4. if($result['id']) solve("gremlin");
    $result 값이 id 라면, 성공적으로 출력

  5. highlight_file(__FILE__);
    정의된 색상을 사용하여 포함된 코드의 구문 강조 버전을 반환


🔺 풀이 과정

  1. id=1&pw='1'or'1'='1'

위에 있는 쿼리를 보면 pw= 뒤에 처음과 마지막 작은 따옴표가 두 개가 생긴 것을 알 수 있다.

그 이유는 $query 변수에서 id와 pw에 작은 따옴표가 붙어 있기 때문이다.

  1. id=1&pw=1'or'1'='1

문제를 풀었다!

[참고한 블로그]

1
2
3

profile
It's Yennytime💙

0개의 댓글