SQL Injection, XSS, CSRF, File Upload/Download, 인증 / 인가에 대해서
What (무엇인지), Where (어디에서 발생할 수 있는지), Why (왜 일어나는지), Scenario (뭘 할 수 있는지), Defense (방어 방법)을 말로 설명할 수 있어야한다
** SQL Injection
> What (무엇인지)
공격자가 임의의 SQL 쿼리를 삽입해, 서버 측에서 실행되는 SQL 쿼리가 공격자의 의도대로 변조되는 공격
> Where (어디에서)
SQL 쿼리를 사용하는 페이지 (DB 데이터를 가져오거나, 추가하거나, 수정하는 페이지)
> Why (왜 일어나는지)
사용자의 입력(파라미터)을 직접 SQL 쿼리에 삽입해서 사용하기 때문에
> Scenario (뭘 할 수 있는지)
DB 데이터 추출, DB 데이터 변조
DB가 Web Server와 하나의 머신에 구동되어있다면, 파일을 업로드 할 수도 있다 (mysql 기준)
ex) select "<? echo system($_GET['cmd']);?>" into outfile "/var/www/html/webshell.php"
ex) select "text" into outfile "/tmp/file.txt" → DB 서버에 file.txt 파일이 생성되고 "text" 데이터가 들어간다
파일 다운로드도 가능
ex) select load_file("PATH_TO_FILE");
ex) select load_file("/etc/passwd"); → etc/passwd 파일이 불러와진다
> Defense (방어 방법)
① Prepared Statement
미리 Compile하여 DB 속도를 빠르게 하기 위해 만들어졌다
Complie: (프로그래밍 언어) 소스코드 → 컴퓨터 언어
Prepared statement가 통하지 않는 곳
- Column
- Table
- Order by (정렬 부분) -> select ~~ order by [Column 이름] [asc/desc]
② 화이트 리스트 기반 필터링 (Prepared statement가 안 되는 곳)
허용해 준 단어들만 들어올 수 있게 한다
ex)
if (sort="asc") :
sql = "order by title asc"
else :
sql = "order by title desc"
블랙리스트 기반은 우회가 될 여지가 있다
* SQL Injection 3가지 케이스
① Union SQLi
SQL 쿼리 결과가 화면에 출력되는 곳
길고 복잡한 sql 쿼리를 사용하는곳에서 union sqli를 적용하기 힘들기 때문에 현업에서는 잘 나오지 않는다
② Error based SQLi
논리 에러 유발
③ Blind SQLi
SQL Injection이 일어나는 모든 곳에서 가능하다
참과 거짓 조건에 따라 응답 결과가 다른 점을 이용하는 것
많은 요청을 보내야하기 때문에 프로그래밍 자동화 능력이 요구된다
* SQL Injection 모의해킹 시 주의할 점
① INSERT, DELETE, UPDATE 함부로 확인하지 않기 → SELECT문 주로 하기
② 주석 남용 금지 (select문에서도 웬만하면 주석 조심)
③ 데이터 변조 금지
** XSS
> What (무엇인지)
공격자가 Client 측 스크립트를 삽입해서 Client 측에서 임의의 코드를 실행하는 공격
> Where (어디에서)
사용자의 입력이 응답에 출력되는 곳
> Why (왜 일어나는지)
사용자의 입력(파라미터)을 그대로 응답에 삽입하기 때문에
> Scenario (뭘 할 수 있는지)
① 세션 탈취
② 피싱 페이지 유도
③ HTML 페이지 변조
④ 키로거 삽입
> Defense (방어 방법)
HTML 특수문자(<,>,',",;)들을 HTML Entity 표현 방법으로 치환
* HTML Editor
① HTML 특수문자(<,>,',",;)들을 HTML Entity 표현 방법으로 치환한다
② 화이트 리스트 기반으로 살려줄 태그(<a>, <img>)들을 복구한다
③ 블랙 리스트 기반으로 악성 스크립트가 실행될 여지가 있는 Event handler(onerror, onload 등등)를 필터링한다
* XSS 3가지 케이스
① Stored XSS
스크립트를 삽입하고 출력하는 페이지가 다르다
> 보안 조치할 때 입력하는 곳에서 HTML Entity 치환 할지, 출력하는 곳에서 HTML Entity 치환할지를 통일해야한다
② Reflected XSS
스크립트를 삽입하고 출력하는 페이지가 같다
GET 방식으로 전달이 가능해야한다 → URL 링크로 전달
HTTP Referer 헤더: Reflected XSS 공격이 가능한 경우가 있다 (일반적으로는 안 된다)
ex) http://normaltic.com/normaltic → 요청: 없는 페이지 → 응답: Error Page로 Redirect
이 Error Page가 Referer 헤더에 있는 값을 그대로 응답페이지에 사용할 경우
http://normaltic.com/<script>alert(1)</script>를 보내면 Error Page로 갈 때 Referer 헤더에 그대로 들어간다
→ Referer: http://normaltic.com/<script>alert(1)</script>
③ DOM Based XSS
서버 측에서 전달되지 않는다
document.write처럼 HTML 태그를 생성하는 코드가 있는 곳에서 발생한다
동적으로 생성되기 때문에 서버에서 보안 조치를 할 수 없기 때문에 클라이언트 측에서 보안 조치(HTML Entity 치환 코드를 JavaScript로 구현)한다
* XSS 모의해킹 시 주의할 점
① HTML 태그 잘 닫아주기 (Stored XSS일 경우 글이 깨질 수 있다)
② HTTP history 기록 잘 남기기
③ Stored XSS의 경우 alert(1) 대신 onmouseover, onclick으로 하기
** 모의해킹 프로젝트
> 모의해킹 결과 보고서 (포폴)
> 이행점검 결과 보고서 (포폴)
> 발표 (면접 준비)
'Web Hacking Study > 수업 정리' 카테고리의 다른 글
| [14주차] 모의해킹 Project 2주차, CSRF 취약점 점검 팁, 세션 고정 취약점 (0) | 2022.07.01 |
|---|---|
| [13주차] 모의해킹 프로젝트 가이드 (0) | 2022.06.24 |
| [11주차] 인증/인가 취약점 (0) | 2022.06.10 |
| [10주차] File Upload 대응방안, File Download 공격개념, 대응방안 (0) | 2022.06.03 |
| [9주차] File Upload 공격 개념, 검증 및 우회 (0) | 2022.05.27 |
댓글