[LOS] gremlin

덩덩..·2024년 9월 19일

Lord of SQL Injection

목록 보기
1/6

LOS는 SQL Injection문제들을 모아둔 워게임 사이트
flag를 찾는 게 아니라 url 파라미터에 직접 공격하는 형식

첫 화면

전체 코드

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  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");
  highlight_file(__FILE__);
?>

필요 개념

preg_match()
$result = preg_match($pattern, $subject)

해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색. 즉, 문자열을 검색하는 함수이다.
첫번째 파라미터 - 검색하고자 하는 패턴
두번째 파라미터 - 해당 문자열
세번째 파라미터 - 반환값이 저장될 배열 (필수 X)

패턴임을 알리기 위해 앞, 뒤를 슬래시(/)로 묶어야 한다.
마지막 슬래시 뒤에 옵션을 줄 수 있다. i는 대소문자를 구분하지 않는다는 뜻이다.

플래그설명
i검색 패턴 비교 시 대소문자 구분X 설정
g검색 패턴 비교 시 일치하는 모든 부분 선택 설정
m검색 패턴 비교 시 여러 줄 입력 문자열을 그 상태 그대로 여러 줄로 비교하도록 설정
y대상 문자열의 현재 위치부터 비교 시작하도록 설정
u대상 문자열이 UTF-8로 인코딩 된 것으로 설정

코드 설명

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 ~_~");

preg_match를 통해 필터링한다. $_GET[id], $_GET[pw]로 입력받은 id와 pw에서 'prob', '_', '.', '\' 값이 있다면 "No Hack ~_~"로 나가게 되어있다.

GET방식으로 입력값을 받아 URL 파라미터에 입력값이 노출될 수 있다.

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

데이터베이스에서 입력받은 id와 pw를 찾아 $query변수에 저장한다.

$result = @mysqli_fetch_array(mysqli_query($db,$query));

$query값을 result에 저장한다.

  if($result['id']) solve("gremlin");

$result['id']에 값이 들어오면 해당 문제를 풀 수 있다. 이 값이 참이되면 문제가 풀리니까 간단하게
sql 인젝션으로 or 1=1을 사용하면 될 것이다.
그러고 pw값은 주석처리를 해주면 된다.

?id=1' or 1=1#

형태로 url에 넣을 것이기 때문에 #을 인코딩한 값인 %23으로 바꿔준다.

?id=1' or 1=1%23

0개의 댓글