10. mysql 데몬 재시작
$ systemctl restart mysqld
mysql 접속 후 인코딩 확인
$ mysql
mysql> status
웹서버 구축
MySQL–인코딩설정
11. admin 비밀번호 재설정
$ mysqladmin –u root –p password
root로 mysql 접속
$ mysql –u root –p
사용자 추가
mysql> create user ‘user’@’%’ identified by ‘12345’;
사용자 권한 부여
mysql> grant all on *.* to ‘user’@’%’ with grant option;
웹서버 구축
MySQL–사용자설정
12. 사용자 설정 확인(mysql 접속후 명령어 실행)
mysql> show databases;
mysql> use mysql;
mysql> select user, host from user;
웹서버 구축
MySQL–사용자설정
17. SQL Injection
인증우회공격
인증 우회 공격
- 로그인 페이지를 타겟으로 함
- SQL 쿼리문이 무조건 TRUE값이 나오게 입력하여 인증을 무력화시키는 공격
공격 쿼리 패턴
- ‘ OR 1=1 --
- ‘ OR 1=1 #
쿼리 조건이 TRUE가 되게 하는 값
주석처리 (ORACLE은 -- MySQL은 #)
18. 인증 우회공격을 테스트 할 샘플 데이터 생성
$ mysql –u root -p
mysql> create database sample;
mysql> use sample;
mysql> create table users ( username varchar(10), password varchar(20));
mysql> insert into users values(‘humanist’,’toor’);
mysql> insert into users values(‘smile’,’toor’);
SQL Injection
인증우회공격
20. Union based 공격
- 타겟 시스템의 데이터를 가져오는 데이터 노출 공격
- GET방식으로 HTTP 요청할 때 URL파라미터로 공격쿼리를 주입
- 두개의 select문의 결과를 합치는 union 구문을 이용
공격 쿼리 패턴
- ?params=-9999+union+select문#
- ?params=1+and+1=0+union+select문#
서버 측 쿼리조건이 FALSE가 되게 하는 값
공격자가 얻어낼 정보를 가져오는 SELECT문
SQL Injection
Union-basedInjection
21. 공격에 필요한 테이블과 데이터를 자동 생성 – dumpdata.php
SQL Injection
Union-basedInjection
22. 파라미터가 없으면 전체 데이터를 가져오고
파라미터가 있다면 해당 bno값의 데이터 가져옴
화면에는 일부 데이터만 출력하도록 함
SQL Injection
Union-basedInjection
GET방식 요청을 받을수있는 웹페이지 생성– board.php
23. 전체 데이터 출력
테이블에 해당 데이터가 있을경우
테이블에 해당 데이터가 없을경우
SQL Injection
Union-basedInjection
board.php 동작 화면
24. 쿼리문의 컬럼 수 알아내기
- Union을 사용하려면 합치려는 두 SELECT문의 컬럼수가 일치해야함
- order by 구문으로 서버측 SELECT문의 컬럼 수를 알아낼 수 있음
order by 뒤에 컬럼수 이하의 값을 넣을때
정상출력
order by 뒤에 컬럼수 초과한 값을 넣을때
에러 발생
SQL Injection
Union-basedInjection
25. 화면에 출력되는 컬럼 알아내기
- Union 구문을 이용하여 컬럼수만큼 SELECT문으로 출력하도록 함
- 여기서 얻은 컬럼 번호로 공격자가 원하는 정보를 출력 할수 있음
SELECT문의 2번째, 4번째 컬럼이 화면에 출력됨
SQL Injection
Union-basedInjection
26. - database() 함수는 현재 테이블이 있는 데이터베이스명을 출력
현재 테이블이 있는 데이터베이스 이름이 sample인것을 알수있음
SQL Injection
Union-basedInjection
27. 테이블 정보 알아내기
- mysql은 information_schema라는 데이터베이스에 모든 DB와 테이블정보를 저장
- ?bno=-99 union select 1,table_name,3,4 from information_schema.tables where
table_schema=‘sample’#
sample 데이터베이스의 모든 테이블 정보 출력
SQL Injection
Union-basedInjection
28. 특정 테이블의 컬럼 정보 얻어내기
- 이것 또한 information_schema를 이용하여 select문을 구성
- ?bno=-99 union select 1,column_name,3,table_schema from
information_schema.columns where table_name=‘users’#
SQL Injection
Union-basedInjection
29. 공격자가 원하는 테이블의 정보 노출
- 얻어낸 컬럼명을 이용하여 users 테이블에 있는 정보 가져오기
- ?bno=-99 union select 1,username,3,password from users#
SQL Injection
Union-basedInjection
30. 더 나아가서…
- Mysql의 사용자 정보는 mysql이라는 데이터베이스에 저장됨
- ?bno=-99 union select 1,user,3,host from mysql.user#
이 사용자를 타겟으로 Brute-force, dictionary 등
2차 공격을 시도 할수 있음
SQL Injection
Union-basedInjection
32. 공격 대응책
방법1.Regex를이용한입력값검사
보통 사용자의 아이디와 패스워드에 사용되는 문자는 제한되어있음
- id의 경우 숫자,영문자,_(언더바)로 구성
- 이메일의 경우 숫자,영문자,_(언더바)@영소문자.영소문자 형식으로 구성
Regex(정규표현식)는 특정한 규칙을 가진 문자열을 표현하는 형식
사용자가 입력한 값이 형식에 맞는지 검사
ex) id를 표현하는 regex구문 “/[a-z][0-9a-zA-Z]{3,20}$/”
ex) 이메일을 표현하는 regex구문 “/([a-z][0-9a-zA-Z]{3,20})+@([0-9a-zA-Z][0-9a-zA-Z-]+.)+
[a-zA-Z]{2,6}$/i”
프론트엔드에서 인증우회 공격을 미리 막을 수 있음
33. 사용자 아이디가 올바른 형식인지 검사
공격 대응책
방법1.Regex를이용한입력값검사
구현 코드 – sindex1.php
34. - SQL문을 미리 컴파일하여 수행
- 파라미터로 입력받게 되는 부분(바인딩데이터)는 SQL문법이 아닌 컴파일언어로 처리
즉 사용자 입력값에 SQL 공격쿼리를 넣어도 동작하지 않음
- 인증우회 공격, GET요청을 이용한 데이터노출 공격을 막을수 있음
공격 대응책
방법2.PreparedStatement
35. 구현 코드 – sindex2.php
공격 대응책
방법2.PreparedStatement
36. 구현 코드 – sboard.php
공격 대응책
방법2.PreparedStatement
37. grant all privileges on *.* to ‘user’@’%’ with grant option;
- 사용자에게 DB,테이블에 대한 모든 접근권한을 주는 것은 매우 위험
- 데이터노출 공격시 2차,3차 피해를 유발할 수 있음
DB커낵션에 사용하는 데이터베이스 유저 권한을 엄격하게 설정
revoke all privileges on *.* from ‘user’@’%’;
- 접근권한 재설정을 위해 모든 권한을 삭제
grant select on sample.boardtbl to ‘user’@’%’;
- boardtbl에 대한 검색 권한만 부여
공격 대응책
방법3.접근권한설정
38. 참고자료
SQL Injection 공격구현 참고 http://mrrootable.tistory.com/25
PPT템플릿 http://ponybuhagom.tistory.com/193
잘못된 부분 있으면 apenr1234@gmail.com 여기로 메일 부탁