정보보안공부

웹보안_21. SQL Injection 본문

정보보안/웹보안

웹보안_21. SQL Injection

Steady_sp 2018. 3. 20. 13:21

SQL Injection

 

- 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다.
- 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑 하지 못했을 경우에 발생한다.

 

 

-> 공개게시판에 위와같이 사진을 첨부한 게시글을 작성하였다. 사진을 다운로드했을 때 다운로드 수가 증가하지만 SQL Injection공격에 의해 해당 다운로드수를 클라이언트가 임의로 수정할 수 있다. 이때 사용되는 쿼리는 update 쿼리이다. 먼저 해당 페이지의 소스코드를 살펴보자.

 

 

-> 이부분이 바로 다운로드를 눌렀을때 <a href='download.php?'>에 의해서 코드가 실행되는 것을 확인한다. 실제 다운로드하지 않아도 이코드의 링크를 계속클릭한다면 Download수는 1씩 계속 증가한다.

 

 

-> 두번눌러서 2로 증가되었다. download.php에 어떤코드가 있어서 증가했는지 확인해보자.

 

 

 

-> update쿼리에는 $t_board, $id, $filenum, $no 네가지 변수가 포함되어있다.

-> $t_board는 lib.php에 가보면 zetyx_board라고 선언되어있다.

-> $id, $filenum, $no는 페이지 소스코드보기에보면 $id = vul , $filenum = 1, $no=11로 선언되어있다. 그렇다면 저쿼리는 "update zetyx_board_vul set download1 = download1 + 1 where no = 11" 이라는 의미이다. zetyx_board_vul 테이블에서 download1이라는 컬럼의 값을 +1 증가하는 것이다.

 

 

-> 해당코드의 'download.php?' 부분을 복사해서 url에 입력시킨뒤 filenum값에 =500을 추가해보자.

 

 

-> "update zetyx_board_vul set download1 = 500 = download1 + 1 where no = 11" 이라는 쿼리로 해석이된다. 이쿼리는 완성된 문장이 아니므로 실행되지 않는다. 하지만 여기서 중요한것은 download1 = 500 까지만 명령을 실행하게된다면 이명령은 실행된다는 것이다. MYSQL에서 주석을 나타내는 문자는 #이다. url에서 입력할때 #은 입력이 되지않는다. 따라서 url인코딩 값으로 23을 입력하게된다면 해당쿼리는 update zetyx_board_vul set download1 = 500 이렇게 인식하여 Download수가 바뀌는 것이다.

 

 

 

## url 인코딩값

mysql 주석 # : %23

url에서 띄여쓰기 : %20

 

사진의 다운로드수를 증가한것으로만 본다면 이공격은 크게 쓸모가 없어보일수 있다. 하지만 이번에는 응용을통해 SQL Injection공격으로 본문에 내용을 작성해보고 SQL Injection공격으로 XSS공격까지 실행해보자.

 

 

-> 글쓰기창에서 페이지 소스보기를 이용해 본문의 해당되는 컬럼이름은 memo라는 걸럼이라는 것을 확인할 수 있다. 대부분의 게시판의 본문부분은 textarea이다.

 

 

 

-> 해당쿼리는 update zetyx_board_vul set download1 = 500, memo='hello I am hacker' 로 작동되어 본문내용에 hello I am hacker가 삽입된 것을 확인할 수 있다.

 

 

-> memo의 내용에 <script>alert('Xss Attack')</script>을 삽입하면 아래와같이 실행이된다. 이렇게되면 해당게시글 내용이 전부다 바뀌므로 원하는 게시글만을 바꿀때는

 

 

-> where조건을 삽입하면 해당글만 변경이된다.

 

-> 이방법은 SQL Injection인 동시에 XSS공격을 우회한 공격이기도 하다.

 

# Numeric Injection

-> 컬럼이 int형이면 ' ' 없이도 입력이 가능하다.

-> 컬럼이 int형이면 ' ' 있어도 입력이 가능하다.

 

# String Injection

-> 컬럼이 char, varchar형일때 ' ' 없다면 컬럼이름으로 인식한다.
-> 컬림이 char, varchar형일때 ' ' 반드시 필요하다.
-> 입력값에 ' ' 있으면 쉽게 막을 수 있다.

 

 

-> magic_quotes_gpc = On 설정을 하면 GPC (Get/Post/쿠키) 작동이 ' '(작은 따옴표), " "(큰 따옴표), \(백슬래시), NUL을 자동적으로 백슬래시로 이스케이프처리 하게된다.

-> 하지만 모든 변수에 대해 확인하는 단점으로 5.3(4)버전 이후로부터는 제거된다.

-> addslashes( 해당변수 ); 를 이용해 취약한 변수에대해 직접 체크하도록 설정할 수 있다.

 

# 우회기법

-> magic_quotes_gpc가 설정되어있을 때 무조건 문자열에 무조건 이스케이프처리가 실행된다.

-> 아스키 코드를 이용해 해당문자에 관한 숫자를 알아내고 알아낸 숫자를 다시 char함수를 이용해 문자로 반환할 수 있다.

 

# ascii

 

 

# char

 

 

-> memo='hello'로 설정하는것이 이스케이프 처리가되어 설정이 막혀있으므로 char함수를 이용해서 작성할 수 있다.

 

Comments