Information Technology/Web hacking

Debug, UNION SQL Injection Process, admin is mine 문제풀이, Pin Code Crack 파이썬 자동화 코드

Brandon IT 2025. 5. 28. 14:41
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