Hack The Box/Lab

Appointment - sql injection

YujinSec 2026. 4. 29. 17:00

1. 기본 개념
0] nmap 옵션
-sC: --script=default와 동일함. 해당 포트에 추가정보도 물어와 줌. 
 
-sC 적용 X

 
> -sC 적용 O

 
*debian: 리눅스 배포판 os
 
1] sql 데이터베이스
sql: structured query language = 데이터 조작하는 언어
 
구조)
sql 서비스 > db > tables > data = 행/열 
 
동작 방식)
1: 로그인
> 사용자가 아이디/비번 조합 제출
> sql 서비스가 받음
> sql쿼리를 던저 db와 비교
> 일치하면 웹 어플리케이션에 전달
> 웹 어플리케이션은 사용자를 로그인시킴 > 제한 영역 접근 가능!
 
2: 권한 정보 부여
사용자에게 쿠키 or 인증 토큰 부여함
- 웹 서버 & 브라우저 둘 다 저장됨
 
3: 사용자의 검색
> 검색창에 객체 이름 입력
> sql 쿼리 실행
> 존재하면 조회!
 
2] sql 인젝션
: 사용자 입력 데이터를 조회하거나 저장해주는 sql문을 사용해 웹페이지를 공격하는 방법
 
- OWASP Top 10에 속함
- 아래 코드는 이번 문제에 사용된 php코드인데, 기본적인 db 쿼리문을 잘 정리해둔 것 같아 넣음. 

<?php
mysql_connect("localhost", "db_username", "db_password"); 
# SQL 데이터베이스에 연결.

mysql_select_db("users"); 
# 사용자 정보가 저장된 데이터베이스(또는 테이블) 선택.

$username=$_POST['username']; 
# 사용자가 입력한 username 값.

$password=$_POST['password']; 
# 사용자가 입력한 password 값.

$sql="SELECT * FROM users WHERE username='$username' AND password='$password'";
# DB에서 아이디/비밀번호를 조회하는 SQL 쿼리 생성.

$result=mysql_query($sql);
# $sql에 저장된 쿼리를 실행하고 결과를 $result에 저장.

$count=mysql_num_rows($result);
# $result에 저장된 행(row)의 개수를 $count 변수에 저장.

if ($count==1){
# 결과가 정확히 1개라면(일치하는 계정 존재):

$_SESSION['username'] = $username; 
# 입력한 username으로 세션 생성.

$_SESSION['password'] = $password; 
# 입력한 password로 세션 생성.

header("location:home.php"); 
# 홈 페이지로 이동.
}
else {
# 일치하는 아이디/비밀번호 조합이 없다면:

header("location:login.php");
# 로그인 실패 → 로그인 페이지로 이동.
# HTTP 응답 코드는 200 OK 상태로 처리될 수 있음.
}
?>

 
공격)
#: 주석 처리하기 (주석은 -- 도 가능함)
' : 감싸기
 
방어)
- 정규 표현식 검사
- 특수문자 필터링
- 이스케이프 처리
- 매개변수화된 쿼리 사용
 
3] http
http = hypertext transfer protocol
- 웹 브라우저 - 서버 간 통신을 위한 응용 계틍 프로토콜임. 
- html같은 문서 전송 시 사용됨
 
apache http server)
: 물리/가상 웹 서버
>>
80/TCP: 기본 HTTP포트
443/TCP: HTTPS 포트
8080/TCP, 8000/TCP: 대체 HTTP 포트
 
브라우저 <-> HTTP 서버(아파치) 
요청: 브라우저 -> 서버 (=request. GET/POST)
응답: 서버 -> 브라우저(=response. 상태코드 포함)
 
상태코드)
HTTP/1.1 200 OK: 정상 전송O
HTTP/1.1 404 Not Found: 페이지/리소스 못 찾음
HTTP/1.1 302 Found: 페이지/리소스 존재는 함. BUT 다른 디렉터리/URL로 임시 이동됨 (=redirect)
> 302는 브라우저의 location헤더에 지정된 새로운 url로 동일한 2 번째 요청을 보내라는 뜻임. 
 
4] 브루트 포싱 - Gobuster
url에 대한 워드리스트(=준비된 변수 목록)을 활용해 브르투 포싱을 진행하여, 응답에 200 코드가 오는 결과를 알려주는 툴. 
즉 해당 디렉토리 경로가 존재하는지/아닌지 알려준다. 
 
- 언어: Go (=Golang, 구글에서 설계)
- 정적임
- select문 지원
 
워드리스트: 페럿 os에는 기본 설치됨.
> /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
 
옵션)
- dir: 웹 디렉터리 조사 모드 => 웹 페이지 안의 하위 경로 찾기.             ex) example.com/admin
- dns: 서브도메인 탐색 모드 => 도메인 앞에 붙는 하위 도메인 찾기(서버 내부의 폴더가 아닌, 다른 호스트/서비스를 찾는 것임)          ex) admin.example.com
- --url: http 서버가 시랭 중인 대상 시스템의 웹 주소(=url) 지정
- --wordlist: 워드리스트 지정
 
 
2. 문제풀이
 
DB버전에 대한 취약점 검색도 좋은 방법!
 
1) dir-busting 시도
=> 실패!

 
2) 로그인 우회
1. 가장 흔한 조합 시도해보기
admin:admin
guest:guest
user:user
root:root
administrator:password
 
2. 로그인 브르투 포스 돌리기
=> 이건 비추라 함,, 
why? 넘 오래 걸림 & 보호 조치 있을지도,,
 
3. 로그인 form에서 sql 인젝션 취약점 찾기

그냥 대표적인 sql 인젝션을 시도해보면 된다. admin이라고 관리자 계정 명 치고, 따옴표로 묶어버리고, 뒤 비번 체크는 주석 처리해주면 된다. 

 

'Hack The Box > Lab' 카테고리의 다른 글

Crocodile -wappalyzer  (0) 2026.04.30
Sequel - dbms: mysql  (0) 2026.04.29
Markup  (0) 2026.04.12
Archetype  (1) 2026.04.12
Synced - rsync(ftp의 암호화)  (0) 2026.03.28