niedziela, 14 czerwca 2009

Hakowanie w Accessie

Czasem mamy twardy orzech do zgryzienia z bazą napisaną przez nas lub przez kogoś obcego a występująca jedynie w postaci pliku mde - czyli wersji skompilowanej. Dla niewtajemniczonych plik taki to w pełni działająca aplikacja w której nie da się modyfikować formularzy, raportów i kodu VBA. Modyfikacja kwerend i makr jest dozwolona.

Naszym zadaniem jest poznanie Connection Stringa tak aby wydobyć z niego hasło, gdyż mamy niecny plan napisania lepszej aplikacji i potrzebujemy zalogować się na ten zewnetrzny serwer SQL.
Jeżeli w aplikacji znajduje się tabela podlinkowana lub kwerenda przekazująca to problem jest banalny. W przypadku zaś gdy nie ma takich obiektów jest trochę trudniej, ale nie beznadzijnie ;)
Do tego zadania wykorzystamye pewną cechę środowiska Access, które nie są wykorzystywana w codziennej pracy, a mianowicie możliwość dodania referencji w projekcie VBA do pliku mdb/mde dokładnie tak samo jak do biblioteki dll.



Na obrazku widzimy dodany do referencji projektu plik z tajnymi danymi. Na pasku bocznym zaś projekt będzie wyglądał następująco:



Widzimy listę obiektów do których możemy przeszukać pod kątem występowania obiektów do wykorzystania. Przeszukiwanie najłatwiej zrealizować za pomocą Object Browser-a

Ikonka Object Browser-a

Wybieramy tam z listy rozwijanej plik który przeszukujemy:



Pewną niedogodnością jest to że musimy się domyśleć jak działa sprawdzana aplikacja, gdyż obiekt do którego się odwołujemy sam z siebie może nie mieć oczekiwanych danych. Przy odrobinie szczęścia można dojść do tego na drodze dedukcji :)

Teraz najważniejsze: W jaki sposób dobrać się do takich danych?
Trzeba poprostu odwołać się do obiektu dokładnie tak samo jak by był normalnym obiektem, funkcją lub procedurą. Przykładowy kod poniżej
Sub test_conn()
Dim oConn As ADODB.Connection

mod_conn.Connec

Set oConn = mod_conn.fGetConn

Debug.Print oConn.ConnectionString
Debug.Print CurrentProject.Connection.ConnectionString

mod_conn.CloceConn

End Sub


przykładowy kod w module mod_conn wyglądał by np. tak:
Option Compare Database
Option Explicit

Private oConn As ADODB.Connection

Sub Connec()

Set oConn = New ADODB.Connection
oConn.ConnectionString = "Provider=sqloledb;Server=PRZEMEK-PC\SQLEXPRESS;Database=Aplikacja;Trusted_Connection=yes;"
oConn.Open

End Sub

Function fGetConn() As ADODB.Connection
Set fGetConn = oConn
End Function

Sub CloceConn()
oConn.Close
Set oConn = Nothing
End Sub

Widzimy tu że konieczne jest zainicjowanie połączenia za pomocą procedury Connec, informacje zaś o obiekcie Connection uzyskamy z funkcji fGetConn.

Jak się bronić?

Metoda jest bardzo prosta :) pisać kod w klasach, gdyż nie można utworzyć nowej instancji klasy znajdującej się w pliku z referencji.

pod tym linkiem można pobrać pliki do analizy w domowym zaciszu: projekt apollo

Brak komentarzy:

Prześlij komentarz