[STARTING_POINT] Tier1 Appointment

Task 1
What does the acronym SQL stand for? SQL이라는 약자는 무엇을 의미하나요?

구글에 검색해보면 SQL은 Structured Query Language 라고 나옵니다.
- SQL : 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계한 특수 목적의 프로그래밍 언어이다.
Task 2
What is one of the most common type of SQL vulnerabilities? 가장 흔한 SQL 취약점 유형 중 하나는 무엇인가요?

구글에 검색해보면 SQL Injection이 가장 흔한 SQL 취약점 유형임을 알 수 있습니다.
Task 3
What is the 2021 OWASP Top 10 classification for this vulnerability? 이 취약점은 2021 OWASP Top 10에서 어떤 분류에 해당하나요?


OWASP(Open Web Application Security Project)에서 발표한 2021년 top 10 웹 애플리케이션 취약점 중 Injection을 A3에 두었습니다.
정답 : A03:2021-Injection
Task 4
What does Nmap report as the service and version that are running on port 80 of the target? 대상의 80번 포트에서 실행 중인 서비스와 버전을 Nmap은 무엇이라고 보고하나요?
확인을 위해 nmap 스캔을 수행합니다.
sudo nmap -p 80 -n -Pn -sV --min-rate 2000
- 포트 80번, DNS 조회와 host discovery를 스킵, 버전 정보 조회, 초당 2000패킷 전송
┌──(kali㉿kali)-[~]
└─$ sudo nmap 10.129.10.127 -p 80 -n -Pn -sV --min-rate 2000
[sudo] password for kali:
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-23 11:37 +0900
Nmap scan report for 10.129.10.127
Host is up (0.21s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.38 ((Debian))
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.03 seconds
머신의 tcp/80 에서 돌아가고 있는 서비스의 버전은 Apache httpd 2.4.38 ((Debian)) 입니다.
Task 5
What is the standard port used for the HTTPS protocol? HTTPS 프로토콜에서 사용하는 표준 포트는 무엇인가요?

구글에 검색해보면, HTTPS 프로토콜이 사용하는 표준, 기본 포트는 443 인 것을 알 수 있습니다.
- HTTPS (HyperText Transfer Protocol Secure)
- 평문으로 데이터를 주고받는 HTTP와 다르게 TLS를 사용하여 데이터를 암호화하고 보다 안전하게 통신하는 프로토콜
- TLS (Transport Layer Security) 역할
- 데이터 암호화, 위변조 방지, 서버(또는 클라이언트) 신원 확인
Task 6
What is a folder called in web-application terminology? 웹 애플리케이션 용어에서 폴더를 무엇이라고 부르나요?
folder는 사용자 친화적 표현을 의미하고, 웹 애플리케이션/시스템/리눅스/서버 관점에서는 더 정확한 용어로 directory 라고 부릅니다.
Task 7
What is the HTTP response code is given for ‘Not Found’ errors? ‘Not Found’ 오류에 해당하는 HTTP 응답 코드는 무엇인가요?

구글에 검색해보면, not found 오류의 응답 코드는 404 임을 알 수 있습니다. (일상 생활에서 자주 볼 수 있는 코드)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status
- 위 링크에서 다양한 응답 코드에 대한 설명을 확인할 수 있습니다.
Task 8
Gobuster is one tool used to brute force directories on a webserver. What switch do we use with Gobuster to specify we’re looking to discover directories, and not subdomains? Gobuster는 웹서버의 디렉터리를 브루트포싱할 때 사용하는 도구 중 하나입니다. 서브도메인이 아니라 디렉터리를 찾겠다고 지정할 때 사용하는 Gobuster 옵션은 무엇인가요?
gobuster의 도움말을 확인해보면,
┌──(kali㉿kali)-[~]
└─$ gobuster --help
NAME:
gobuster - the tool you love
USAGE:
gobuster command [command options]
VERSION:
3.8.2
AUTHORS:
Christian Mehlmauer (@firefart)
OJ Reeves (@TheColonial)
COMMANDS:
dir Uses directory/file enumeration mode
...
directory/file enumeration 을 하기 위해서는 dir 옵션을 사용하면 됩니다.
- dir 옵션을 사용하여 Directory Busting 해보기
gobuster dir -u http://10.129.10.127 -w /usr/share/wordlists/dirb/common.txt
-
-u: url 을 지정할 때 사용합니다. -
-w: wordlist를 지정할 때 사용합니다.- kali linux를 기준으로 wordlist는
/usr/share/wordlists내부에 존재하며, github에 Seclist와 같은 커스텀 리스트를 사용하기도 합니다.
- kali linux를 기준으로 wordlist는
-
결과
┌──(kali㉿kali)-[~] └─$ gobuster dir -u http://10.129.10.127 -w /usr/share/wordlists/dirb/common.txt =============================================================== Gobuster v3.8.2 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://10.129.10.127 [+] Method: GET [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirb/common.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.8.2 [+] Timeout: 10s =============================================================== Starting gobuster in directory enumeration mode =============================================================== .hta (Status: 403) [Size: 278] .htaccess (Status: 403) [Size: 278] .htpasswd (Status: 403) [Size: 278] css (Status: 301) [Size: 312] [--> http://10.129.10.127/css/] fonts (Status: 301) [Size: 314] [--> http://10.129.10.127/fonts/] images (Status: 301) [Size: 315] [--> http://10.129.10.127/images/] index.php (Status: 200) [Size: 4896] js (Status: 301) [Size: 311] [--> http://10.129.10.127/js/] server-status (Status: 403) [Size: 278] vendor (Status: 301) [Size: 315] [--> http://10.129.10.127/vendor/] Progress: 4613 / 4613 (100.00%) =============================================================== Finished ===============================================================
Task 9
What single character can be used to comment out the rest of a line in MySQL? MySQL에서 한 줄의 나머지 부분을 주석 처리할 때 사용할 수 있는 단일 문자는 무엇인가요?
MySQL 공식 문서에서는 —- 와 # 을 이용하여 주석 처리를 할 수 있다고 나와있습니다. 문제에서는 단일 문자라고 하였으니 정답은 # 입니다.
Task 10
If user input is not handled carefully, it could be interpreted as a comment. Use a comment to login as admin without knowing the password. What is the first word on the webpage returned? 사용자 입력이 적절히 처리되지 않으면 주석으로 해석될 수 있습니다. 비밀번호를 모른 채 admin으로 로그인하기 위해 주석을 사용하세요. 그 후 반환되는 웹페이지에서 첫 번째 단어는 무엇인가요?
해당 머신에서는 http web service가 돌아가고 있으니 접속을 해보면,

로그인 페이지가 나옵니다.
우선 초기 계정이나 기본 계정들을 어느 정도 유추해서 로그인 시도를 해볼 수 있는데,
- admin : admin
- admin : password
- root : root
- etc
모두 실패하게 됩니다.
admin 유저로 로그인에 성공하기 위해서는 SQL Injection을 시도해볼 수 있습니다.
SQL Injection은 사용자의 입력이 그대로 SQL 명령에 입력이 들어가 실행되는 취약점을 말하는데, 하까 gobuster의 결과로 index.php 와 같은 파일이 있는 것으로 보아 php로 동작하는 웹사이트 임을 알 수 있습니다.
유저의 정보를 담고 있는 DB(MySQL)를 php에서는 다음과 같이 다룹니다.
- mysql_connect() : mysql에 접근 가능한 유저의 계정을 인자로 사용하여 mysql에 접근
- mysql_select_db() : 접근한 DB의 데이터 베이스 선택
- 유저 입력(username, password)
- sql 구문에 유저 입력을 치환
- DB와 상호작용
- 최종 결과를 반환
여기서 SQL 구문에 사용자 입력을 넣는 과정에서 필터링이나 바인딩 처리가 되지 않는다면, 사용자의 입력이 그대로 SQL 구문에 영향을 끼칠 수 있습니다.
대표적으로 다음과 같은 구문이 있을 때,
SELECT * FROM users WHERE username='$username' AND password='$password'
$username 과 $password 부분에 유저의 입력이 들어가게 됩니다.
이때 사용자가 DB에 존재하는 유저(admin)의 이름을 알고 있으니 이를 입력 후 싱글 쿼터(’)를 사용한다면 username의 입력은 끝나게 됩니다.
SELECT * FROM users WHERE username='**admin'**' AND password='$password'
하지만 여기까지만 입력하면 문법에 맞지 않아 오류를 반환하거나 아무런 반응을 하지 않을 수 있습니다.
뒷 구문에서 오류가 발생하고 있기도 하고, 패스워드의 조건부를 무시하기 위해 아까 입력한 admin'에 주석을 넣어볼 수 있습니다.
SELECT * FROM users WHERE username='**admin'#**' AND password='$password'
그렇게 되면 서버에서 처리할할 최종 구문은 다음과 같이 나옵니다.
SELECT * FROM users WHERE username='admin'
users 라는 테이블에서 username이 admin인 유저의 정보를 전부 가져올 수 있게 됩니다.

실제로 로그인을 진행해보면,

로그인에 성공하는 모습을 볼 수 있습니다.
문제에서 말한 로그인 성공 후 화면에 보이는 문자열은 Congratulations 입니다.
Submit Flag
Submit root flag
Flag : e3d0796d002a446c0e622226f42e9672
← ALL POSTS