본문 바로가기
Web hacking/개념 정리 & 심화

[WEB]Blind SQL Injection 심화 정리

by m_.9m 2022. 5. 30.

1-1)    

 

아래 2가지는 일반적으로 웹 서버 권한으로 사용할 수 있는지?

 

 

Mysql Sleep, oracle dbms_pipe.receive_message를 사용할 수 없다.

웹 어플리케이션과 연동되는 데이터 베이스의 접근권한이 최소화된다

**오라클 데이터 베이스의 경우 클라이언트 해석을 위한 JDBC와 포트가 필요한데 해킹 툴 중엔 내장되어있는 경우도 있다. 오라클 내에서 실제로 허용 함수들을 쭉 확인할 수 있다.

[예시]

SELECT *
FROM USER_SOURCE
WHERE TYPE = 'FUNCTION'
AND TEXT LIKE '%substr%'
;

 

 

1-2)       Order by를 pstmt에 사용 할 수 있는지?


Prepare statement는 효율적인 클라이언트/서버 바이너리 프로토콜을 활용합니다.

*실행 마다 명령문 구문 분석을 위한 오버 헤드가 줄어듭니다. DB 응용 프로그램은 쿼리 및 삭제 WHERE, 업데이트 SET 및 삽입 VALUES와 같은 절의 변수 값만 변경하여 대량의 거의 동일한 명령문을 처리.

*pstmt는 문자열 리터럴 또는 SQL 문의 텍스트를 포함하는 사용자 변수. 세션이 진행되는 기간 동안만 지속된다. 세션이 종료되면 준비된 문이 삭제되므로 다시 사용하려면 다시 만들어야 한다. 각 클라이언트는 사용할 준비될 문을 스스로 만들 수 있다. 한 세션에서 작성된 준비 된 문장은 다른 세션에서 사용할 수 없다. 저장된 프로그램 내 작성된 준비된 명령문은 나중에 프로그램 외부에서도 실행이 가능.

*PREPARE 문이 실행될 때 지정된 문(대부분 DML , SELECT, INSERT, UPDATE DELETE등)의 구문이 분석, 재작성 및 계획된다. 직접적인 명령이 실행될 때 쿼리 실행 계획을 선택적으로 수정한 후 준비된 문을 실행할 수 있다. 캐시에 저장된 Query를 활용한다. DEALLOCATE 명령을 사용하여 준비된 문을 수동으로 제거할 수 있다.
SQL 수준의 Prepare문은 DB 연결 당 개수가 최대 20개로 제한된다. SQL 수준의 Prepare문은 DB 서버 매모리의 남용을 방지하기 위해 제한된다

*DBMS 실행절차: Parsing(문법, 오류 체크, 재사용 가능 SQL확인, 실행 계획 수립) > Execution > Fetch(결과를 가져오므로 Select만 해당)
D
 

 

 

Prepare Statement는 쿼리에 대한 준비된 명령문을 미리 준비함으로써 성능을 개선하기 위해 만들어졌습니다. DB 서버 메모리의 남용을 방지하기 위해 DML언어로 된 구문으로 Prepare Statement가 적용됩니다. Order by는 쿼리 결과를 정렬하는 기능으로 Prepare Statement가 만들어진 목적과는 거리가 멉니다.

**order by는 단순 정렬으로 속도랑 관계가 없다. Preparestatement는 Parsing 과정에서 시간이 많이 걸리는데 실행 계획을 고정시켜 이 시간을 절약시키는 것.

 

 

1-3)        Oracle 기준으로 개발자에게 가이드 하듯이 blacklist filter 방식에 대해 어떤 문자열들을 어떻게 처리해야하는지 자세히 작성해볼 것.

구분 필터링 할 문자열
특수문자 ) -- #
% + - /*, */ /
SQL 함수 AND OR SELECT FROM WHERE
UPDATE INSERT SET INTO DELETE 등
검색 ALL_TABLE TEBLE_NAME ALL_TAB_COLUMNS COlUMNN_NAME dual
Blind SQLI SUBSTR ASCII      

 

헤당 문자열을 악용 시 SQL INJECTION이 가능하기 때문에 필터링 해야한다.

(Union, Error based 제외)

/*, –, ‘, “, ?, #, (, ), ;, @, =, *, +, union, select, drop, update, from, where, join, substr, user_tables, user_table_columns, information_schema, sysobject, table_schema, declare, dual,…

 

 

1-4)        Hash map이 뭔지 찾아볼 것

** 화이트 리스트 기반 필터링의 가장 대표적인 예시

. Figure 1. https://coding-factory.tistory.com/556

대부분의 탐색 방법들은 탐색 키를 저장된 키 값과 반복적으로 비교하면서 탐색을 원하는 항목에 접근한다. 반면에 해싱은 키 값에 산술적인 연산을 적용해 테이블의 주소를 계산하여 항목에 저장한다. 이 값의 연산에 의해 직접 접근이 가능한 구조를 해시테이블, 이를 이용한 탐색을 해싱이라고 한다. HashMap은 내부에 ‘키’와 ‘값’을 지정하는 자료구조이다. 데이터 베이스 내에 해시 맵을 저장하려면 사용자, 열쇠, 값의 세개의 열로 나누어 저장할 수 있다.

 

 

1-5)        Oracle 쿼리에서 inline view를 쓰는 이유는?

Join은 가상의 값이 조회되지 않기 때문에 inline view나 subquery로 존재하지 않는 값에 대한 NULL값을 받을 수 있다. inline view는 조건을 독립적으로 해결할 수 있으므로 아주 유용하다. 인라인 뷰는 서브 쿼리에 의해 메모리 상에서 잠시 생성되었다가 사라지는 임시 테이블이다.

** rownum은 사용할 때 인라인 뷰로 다시 정의 해주지 않으면 2까지 인덱스가 도달하지 않는다. 인덱스 1에 데이터가 없으면 삭제하고 다시 2>1로 갱신되기 때문에 다시한번 inline view로 정의해준다. 인라인 뷰를 중복해서 쓰는 것도 이 이유 때문.