Web Hacking Study/수업 정리

[12주차] SQL Injection, XSS 취약점 점검 팁

silver surfer 2022. 6. 17.

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: (프로그래밍 언어) 소스코드 → 컴퓨터 언어

https://www.hackedu.com/blog/how-to-prevent-sql-injection-vulnerabilities-how-prepared-statements-work

 

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으로 하기

 

** 모의해킹 프로젝트

> 모의해킹 결과 보고서 (포폴)

> 이행점검 결과 보고서 (포폴)

> 발표 (면접 준비)

 

 

 

 

 

 

 

 

 

 

댓글