LOS Level 01번 문제를 풀어보자.
풀이 과정
1. $_GET[id] 와 $_GET[pw] 를 통해 id와 pw를 사용자 입력값으로 받고 있다.
2. preg_match() 함수는 $_GET[id]와 $_GET[pw]로부터 입력받은 값에서 'prob', '_', '.', '\' 값이 있을 시 No Hack~_~ 화면으로 넘어가게 된다. 그러므로 필터링되는 값을 우회해서 공격해야 한다.
문제에서 입력값을 GET 방식으로 받는다. GET 방식으로 받게 되면 URL에 입력값이 그대로 노출된다.
→ 그래서 GET 방식은 입력값에 대해 보안이 필요없거나 빠르게 전송 시 사용한다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
정규 표현식(regular expression)이란?
문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다.
preg_match() 함수?
php 에서 자주 사용하는 함수로, 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색한다.
preg_match($pattern, $subject, $matches); |
첫 번째 인수 : 정규표현식 작성
'/admin/'i 이렇게 i가 붙는 경우 대소문자를 구분하지 않는다는 뜻
두 번째 인수 : 검색 대상 문자열
세 번재 인수 : 패턴 매치에서 매칭된 값을 배열로 저장. 매칭 성공 시 1, 실패 시 0이 반환
3. 다음 문장은 입력받은 id와 pw를 값을 찾아서 $query 변수에 저장하는 쿼리문이다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
4. 값을 찾은 쿼리문을 출력하고, $result['id']에 값이 있으면 문제를 풀 수 있다.
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
풀이
값을 넣을 때는 URL 끝에 ?id = 값&pw=값 이런 식으로 넣어주면 된다.
id를 사용자 입력값으로 받으므로, 어떤 값을 넣어 거짓으로 만들어주고 뒷부분을 참으로 만들어준다.
쿼리문을 select id from prob_gremlin where id='' or 1=1-- ' and pw='' 이렇게 해준다.
where id='' 는 거짓(아무값을 넣어줘도 된다) 이 되고, or 1=1 은 무조건 참이 되고, 뒷 부분(pw)은 -- 주석처리를 해줌으로써
$query는 참이 되므로 문제가 풀린다.
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=' or 1=1--%20 |
답
GREMLIN Clear!가 뜨게 된다.

알게된 점
주석 처리시, or 1=1 -- 띄어쓰기를 무조건 해줘야하는데 URL에서 공백이 먹히지 않을 때는 공백을 인코딩된 값인 %20으로 입력해주면 된다.
문제 풀이 사이트
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
[Lord of SQLInjection] Level04 write-up (0) | 2021.10.14 |
---|---|
[Lord of SQLInjection] Level03 write-up (0) | 2021.10.14 |
[Lord of SQLInjection] Level02 write-up (0) | 2021.10.14 |
댓글