Almon Dev

모의해킹 공부 7주차 (SQL Injection) 본문

모의해킹/모의해킹

모의해킹 공부 7주차 (SQL Injection)

Almon 2024. 11. 29. 05:52

7주 차 정리

 

SQL Injection

 

UNION SQL injection

SQL 질의문의 결과가 화면에 출력될 때 사용합니다.
ex) 마이페이지, 게시판 등

UNION : select문을 실행한 뒤 select를 한번 더 사용하기 위해서 사용합니다.
=> 첫 번째 select문과 결과가 합쳐져서 하나의 테이블이 되기 때문에 column의 수가 같아야 합니다.

order by : column명이나 index를 이용해서 결과를 정렬해 주는 sql문입니다.
=> index로 정렬이 가능한 점을 이용해서 select문의 column이 몇 개인지 확인합니다.

limit [offset] [count] : offset부터 count만큼 개수의 결과를 가져옵니다.
ex) limit 0,2 첫 번째부터 2개의 결과를 가져옵니다.

 

UNION SQL Injection Process

  1. SQL Injection 포인트 찾기 => sql injection이 가능하고, 결과가 화면에 출력되는지 확인
  2. Column 개수 확인 => order by를 이용해서 확인
  3. 화면에 출력되는 column 위치 확인 => 몇 번째 column이 화면에 출력되는지 확인
  4. DB명 추출 => database() 함수 이용
  5. Table명 추출 => information_schema.tables의 table_name을 select 해서 확인
  6. Column명 추출 => information_schema.columns의 column_name을 select 해서 확인
  7. Data 추출 => Table, Column명을 이용해서 데이터를 추출합니다.

 

Error Based SQL Injection

SQL 질의문에서 에러가 발생했을 때 에러가 화면에 출력되면 사용합니다.
=> 로직에러(php 등 서버코드)가 아니라, SQL 에러일 때만 가능합니다.
=> SQL 에러 중에서 문법에러(syntax error)가 아니라 로직에러여야 가능합니다.
=> mysql, oracle, mssql 등 db마다 에러를 일으키는 방법이 다릅니다.

mysql 에러 : extractvalue()를 이용해서 로직에러를 발생시킵니다.
extractvalue("XML문자", "XML표현식")에서 XML표현식에 예약된 문자인 !나 :를 넣으면 에러가 발생합니다.
ex) extractvalue("a", ":test"); =>  :test는 xml 표현식이 아닙니다.라는 에러메시지가 뜹니다.

concat : 문자열을 합쳐주는 함수입니다.
=> concat('abc', (select def)) = 'abcdef'

 

Error Based SQL Injection Process

  1. SQL Injection 포인트 찾기 => sql injection이 가능한지, 에러가 출력되는지 확인
  2. 에러를 출력할 함수 찾기 => mysql에서는 extractvalue()를 사용합니다.
  3. 공격 format 만들기 => ~~' and extractvalue('1', concat(':', SQL 삽입')) and '1' ='1 처럼 템플릿 만들기
  4. DB 명 추출 => select database() 이용
  5. Table 명 추출 => information_schema.tables의 table_name을 select
  6. Column 명 추출 => information_schema.columns의 column_name을 select
  7. 데이터 추출 => 추출한 Table, Column을 이용해서 select

 

Blind SQL Injection

SQL 질의문의 결과가 화면에 출력되지 않고, 참과 거짓의 응답이 다를 때 사용합니다.
ex) 로그인, 중복확인 등 성공, 실패의 결과만 알 수 있을 때

substring('text', [index], [count]) : 한 글자씩 확인하는 용도로 사용합니다.
ex) substring((select 'test'),1,1) = 't'

ascii('문자') : 문자를 ascii코드의 숫자로 변환해 줍니다.
=> blind sql injection으로 한 글자씩 문자를 알아낼 때 숫자로 비교하는 게 더 빠릅니다.

 

Blind SQL Injection Process

  1. SQL Injection 포인트 찾기 => 참과 거짓에 따라 결과값이 어떻게 다른지 확인
  2. select가 가능한지 확인 => select문이 필터링이 되는지 확인하기 ex) ~' and ((select 1) = 1) and '1' = '1
  3. 공격 format 만들기 => ~' and (ascii(substring((select), 1,1)) > 0) and '1' = '1
  4. DB명 추출 => select database()를 삽입
  5. Table명 추출 => information_schema.tables의 table_name을 select
  6. Column 명 추출 => information_schema.columns의 column_name을 select
  7. 데이터 추출 => 추출한 Table, Column을 이용해서 select

 

'모의해킹 > 모의해킹' 카테고리의 다른 글

ctf 풀이 (SQL Injection 4)  (0) 2024.11.30
ctf 풀이 (SQL Injection 3)  (2) 2024.11.29
ctf 풀이 ( SQL Injection 2 )  (1) 2024.11.24
ctf 풀이 (SQL Injection 1)  (0) 2024.11.23
모의해킹 공부 (6주차 정리)  (0) 2024.11.22