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
