SlideShare a Scribd company logo
1 of 38
Download to read offline
SQL Injection 공격 구현
이민정
SQLInjection공격구현
01 웹서버(APM) 구축
02 SQL Injection 공격
03 공격 대응법
시작하기전에….
이 글은 Mr.Rootable님의 SQL Injection기초 글에서 Union Based방식 부분을 참고하였습니다.
http://mrrootable.tistory.com/25  여기 링크주소
01
웹 서버(APM) 구축
운영체제 CentOS7
Apache버전 2.4.6
PHP버전 5.4.16
Mysql버전 5.7
구현스펙
MySQL 설치
$ yum –y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
$ yum –y install mysql-community-server
MySQL 데몬 프로그램 가동
$ systemctl enable mysqld
$ systemctl start mysqld
웹서버 구축
MySQL
mysql 접속
$ mysql
인코딩 방식 확인
mysql> status
웹서버 구축
MySQL–인코딩설정
mysql 설정파일 열기
$ vi /etc/my.cnf
웹서버 구축
MySQL–인코딩설정
웹서버 구축
MySQL–인코딩설정
mysql 데몬 재시작
$ systemctl restart mysqld
mysql 접속 후 인코딩 확인
$ mysql
mysql> status
웹서버 구축
MySQL–인코딩설정
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–사용자설정
사용자 설정 확인(mysql 접속후 명령어 실행)
mysql> show databases;
mysql> use mysql;
mysql> select user, host from user;
웹서버 구축
MySQL–사용자설정
php 설치
$ yum –y install php php-mysql php-mbstring php-pdo php-gd
apache 설치
$ yum –y install httpd
$ systemctl enable httpd
웹서버 구축
Apache,PHP설치
Apache 설정
$ vi /etc/httpd/conf/httpd.conf
Apache 재시작
$ systemctl restart httpd
웹서버 구축
Apache,PHP설치
Apache 방화벽 열어놓기
$ firewall-cmd --add-service=http --permanent
$ firewall-cmd --add-service=https --permanent
$ systemctl restart firewalld
$ systemctl restart httpd
웹서버 구축
방화벽설정
02
SQL Injection 공격
SQL Injection
인증우회공격
인증 우회 공격
- 로그인 페이지를 타겟으로 함
- SQL 쿼리문이 무조건 TRUE값이 나오게 입력하여 인증을 무력화시키는 공격
공격 쿼리 패턴
- ‘ OR 1=1 --
- ‘ OR 1=1 #
쿼리 조건이 TRUE가 되게 하는 값
주석처리 (ORACLE은 -- MySQL은 #)
인증 우회공격을 테스트 할 샘플 데이터 생성
$ 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
인증우회공격
SQL Injection
인증우회공격
공격 타겟용 웹페이지 - index.php
Union based 공격
- 타겟 시스템의 데이터를 가져오는 데이터 노출 공격
- GET방식으로 HTTP 요청할 때 URL파라미터로 공격쿼리를 주입
- 두개의 select문의 결과를 합치는 union 구문을 이용
공격 쿼리 패턴
- ?params=-9999+union+select문#
- ?params=1+and+1=0+union+select문#
서버 측 쿼리조건이 FALSE가 되게 하는 값
공격자가 얻어낼 정보를 가져오는 SELECT문
SQL Injection
Union-basedInjection
공격에 필요한 테이블과 데이터를 자동 생성 – dumpdata.php
SQL Injection
Union-basedInjection
파라미터가 없으면 전체 데이터를 가져오고
파라미터가 있다면 해당 bno값의 데이터 가져옴
화면에는 일부 데이터만 출력하도록 함
SQL Injection
Union-basedInjection
GET방식 요청을 받을수있는 웹페이지 생성– board.php
전체 데이터 출력
테이블에 해당 데이터가 있을경우
테이블에 해당 데이터가 없을경우
SQL Injection
Union-basedInjection
board.php 동작 화면
쿼리문의 컬럼 수 알아내기
- Union을 사용하려면 합치려는 두 SELECT문의 컬럼수가 일치해야함
- order by 구문으로 서버측 SELECT문의 컬럼 수를 알아낼 수 있음
order by 뒤에 컬럼수 이하의 값을 넣을때
 정상출력
order by 뒤에 컬럼수 초과한 값을 넣을때
에러 발생
SQL Injection
Union-basedInjection
화면에 출력되는 컬럼 알아내기
- Union 구문을 이용하여 컬럼수만큼 SELECT문으로 출력하도록 함
- 여기서 얻은 컬럼 번호로 공격자가 원하는 정보를 출력 할수 있음
 SELECT문의 2번째, 4번째 컬럼이 화면에 출력됨
SQL Injection
Union-basedInjection
- database() 함수는 현재 테이블이 있는 데이터베이스명을 출력
현재 테이블이 있는 데이터베이스 이름이 sample인것을 알수있음
SQL Injection
Union-basedInjection
테이블 정보 알아내기
- 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
특정 테이블의 컬럼 정보 얻어내기
- 이것 또한 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
공격자가 원하는 테이블의 정보 노출
- 얻어낸 컬럼명을 이용하여 users 테이블에 있는 정보 가져오기
- ?bno=-99 union select 1,username,3,password from users#
SQL Injection
Union-basedInjection
더 나아가서…
- Mysql의 사용자 정보는 mysql이라는 데이터베이스에 저장됨
- ?bno=-99 union select 1,user,3,host from mysql.user#
 이 사용자를 타겟으로 Brute-force, dictionary 등
2차 공격을 시도 할수 있음
SQL Injection
Union-basedInjection
03
공격 대응책
공격 대응책
방법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”
프론트엔드에서 인증우회 공격을 미리 막을 수 있음
사용자 아이디가 올바른 형식인지 검사
공격 대응책
방법1.Regex를이용한입력값검사
구현 코드 – sindex1.php
- SQL문을 미리 컴파일하여 수행
- 파라미터로 입력받게 되는 부분(바인딩데이터)는 SQL문법이 아닌 컴파일언어로 처리
 즉 사용자 입력값에 SQL 공격쿼리를 넣어도 동작하지 않음
- 인증우회 공격, GET요청을 이용한 데이터노출 공격을 막을수 있음
공격 대응책
방법2.PreparedStatement
구현 코드 – sindex2.php
공격 대응책
방법2.PreparedStatement
구현 코드 – sboard.php
공격 대응책
방법2.PreparedStatement
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.접근권한설정
참고자료
SQL Injection 공격구현 참고 http://mrrootable.tistory.com/25
PPT템플릿 http://ponybuhagom.tistory.com/193
잘못된 부분 있으면 apenr1234@gmail.com 여기로 메일 부탁

More Related Content

What's hot

#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)Sehan Lee
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개종빈 오
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 

What's hot (12)

#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
 
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
 
레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)레이스 컨디션 기초(Basic Race Condition)
레이스 컨디션 기초(Basic Race Condition)
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
Intrusive data structure 소개
Intrusive data structure 소개Intrusive data structure 소개
Intrusive data structure 소개
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
 

Similar to Sqlinjection - union based

HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
Spring mvc
Spring mvcSpring mvc
Spring mvcksain
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQLrockplace
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)Hankyo
 
Sql injection 정의 및 구현
Sql injection 정의 및 구현Sql injection 정의 및 구현
Sql injection 정의 및 구현Jongseok Choi
 
집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03Kwang Woo NAM
 
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기NAVER D2
 
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02Kwang Woo NAM
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3J B
 
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임KH Park (박경훈)
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by NetflixJi-Woong Choi
 
Azure Database for MySQL
Azure Database for MySQLAzure Database for MySQL
Azure Database for MySQLrockplace
 
DB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLDB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLrockplace
 
Spring camp 발표자료
Spring camp 발표자료Spring camp 발표자료
Spring camp 발표자료수홍 이
 
03주차 ddl- table을 만들자
03주차 ddl- table을 만들자03주차 ddl- table을 만들자
03주차 ddl- table을 만들자Yoonwhan Lee
 
02주차 ddl- db를 만들자
02주차 ddl- db를 만들자02주차 ddl- db를 만들자
02주차 ddl- db를 만들자Yoonwhan Lee
 
컴퓨터보안.pptx
컴퓨터보안.pptx컴퓨터보안.pptx
컴퓨터보안.pptxdalonn
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육NAVER D2 STARTUP FACTORY
 

Similar to Sqlinjection - union based (20)

Error Expose
Error ExposeError Expose
Error Expose
 
테스트
테스트테스트
테스트
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQL
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)
 
Sql injection 정의 및 구현
Sql injection 정의 및 구현Sql injection 정의 및 구현
Sql injection 정의 및 구현
 
집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03집단지성 프로그래밍 03-군집발견-03
집단지성 프로그래밍 03-군집발견-03
 
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기
 
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3
 
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
Hoons닷넷 좌충우돌 10년, 그리고 새로운 패러다임
 
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
[오픈소스컨설팅]Fault Tolerance Architecture by Netflix
 
Azure Database for MySQL
Azure Database for MySQLAzure Database for MySQL
Azure Database for MySQL
 
DB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQLDB Migration to Azure Database for MySQL
DB Migration to Azure Database for MySQL
 
Spring camp 발표자료
Spring camp 발표자료Spring camp 발표자료
Spring camp 발표자료
 
03주차 ddl- table을 만들자
03주차 ddl- table을 만들자03주차 ddl- table을 만들자
03주차 ddl- table을 만들자
 
02주차 ddl- db를 만들자
02주차 ddl- db를 만들자02주차 ddl- db를 만들자
02주차 ddl- db를 만들자
 
컴퓨터보안.pptx
컴퓨터보안.pptx컴퓨터보안.pptx
컴퓨터보안.pptx
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
 

Sqlinjection - union based

  • 1. SQL Injection 공격 구현 이민정
  • 2. SQLInjection공격구현 01 웹서버(APM) 구축 02 SQL Injection 공격 03 공격 대응법
  • 3. 시작하기전에…. 이 글은 Mr.Rootable님의 SQL Injection기초 글에서 Union Based방식 부분을 참고하였습니다. http://mrrootable.tistory.com/25  여기 링크주소
  • 5. 운영체제 CentOS7 Apache버전 2.4.6 PHP버전 5.4.16 Mysql버전 5.7 구현스펙
  • 6. MySQL 설치 $ yum –y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm $ yum –y install mysql-community-server MySQL 데몬 프로그램 가동 $ systemctl enable mysqld $ systemctl start mysqld 웹서버 구축 MySQL
  • 7. mysql 접속 $ mysql 인코딩 방식 확인 mysql> status 웹서버 구축 MySQL–인코딩설정
  • 8. mysql 설정파일 열기 $ vi /etc/my.cnf 웹서버 구축 MySQL–인코딩설정
  • 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–사용자설정
  • 13. php 설치 $ yum –y install php php-mysql php-mbstring php-pdo php-gd apache 설치 $ yum –y install httpd $ systemctl enable httpd 웹서버 구축 Apache,PHP설치
  • 14. Apache 설정 $ vi /etc/httpd/conf/httpd.conf Apache 재시작 $ systemctl restart httpd 웹서버 구축 Apache,PHP설치
  • 15. Apache 방화벽 열어놓기 $ firewall-cmd --add-service=http --permanent $ firewall-cmd --add-service=https --permanent $ systemctl restart firewalld $ systemctl restart httpd 웹서버 구축 방화벽설정
  • 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 여기로 메일 부탁