카테고리 없음

그누보드 5.0.6 취약점 분석 과정

ilsancityboy 2024. 12. 18. 21:05

해당 글은 취약점들을 완벽하게 분석하고 처리하는 과정하는 글이 아닙니다..!

단순히 제가 분석하며 드는 의문점들과 생각들을 기록하기 위한 글입니다..

더 열심히해서 다음엔 완벽한 글을 올릴게요 :)....

 


https://ilsancityboy.tistory.com/97

 

그누보드 대상 주요정보통신기반 웹 취약점 항목 진단

실습 환경  aws ec2에 그누보드 5.0.6버전을 올려두고 해당 사이트 내에서 주통기 웹 항목을 하나하나 진단할 것이다.1. 버퍼오버플로우    대량의 문자열을 입력하려 해도 적정량의 문자가 입

ilsancityboy.tistory.com

해당 과정들을 진행중에 SQL Injection을 점검하는 과정에서 생각보다 너무 취약점을 못찾았다.

(혼자 힘으론 1개도 못찾아서 ,sqlmap 이랑 sonarQube로 자동분석을 해도 나오는게 없었음.)

2014년 버전으로 낮춰서 진행하는데도 취약점이 없을수가 있나?

따라서 그누보드 이후 버전들을 개발자가 올리며 패치내용을 직접 작성해주길래 보안패치 부분들을 보았다.

 

 

 

글제목 문자열 자르기 오류를 이용한 SQL Injection 대응 코드가 추가되었습니다.
한국인터넷진흥원을 통해 김범수님께서 알려주셨습니다.

또한 네이버 스마트에디터2가 기본 에디터로 지정됐습니다. 스마트에디터는
plugin/editor 폴더안에 smarteditor2 폴더를 복사해 주시면 됩니다.


bfb97db 스마트 에디터 JSON 파일 추가
A      plugin/editor/smarteditor2/photo_uploader/popup/php/JSON.php
99165f3 스마트 에디터 _common.php파일 경로 지정 및 JSON파일 추가
A      plugin/editor/smarteditor2/photo_uploader/popup/php/_common.php
M      plugin/editor/smarteditor2/photo_uploader/popup/php/index.php
3a8f88b 스마트 에디터 업로드 json_encode함수 대체
M      plugin/editor/smarteditor2/photo_uploader/popup/php/index.php
1950db9 Merge branch 'master' of github.com:gnuboard/g5
4875dce 스마트 에디터 포토 업로드 php5.3이상에서만 작동되는 함수 지움
M      plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php
683cc32 네이버 신디케이션 토큰의 길이가 112 글자가 아닌 경우가 확인되어 길이 비교 코드를 삭제
M      lib/naver_syndi.lib.php
55e1580 Merge branch 'master' of github.com:gnuboard/g5
19e7535 설치시 기본 에디터 변경
M      install/install_db.php
414b954 글제목 문자열 자르기 오류를 이용한 sql injection 방지
M      bbs/write_update.php
9d8a776 스마트 에디터2 수정된 js파일을 pack적용
M      plugin/editor/smarteditor2/js/smarteditor2.min.js
264866a 스마트에디터2 추가
M      js/autosave.js
A      plugin/editor/smarteditor2/SmartEditor2.html
A      plugin/editor/smarteditor2/SmartEditor2Skin.html
A      plugin/editor/smarteditor2/config.js
A      plugin/editor/smarteditor2/css/smart_editor2.css
A      plugin/editor/smarteditor2/css/smart_editor2_in.css
A      plugin/editor/smarteditor2/css/smart_editor2_items.css
A      plugin/editor/smarteditor2/css/smart_editor2_out.css
A      plugin/editor/smarteditor2/editor.lib.php
A      plugin/editor/smarteditor2/img/bg_b1.png
A      plugin/editor/smarteditor2/img/bg_button.gif
A      plugin/editor/smarteditor2/img/bg_button_left.gif
A      plugin/editor/smarteditor2/img/bg_button_right.gif
A      plugin/editor/smarteditor2/img/bg_find_h3.gif
A      plugin/editor/smarteditor2/img/bg_help.gif
A      plugin/editor/smarteditor2/img/bg_icon_tool.gif
A      plugin/editor/smarteditor2/img/bg_line1.gif
A      plugin/editor/smarteditor2/img/bg_quote2.gif
A      plugin/editor/smarteditor2/img/bg_set.gif
A      plugin/editor/smarteditor2/img/bg_text_tool.gif
A      plugin/editor/smarteditor2/img/bg_tool2.gif
A      plugin/editor/smarteditor2/img/editor_guideline_698.gif
A      plugin/editor/smarteditor2/img/editor_guideline_890.gif
A      plugin/editor/smarteditor2/img/ico_extend.png
A      plugin/editor/smarteditor2/img/icon_set.gif
A      plugin/editor/smarteditor2/img/ko_KR/btn_set.png
A      plugin/editor/smarteditor2/img/ko_KR/bx_set_110302.gif
A      plugin/editor/smarteditor2/img/ko_KR/text_tool_set.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/bg_drag_image.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/btn_cancel.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/btn_confirm.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/btn_confirm2.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/btn_del.png
A      plugin/editor/smarteditor2/img/photoQuickPopup/btn_find.png
A      plugin/editor/smarteditor2/img/text_tool_set2.png
A      plugin/editor/smarteditor2/js/HuskyEZCreator.js
A      plugin/editor/smarteditor2/js/SE2B_Configuration_General.js
A      plugin/editor/smarteditor2/js/SE2B_Configuration_Service.js
A      plugin/editor/smarteditor2/js/SE2BasicCreator.js
A      plugin/editor/smarteditor2/js/jindo.min.js
A      plugin/editor/smarteditor2/js/jindo_component.js
A      plugin/editor/smarteditor2/js/smarteditor2.js
A      plugin/editor/smarteditor2/js/smarteditor2.min.js
A      plugin/editor/smarteditor2/photo_uploader/plugin/hp_SE2M_AttachQuickPhoto.js
A      plugin/editor/smarteditor2/photo_uploader/popup/attach_photo.js
A      plugin/editor/smarteditor2/photo_uploader/popup/callback.html
A      plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-noscript.css
A      plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-ui-noscript.css
A      plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-ui.css
A      plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload.css
A      plugin/editor/smarteditor2/photo_uploader/popup/css/style.css
A      plugin/editor/smarteditor2/photo_uploader/popup/file_uploader.php
A      plugin/editor/smarteditor2/photo_uploader/popup/file_uploader_html5.php
A      plugin/editor/smarteditor2/photo_uploader/popup/img/delete.png
A      plugin/editor/smarteditor2/photo_uploader/popup/img/loading.gif
A      plugin/editor/smarteditor2/photo_uploader/popup/img/progressbar.gif
A      plugin/editor/smarteditor2/photo_uploader/popup/img/system_delete.png
A      plugin/editor/smarteditor2/photo_uploader/popup/index.html
A      plugin/editor/smarteditor2/photo_uploader/popup/jindo.fileuploader.js
A      plugin/editor/smarteditor2/photo_uploader/popup/jindo.min.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery-1.8.3.min.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery-ui.min.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload-process.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload-ui.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.iframe-transport.js
A      plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.ui.widget.js
A      plugin/editor/smarteditor2/photo_uploader/popup/photo_uploader.html
A      plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php
A      plugin/editor/smarteditor2/photo_uploader/popup/php/index.php
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/XPButtonUploadText_61x22.png
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/fileprogress.js
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/jquery.swfupload.js
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.js
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.queue.js
A      plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.swf
A      plugin/editor/smarteditor2/readme.txt
A      plugin/editor/smarteditor2/release_notes.txt
A      plugin/editor/smarteditor2/sample.php
A      plugin/editor/smarteditor2/shortcut.html
A      plugin/editor/smarteditor2/smart_editor2_inputarea.html
A      plugin/editor/smarteditor2/smart_editor2_inputarea_ie8.html
A      plugin/editor/smarteditor2/src_include.txt
04cabd1 게시판 제목에 "가 들어가는 경우 캐시파일 생성시 오류 발생 수정
M      lib/latest.lib.php
85930d5 홈페이지 제목이나 게시판 제목에 &등의 특수문자가 존재할때 발생하던 오류 수정
M      plugin/syndi/ping.php
8cb1516 sns 댓글등록 스크립트 수정
M      mobile/skin/board/basic/view_comment.skin.php
M      mobile/skin/board/gallery/view_comment.skin.php
M      skin/board/basic/view_comment.skin.php
M      skin/board/gallery/view_comment.skin.php

 

 

가장먼저 보인것은 write_update.php 부분에서 문자열 자르기 오류를 이용한 sql injection의 대응 코드를 추가했다고 한다.

그럼 지금 내가 설치해둔 버전에 내가 찾지 못한 sql injection 취약점이 존재한다는 것.

5.0.6 취약한 버전

먼저 취약점이 존재한다는 5.0.6버전의 write_update.php 에서 글 제목을 다루는 코드부분

 

5.0.8 버전의 write_update.php 파일도 다운받아 확인해보니 코드가 추가된부분이 있다.

preg_replace() 함수를 사용하여 문자열 끝에 있는 연속된 백슬래시(\)를 제거하는코드가 추가됐다.

그럼 취약한 부분에선 해당 대응코드가 없으니 문자열 끝에 연속된 백슬래시를 이용해 sql injection 취약점이 존재하는듯

 

먼저 write_update.php가 사이트내에서 어디인지 확인해보자.

글쓰기 부분에선 url을 보면 write_update가 아닌 write.php가 나온다. (그럼 수정페이지 일려나?)

 

기존 글에서 수정하기 버튼을 눌러 수정페이지로 들어가도 url을 보면 write_update.php가 아닌 write.php 가 나온다.

 

일단 그럼 수정페이지에서 아무렇게나 수정하고 [작성완료] 를 눌러 수정하는 post요청을 보내면서 burp suite로 

패킷을 가로채 보았다.

먼저 ajax.filter.php라는 곳으로 먼저 post요청 패킷을 보내고 

그다음으로 write_update.php 라는 곳으로 두번째 post패킷을 보낸다.

즉 여기서 알아낼수있는건 write_update.php는 실제로 웹 사이트를 사용하는 이용자 눈에는 직접적으로 보이지 않고 그저 요청을 받아 뒤에서 기능만 수행하는 php파일인것을 확인할 수 있다.

그리고 이 write_update.php에 취약점이 존재한단 것.

 

업데이트된 5.0.8 버전에선 문자열 끝에 연속된 백슬래시가 나오는걸 방지하는 코드가 추가됐으니

지난 버전이 깔려있는 해당 사이트에서 글제목 문자열 끝에 연속된 백슬래시를 넣어보았다.

 

엥? 왜 문자열 끝에 백슬래시를 넣어도 문제없이 문자열로 인식하고 게시글이 잘 올라가지?? 싶어서 인터넷 찾아보았다

 

 

찾아본 결과로는 원래코드에서 글제목을 255자까지 받아내고 그 이후 문자들은 다 잘라내서 버리고 저장한다고 한다.

따라서 아무 글자를 254자 넣고 마지막 255번째에 백슬래시를 넣으면 에러가 난다고 한다.

따라서 254개의 a를 넣고 마지막에 \를 넣어서 글제목부분에 넣어 요청을 보내봤다.

 

에러 페이지가 나온다. 해당에는 SQL구문 오류가 있다고 나옴. 따라서 마지막 \ 이 단순히 문자열이 아닌 특수문자 그대로 받아들이면서 구문을 망가트리게 되는것을 확인. 

이를 이용해 SQL 인젝션을 통하게끔 할수있다.

 

(근데 여기까지 하면서 이해가 안가는점)

255번째 자리의 백슬래시만 에러를 유발시키는 이유를 모르겠음.

뭐 예시로 8번째 자리의 백슬래시던 200번째 자리의 백슬래시던 똑같이 255자라는 범위 이내의 백슬래시이고

255번째 자리의 백슬래시도 어찌됐던 255자 라는 범위 이내에 있는 백슬래시 인데 왜 255번째 백슬래시만 에러를 유발시키고 8번째,200번째 뭐 이런 백슬래시는 문자열로 받아들이면서 에러를 유발시키지않고 게시글 제목에 그대로 올라가는건가?

 

챗 GPT한테 물어본결과로는
php코드로 255자까지 받는데
200번째에 백슬래시를 넣고 끝내버리면
이또한 문자열 "중간"에 있는 백슬래시로 인식하고 정상적으로 문자열로 올려버린다고 함
무조건 문자열 "끝"에 있어야한다고 하네요.
php코드상으로 255까지 받으면 255째자리에 있어야 "끝"으로 인식한다함.

그래야 코드상으로 짜여져있는 SQL구문의 ' 앞에 \가 붙어버리게 되어 코드상으로 \'가 되면서 
원래는 ' ' 이런식으로 짜여져있는 코드의 닫히는 '를 \'로 만들어 정상적으로 닫히게되지 않게 만들기때문.

write_update.php코드에서 최종적으로 sql에 insert 구문을 넣게되는 코드를 보자.

여기서 우리가 공격을 하는부분은 wr_subject부분이다.

여기서 subject부분의 마지막 닫는 '앞에 \를 넣어 '를 닫는 특수문자가 아닌 문자열로 만들어버리면서 이 이후에 코드들은 전부 subject안에 들어가는 문자열로 되는것.

 

 

따라서 지금 상황은

wr_subject = aaa...(254개)..aa\', wr_content = 

가 들어가있는것

그럼 코드는 

wr_subject = aaa...(254개)..aa\', wr_content = 

$wr_content',

wr_link1 = '$wr_link1',

wr_link2 = '$wr_link2',

....

이런식으로 바뀌게됨

그럼 우린 

 

wr_subject = aaa...(254개)..aa\', wr_content = 

$wr_content',

wr_link1 = '$wr_link1',

wr_link2 = '$wr_link2',

....

 

여기에 또 값을 넣을수있으니 여기에 원하는대로 sql구문을 삽입해 악의적인 행동을 할 수 있는것이다.