2023. 8. 17. 17:22ㆍ보안/DVWA
SQL Injection
SQL Injection은 웹 애플리케이션에서 발생하는 보안 취약점 중 하나로, 악의적인 사용자가 애플리케이션의 입력 필드를 통해 SQL 쿼리를 주입하여 데이터베이스를 조작하거나 노출시키는 공격이다.
실습
Low 레벨부터 도전해보자.
SQL문에서 아래와 같이 입력했을 때, SQL syntax 에러가 난다면 SQL Injection에 취약하다는 것을 알 수 있다.
소스코드는 다음과 같다.
id가 홑따옴표(')로 둘러싸였으니 처음과 끝에 홑따옴표(')를 제거한 채로 항상 참이 SQL 구문을 입력해보자!
항상 참인 구문이 입력됐기 때문에 모든 데이터 값이 출력됨을 확인할 수 있다
이번엔 1' union select 1#을 입력해보자! 이때 샵(#)은 주석처리 기능과 관련된다.
입력하면 위와 같이 열의 수가 다르다는 것을 알 수 있다.
2까지 추가하여 명령어를 입력하면 결과값이 나온다. 즉, 열의 수는 2이다.
다른 방법으로 열의 수를 알기 위해 order by를 활용할 수 있다.
아래와 같이 2까지는 결과값이 출력되므로 열의 수가 2 이상임을 알 수 있다.
하지만 1' order by 3 #을 입력하면 아래와 같이 3번째 열이 없기 때문에 오류를 반환한다.
1' union select schema_name, 1 from information_schema.schemata #와 같이 명령어를 입력해보자. mySQL에서 information_schema.schema에는 다른 DB에 대한 정보도 담겨있다. 이를 이용하여 다른 데이터베이스들의 이름들을 알 수 있다.
1' union select table_schema, table_name from information_schema.tables where table_schema='dvwa' #와 같이 명령어를 입력하면, DB dvwa 안에 있는 테이블명들도 알 수 있다.
1' union select user, password from users #와 같이 명령어도 입력하면 각 계정명과 비밀번호를 알 수 있다. 이때 비밀번호는 MD5로 암호화 되어 있다.
아래 사이트에서 간단한 MD5의 값을 복화할 수 있다.
Best MD5 SHA1 Decrypt | Encrypt | Crack | Decode | Hash Toolkit
Decrypt MD5 & SHA1 password hashes with Hash Toolkit. Search the database of billions of reversed hashes.
hashtoolkit.com
복호화 결과 admin 계정의 비밀번호는 'password'임을 알 수 있었다!
medium 난이도를 도전해보자!
홑따옴표(')가 사라졌음을 알 수 있다. 대신 입력 방식이 제한되어 있다.
burp suit에서 intercept 기능을 on으로 켜고 1을 제출해보자.
기존에 입력방식이 제한되어 있었지만 intercept를 통해 전송 데이터를 조작할 수 있다.
1 union select user, password from users #
와 같이 입력하면 Low 난이도에서 처럼 각 계정의 비밀번호를 md5로 암호화해서 알 수 있다.
high 레벨도 살펴보자. 홑따옴표(')가 다시 생기고 앞의 한글자만 입력되도록 제한되어 있다.
1' or '1' = '1' #
을 입력하면 샵(#)을 통해 뒤를 주석처리 할 수 있다. 즉, limit을 풀 수 있어 간단하게 정보들을 조회할 수 있다.
위에서와 비슷하게
1' union select user, password from users #
을 입력하면 md5로 암호화된 각 계정의 비밀번호도 알 수 있다.
불가능 난이도에서는 어떻게 소스코드를 짰는지 확인해보자!
주어진 id가 숫자인 경우만 데이터를 반환함을 확인할 수 있다. 주목할만한 함수 3가지를 살펴보자. 각 함수는 데이터베이스 작업을 보다 안전하게 수행하고, 성능과 보안 면에서 이점을 제공하기 위해 사용한다.
prepare()
SQL 문을 미리 준비하여 나중에 실행하기 위한 준비 단계를 수행하는데 사용한다. 준비된 문(statement)은 나중에 반복해서 실행하기 위해 컴파일된 형태로 저장한다. 이렇게 함으로써 SQL Injection과 같은 보안 문제를 줄일 수 있다.
bindParam()
준비된 문(statement)에 바인딩할 매개 변수를 설정한다. 바인딩된 매개 변수는 나중에 실행할 때 실제 값을 할당한다. bindParam() 메서드는 변수의 참조를 전달하므로, 변수 값이 변경될 때 바인딩된 값도 함께 변경된다.
execute()
준비된 문(statement)을 실행하는 데 사용한다. execute()를 호출하면 미리 준비한 SQL 문이 실행되고, 바인딩된 매개 변수에 할당된 값이 사용된다.
'보안 > DVWA' 카테고리의 다른 글
XSS(Stored) (0) | 2023.08.18 |
---|---|
XSS(Reflected) (0) | 2023.08.18 |
File Upload (0) | 2023.08.17 |
File Inclusion (0) | 2023.08.17 |
CSRF (0) | 2023.08.17 |