❓ 공격 개요
SQL Injection 공격 개요
> SQL Injection 공격은 웹 서버 영역의 데이터베이스로 전송되는 SQL 쿼리문을 사용자가 임으로 조작할 수 있는 경우 발생한다 공격자는 이 취약점을 이용하여 데이터 베이스에 저장되어 있는 다른 사용자의 개인정보 등 허가되지 않은 정보에 접근하거나 데이터를 변조할 수 있다
💻 실습

SQL Injection 의 메인화면이다
사용자 id를 입력하는 폼이 보인다

1을 입력해보자 admin 사용자가 출력되는걸 알 수 있다
이와 같은 웹 페이지가 있을때 SQL Injection 공격에 취약한지 테스트해볼 수 있는 기본적인방법은
' 를 입력해보는것이다

위 사진과 같이 ' 를 입력하자 SQL 관련 오류가 발생한다
이와 같이 에러가 발생하거나 비정상적인 상황이 나타날경우
SQL Injection 에 취약한 상황을 의심해 볼 수 있다.
실습페이지의 코드는 다음과 같다

쿼리문을 보면 WHERE 조건문이 있고 사용자가 입력한 파라미터의 값($id)이 쿼리문의 일부로 사용되고 있는데
입력값에 제한이 없을경우 SQL Injection공격에 매우 취약하게 된다
이제 where 구문을 우회하여 공격해보자
쿼리문을 조작하기위해
' or '1'='1 을 입력해보자

위와같이 우회 구문을 입력했을때 다음과같이
admin 사용자 외에도 다른 사용자의 정보가 같이 출력된다
공격 구문을 입력했을때 SQL 쿼리문은 다음과 같이 구성된다
SELECT first_name,last_name from users where user_id='' or '1'='1';
where 절 이하에 or 키워드가 함께 삽입되어 where 문의 조건이 또는 '1'='1'이라는
항상 참이 되는 조건이 되어 모든 사용자의 first_name과 last_name이 출력된다.
이제 Union 구문을 사용해 데이터베이스 의 정보를 알아내보자
기본적으로 Union 공격의 순서는 다음과 같다
1. order by를 통한 column 갯수 확인
2. DB 버전 정보 확인
3. database 정보 확인
4. table 정보 확인
5. column 정보 확인
6. recode 정보 확인
union 은 합집합이기 때문에 union 을 사용하기 위해서는
원래의 SQL 쿼리문이 조회하는 select 문의 칼럼 개수와 union 뒤의 select 문에서 요청하는 칼럼 개수가 같아야한다.
따라서 union 공격을 성공시키기 위해서는 원래의 SQL 쿼리문이 몇 개의 칼럼을 반환하는지 알아내야한다

칼럼 개수는 다음과 같이 order by 구문으로 알아낼수 있다
order by 는 지정된 칼럼을 기준으로 결과를 정렬할 때 사용하는 구문으로
order by 뒤의 숫자를 증가시켜가다가 전체 칼럼 개수보다 더 큰값이 나오면
오류가 출력되는데 오류가 출력되기 이전의 값이 칼럼의 개수가 된다

' order by 3#을 입력했더니 오류가 발생한것으로 보아 전체 칼럼의 개수가 2개인 것을 알 수 있다.
이제 버전 정보를 확인해보자
서버 버전을 확인하는 쿼리는
VERSION() 혹은 @@VERSION 이다
' union select 1,version()#

이제 DB명을 알아내보자
mysql 은 information.schema라는 DB에서
DB명, table, column 정보등을 관리하고 있는데 위 테이블을 이용해 쿼리문을 작성하면 정보를 알아낼수 있다
' union select 1,schema_name from information_schema.schemata#

다음과 같이 DB명이 모두 출력되었으며
현재 실습의 DB명은 dbwa 인것을 확인할 수 있다
DB명을 알았으니 이제 dvwa 내에 테이블 목록을 알아내보자
' union select 1,table_name from information_schema.tables where table_schema='dvwa'#

dvwa DB내에 gusetbook과 users 테이블이 있는걸 알수 있다
이제 users 테이블의 칼럼 목록을 알아내보자

users 테이블의 모든 칼럼이 출력되었다
출력된 칼럼줌 user 와 password 내용을 확인해보자

사용자 이름과 패스워드 가 모두 출력되었다
🔍 대응방안
1. 입력값 검증
> SQL Injection 공격과 같은 파라미터 입력값 조작으로 이루어지는 공격은 입력값 검증을 통해 대응할 수 있다 특히 화이트리스트 검증을 사용하는 것이 더욱 효과적이다
2. 시큐어 코딩
> 사용자가 입력한 값은 SQL 쿼리문에서 오직 데이터로만 사용되어 sQL 쿼리문 구조에 영향을 줄 수 없도록 해야한다

> 다음과 같이 쿼리문을 구성하고 실행하는 방법을 파라미터 쿼리(parameterized query)로 변경한다
> prepare() 부분을 보면 미리 실행할 쿼리문의 형태를 작성해 두고 있는데 이것을 Prepared Statement 라고 한다
> 사용자의 입력값이 들어갈 id 부분은 bindValue() 에서 설정하도록 하고 있다 이경우 사용자가 입력한 값이 쿼리문의 일부가 될 수가 없고 온전히 데이터로만 처리되기 때문에 or 나 Union 같은 키워드가 입력되어도 무의미 하게 된다
'Web Hacking > DVWA' 카테고리의 다른 글
[DVWA] - Weak Session IDs (0) | 2022.11.14 |
---|---|
[DVWA] - Blind SQL Injection (0) | 2022.11.13 |
[DVWA] - Insecure CAPTCHA (0) | 2022.11.09 |
[DVWA] - File Upload (0) | 2022.11.08 |
[DVWA] - File Inclusion (0) | 2022.11.07 |
❓ 공격 개요
SQL Injection 공격 개요
> SQL Injection 공격은 웹 서버 영역의 데이터베이스로 전송되는 SQL 쿼리문을 사용자가 임으로 조작할 수 있는 경우 발생한다 공격자는 이 취약점을 이용하여 데이터 베이스에 저장되어 있는 다른 사용자의 개인정보 등 허가되지 않은 정보에 접근하거나 데이터를 변조할 수 있다
💻 실습

SQL Injection 의 메인화면이다
사용자 id를 입력하는 폼이 보인다

1을 입력해보자 admin 사용자가 출력되는걸 알 수 있다
이와 같은 웹 페이지가 있을때 SQL Injection 공격에 취약한지 테스트해볼 수 있는 기본적인방법은
' 를 입력해보는것이다

위 사진과 같이 ' 를 입력하자 SQL 관련 오류가 발생한다
이와 같이 에러가 발생하거나 비정상적인 상황이 나타날경우
SQL Injection 에 취약한 상황을 의심해 볼 수 있다.
실습페이지의 코드는 다음과 같다

쿼리문을 보면 WHERE 조건문이 있고 사용자가 입력한 파라미터의 값($id)이 쿼리문의 일부로 사용되고 있는데
입력값에 제한이 없을경우 SQL Injection공격에 매우 취약하게 된다
이제 where 구문을 우회하여 공격해보자
쿼리문을 조작하기위해
' or '1'='1 을 입력해보자

위와같이 우회 구문을 입력했을때 다음과같이
admin 사용자 외에도 다른 사용자의 정보가 같이 출력된다
공격 구문을 입력했을때 SQL 쿼리문은 다음과 같이 구성된다
SELECT first_name,last_name from users where user_id='' or '1'='1';
where 절 이하에 or 키워드가 함께 삽입되어 where 문의 조건이 또는 '1'='1'이라는
항상 참이 되는 조건이 되어 모든 사용자의 first_name과 last_name이 출력된다.
이제 Union 구문을 사용해 데이터베이스 의 정보를 알아내보자
기본적으로 Union 공격의 순서는 다음과 같다
1. order by를 통한 column 갯수 확인
2. DB 버전 정보 확인
3. database 정보 확인
4. table 정보 확인
5. column 정보 확인
6. recode 정보 확인
union 은 합집합이기 때문에 union 을 사용하기 위해서는
원래의 SQL 쿼리문이 조회하는 select 문의 칼럼 개수와 union 뒤의 select 문에서 요청하는 칼럼 개수가 같아야한다.
따라서 union 공격을 성공시키기 위해서는 원래의 SQL 쿼리문이 몇 개의 칼럼을 반환하는지 알아내야한다

칼럼 개수는 다음과 같이 order by 구문으로 알아낼수 있다
order by 는 지정된 칼럼을 기준으로 결과를 정렬할 때 사용하는 구문으로
order by 뒤의 숫자를 증가시켜가다가 전체 칼럼 개수보다 더 큰값이 나오면
오류가 출력되는데 오류가 출력되기 이전의 값이 칼럼의 개수가 된다

' order by 3#을 입력했더니 오류가 발생한것으로 보아 전체 칼럼의 개수가 2개인 것을 알 수 있다.
이제 버전 정보를 확인해보자
서버 버전을 확인하는 쿼리는
VERSION() 혹은 @@VERSION 이다
' union select 1,version()#

이제 DB명을 알아내보자
mysql 은 information.schema라는 DB에서
DB명, table, column 정보등을 관리하고 있는데 위 테이블을 이용해 쿼리문을 작성하면 정보를 알아낼수 있다
' union select 1,schema_name from information_schema.schemata#

다음과 같이 DB명이 모두 출력되었으며
현재 실습의 DB명은 dbwa 인것을 확인할 수 있다
DB명을 알았으니 이제 dvwa 내에 테이블 목록을 알아내보자
' union select 1,table_name from information_schema.tables where table_schema='dvwa'#

dvwa DB내에 gusetbook과 users 테이블이 있는걸 알수 있다
이제 users 테이블의 칼럼 목록을 알아내보자

users 테이블의 모든 칼럼이 출력되었다
출력된 칼럼줌 user 와 password 내용을 확인해보자

사용자 이름과 패스워드 가 모두 출력되었다
🔍 대응방안
1. 입력값 검증
> SQL Injection 공격과 같은 파라미터 입력값 조작으로 이루어지는 공격은 입력값 검증을 통해 대응할 수 있다 특히 화이트리스트 검증을 사용하는 것이 더욱 효과적이다
2. 시큐어 코딩
> 사용자가 입력한 값은 SQL 쿼리문에서 오직 데이터로만 사용되어 sQL 쿼리문 구조에 영향을 줄 수 없도록 해야한다

> 다음과 같이 쿼리문을 구성하고 실행하는 방법을 파라미터 쿼리(parameterized query)로 변경한다
> prepare() 부분을 보면 미리 실행할 쿼리문의 형태를 작성해 두고 있는데 이것을 Prepared Statement 라고 한다
> 사용자의 입력값이 들어갈 id 부분은 bindValue() 에서 설정하도록 하고 있다 이경우 사용자가 입력한 값이 쿼리문의 일부가 될 수가 없고 온전히 데이터로만 처리되기 때문에 or 나 Union 같은 키워드가 입력되어도 무의미 하게 된다
'Web Hacking > DVWA' 카테고리의 다른 글
[DVWA] - Weak Session IDs (0) | 2022.11.14 |
---|---|
[DVWA] - Blind SQL Injection (0) | 2022.11.13 |
[DVWA] - Insecure CAPTCHA (0) | 2022.11.09 |
[DVWA] - File Upload (0) | 2022.11.08 |
[DVWA] - File Inclusion (0) | 2022.11.07 |