일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Los
- Python
- JS
- blind sql injection
- 과제
- cookie 탈취
- csrf
- cors
- 게시판 만들기
- lord of sqli
- XSS
- sql injection
- 세션
- 쿠키
- Cross Site Request Forgery
- 로그인
- 웹개발
- Error based sql injection
- 로그인페이지
- php
- CTF
- union sql injection
- sql injection point
- file upload
- 모의해킹
- css
- MySQL
- lord of sql injection
- JWT
- Reflected Xss
- Today
- Total
Almon Dev
모의해킹 공부 7주차 (SQL Injection) 본문
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
- SQL Injection 포인트 찾기 => sql injection이 가능하고, 결과가 화면에 출력되는지 확인
- Column 개수 확인 => order by를 이용해서 확인
- 화면에 출력되는 column 위치 확인 => 몇 번째 column이 화면에 출력되는지 확인
- DB명 추출 => database() 함수 이용
- Table명 추출 => information_schema.tables의 table_name을 select 해서 확인
- Column명 추출 => information_schema.columns의 column_name을 select 해서 확인
- 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
- SQL Injection 포인트 찾기 => sql injection이 가능한지, 에러가 출력되는지 확인
- 에러를 출력할 함수 찾기 => mysql에서는 extractvalue()를 사용합니다.
- 공격 format 만들기 => ~~' and extractvalue('1', concat(':', SQL 삽입')) and '1' ='1 처럼 템플릿 만들기
- DB 명 추출 => select database() 이용
- Table 명 추출 => information_schema.tables의 table_name을 select
- Column 명 추출 => information_schema.columns의 column_name을 select
- 데이터 추출 => 추출한 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
- SQL Injection 포인트 찾기 => 참과 거짓에 따라 결과값이 어떻게 다른지 확인
- select가 가능한지 확인 => select문이 필터링이 되는지 확인하기 ex) ~' and ((select 1) = 1) and '1' = '1
- 공격 format 만들기 => ~' and (ascii(substring((select), 1,1)) > 0) and '1' = '1
- DB명 추출 => select database()를 삽입
- Table명 추출 => information_schema.tables의 table_name을 select
- Column 명 추출 => information_schema.columns의 column_name을 select
- 데이터 추출 => 추출한 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 |