안녕하세요 이번에 풀어볼 문제는 Light 입니다.
https://tryhackme.com/r/room/lightroom
Light
Welcome to the Light database application!
tryhackme.com
처음에 주어진 자료는 타겟의 IP이고 netcat을 이용하여 해당 IP와 연결하고 admin과 최종 flag를 찾아내는 문제입니다.
우선 타겟 IP에 netcat을 이용하여 통신해봅시다.
일단 문제에서 하라는 대로 진행하면 Password를 줍니다.
하지만 이는 문제의 답에는 일절 도움을 주지 않습니다.
해당 IP에 브라우저에 접속을 하거나 nmap을 이용해 scan을 진행하더라도 어떠한 정보를 얻을 수 없었습니다.
이번에는 하염없이 나오는 Please enter your username: 에 SQL Injection 취약점을 확인해봅시다.
SQL Injection 취약점을 간단하게 확인 할 때 좋은 1' or '1'='1 을 입력해봅시다.
그렇게 되면 위에 나온 값과는 다른 Password가 나오게 됩니다.
여기서 1' or '1' = '1 을 입력하는 이유는 조건을 항상 참으로 만드는 SQL Injection에서 흔히 사용하는 기법입니다.
예를 들어 대부분 query문의 경우
SELECT name, email FROM users WHERE id = '입력받은 문자열'
이러한 형태로 되어 있습니다.
허나
1' or '1'= '1 을 넣게 되면
SELECT name, email FROM users WHERE id = '1' or '1'= '1'
이라는 항상 조건이 참이 되기 때문에 모든 사용자의 이름(name)과 이메일(email)이 공격자에게 전달되게 됩니다.
이제 우리는 누군지 모르는 user의 password와 SQL Injection에 취약함을 알았으니 이를 이용하여 더 많은 정보를 찾아봅시다.
에러가 나옵니다. 일단 타겟 IP가 특정 키워드나 구문을 필터링하고 있다는 것을 보여주고 있습니다.
이를 우회하기 위해 대문자 소문자를 뒤죽박죽으로 입력해줍시다.
역시 우회를 위해 대소문자를 뒤죽박죽으로 입력하니 성공하였습니다.
원본의 경우
1' UNION SELECT name FROM sqlite_master WHERE type='table 입니다.
1' 의 경우 문자열 레터럴 종료이고
UNION SELECT name FROM sqlite_master WHERE type='table 에 대해 자세히 설명해드리겠습니다.
1) SELECT, FROM, WHERE
우선 database에서 자주 사용되는 SELECT FROM WHERE에 대해 먼저 설명하겠습니다.
이는 employees table입니다.
SELECT name FROM employees; 를 하게 되면
employees table에서 name 컬럼에 해당하는 Alice, Bob, Charlie etc를 갖고 옵니다.
SELECT name FROM employees WHERE department = 'HR'; 를 하게 되면
employees table에서 name 컬럼에 해당 하는 이름들 중 department가 HR인 것들만 갖고 오게 됩니다. (Alice, Diana)
2) UNION
UNION은 합집합으로 2개의 SELECT 구문의 결과를 모두 포함시키는 키워드 입니다.
예를 들어 SELECT name, email FROM users WHERE ID='1' UNION SELECT name, pw FROM users#'
이 경우 앞의 SELECT 구문에 의해 출력될 ID가 1인 사용자 정보 외에도, 뒤의 SELECT 구문에 결과를 같이 포함하게 됩니다.
뒤의 SELECT 구문에는 WHERE가 따로 없기 때문에 users 테이블에 존재하는 모든 사용자의 이름(name)과 비밀번호(pw)의 결과로 반환됩니다.
3) FROM sqlite_master WHERE type='table
FROM sqlite_master WHERE type='table 에 대해 자세히 말씀드리자면
sqlite_master는 SQLite에서 데이터베이스 구조를 탐색할 때 자주 사용하는 시스템 테이블입니다.
만약 해당 데이터베이스가 SQLite로 만들어진것이 아니라면
MySQL에서는 INFORMATION_SCHEMA.TABLES를 사용하면 됩니다.
결론적으로 1' UNION SELECT name FROM sqlite_master WHERE type='table 의 경우
sqlite_master table에서 모든 table의 이름을 조회하는 쿼리가 됩니다.
결론적으로 우리는 admintable이라는 결과 값을 얻었습니다.
이를 이용해 해당 table에 있는 username을 조회해봅시다.
우리는 새로운 username을 획득하였습니다.
여기서 WHERE username LIKE '%'를 사용하고 있는데
LIKE는 query문에서 문자열 패턴 매칭에 사용되고 %의 경우 LIKE 연산자에서 사용되는 와일드 카드입니다.
예를들어 LIKE 'abc%' 라면 abc로 문자열이 abc로 시작되는 모든 값이 되고
LIKE '%abc%'라면 문자열이 어느 위치에든 abc가 포함된 데이터를 찾는 방식이 됩니다.
LIKE '%' 의 경우 모든 문자열과 일치하는 경우를 찾게 되기 때문에 결론적으로는 admintable에서 username 컬럼의 모든 값을 찾아오게 됩니다.
이번에는 새로 얻게 된 username의 Password를 여태까지 사용했던 UNION을 이용한 SQLInjection을 통해 획득해봅시다.
이렇게 새로 얻게된 username의 Password까지 습득했다면 우리는 2번째 문제까지 답을 제출할 수 있습니다.
마지막으로 최종 flag를 찾아봅시다.
처음과 같이 Please enter your username에 방금 얻은 username을 입력하면 Username not found라는 결과가 나옵니다.
뭔가 최종 flag를 찾으려면 다른 방법을 생각해야 합니다.
그렇다면 새롭게 찾은 username외에도 다른 user가 있을 수 있다는 가정하에 다른 user를 찾아봅시다.
역시 flag라는 user가 있었습니다.
마지막으로 SQL Injection으로 flag 답까지 얻어내며 문제는 마무리 됩니다.
이번 문제는 간단하다보니 글 분량도 작은거 같습니다.
'보안 프로젝트' 카테고리의 다른 글
[TryHackMe] The Blob Blog 문제풀이 -- 중 kali linux 고장남 (0) | 2025.02.05 |
---|---|
[TryHackMe] CyberLens 문제풀이 (0) | 2025.01.25 |
[TryHackMe] Silver Platter 문제풀이 (0) | 2025.01.16 |
[TryHackMe] Enumeration & Brute Force 문제풀이 (0) | 2025.01.13 |
공공 와이파이에서 칼리 리눅스(Kali Linux)에서 ARP Spoofing 공격 구현 (3) | 2024.05.19 |