MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Inaweza kuwa inawezekana kuhesabu watumiaji wa kikoa kupitia SQL injection ndani ya MSSQL server kwa kutumia kazi zifuatazo za MSSQL:
SELECT DEFAULT_DOMAIN()
: Pata jina la kikoa cha sasa.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Ikiwa unajua jina la kikoa (DOMAIN katika mfano huu) kazi hii itarudisha SID ya mtumiaji Administrator katika muundo wa hex. Hii itakuwa kama 0x01050000000[...]0000f401
, angalia jinsi bytes 4 za mwisho ni nambari 500 katika muundo wa big endian, ambayo ni ID ya kawaida ya mtumiaji administrator.
Kazi hii itakuruhusu kujua ID ya kikoa (bytes zote isipokuwa za mwisho 4).
SUSER_SNAME(0x01050000000[...]0000e803)
: Kazi hii itarudisha jina la mtumiaji wa ID iliyoonyeshwa (ikiwa ipo), katika kesi hii 0000e803 katika big endian == 1000 (kawaida hii ni ID ya mtumiaji wa kwanza wa kawaida aliyeundwa). Kisha unaweza kufikiria kwamba unaweza kufanya brute-force ID za watumiaji kutoka 1000 hadi 2000 na pengine kupata majina yote ya watumiaji wa kikoa. Kwa mfano kwa kutumia kazi kama ifuatayo:
Kosa la SQL lililo msingi wa makosa kwa kawaida linafanana na muundo kama +AND+1=@@version--
na toleo tofauti kulingana na opereta «OR». Maswali yanayojumuisha matamko kama haya kwa kawaida yanazuiwa na WAFs. Kama njia ya kupita, ungana na mfuatano kwa kutumia herufi %2b pamoja na matokeo ya wito maalum wa kazi zinazochochea kosa la kubadilisha aina ya data kwenye data inayotafutwa.
Mifano kadhaa ya kazi kama hizo:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Mfano wa matumizi ya kazi USER_NAME()
:
Hizi mbinu za SSRF zilichukuliwa kutoka hapa
fn_xe_file_target_read_file
Inahitaji ruhusa ya VIEW SERVER STATE
kwenye seva.
fn_get_audit_file
Inahitaji ruhusa ya CONTROL SERVER
.
fn_trace_gettabe
Inahitaji ruhusa ya CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
Taratibu zilizohifadhiwa kama xp_dirtree
, ingawa hazijadiliwa rasmi na Microsoft, zimeelezewa na wengine mtandaoni kutokana na matumizi yao katika operesheni za mtandao ndani ya MSSQL. Taratibu hizi mara nyingi hutumiwa katika Uhamasishaji wa Data nje ya Muktadha, kama inavyoonyeshwa katika mifano mbalimbali examples na posts.
Taratibu iliyohifadhiwa ya xp_dirtree
, kwa mfano, inatumika kufanya maombi ya mtandao, lakini inakabiliwa na kikomo cha bandari ya TCP 445 pekee. Nambari ya bandari haiwezi kubadilishwa, lakini inaruhusu kusoma kutoka kwa sehemu za mtandao. Matumizi yake yanaonyeshwa katika skripti ya SQL hapa chini:
Ni muhimu kutambua kwamba njia hii huenda isifanye kazi kwenye usanidi wote wa mifumo, kama kwenye Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
inayotembea kwenye Windows Server 2016 Datacenter
ikiwa na mipangilio ya kawaida.
Zaidi ya hayo, kuna taratibu mbadala za kuhifadhi kama master..xp_fileexist
na xp_subdirs
ambazo zinaweza kufikia matokeo sawa. Maelezo zaidi kuhusu xp_fileexist
yanaweza kupatikana katika makala hii ya TechNet.
xp_cmdshell
Kwa wazi unaweza pia kutumia xp_cmdshell
ili kutekeleza kitu kinachochochea SSRF. Kwa maelezo zaidi soma sehemu husika kwenye ukurasa:
Kuunda CLR UDF (Common Language Runtime User Defined Function), ambayo ni msimbo ulioandikwa kwa lugha yoyote ya .NET na kukusanywa kuwa DLL, ili kupakiwa ndani ya MSSQL kwa ajili ya kutekeleza kazi za kawaida, ni mchakato unaohitaji ufikiaji wa dbo
. Hii ina maana kwamba kawaida inapatikana tu wakati muunganisho wa hifadhidata unafanywa kama sa
au kwa jukumu la Msimamizi.
Mradi wa Visual Studio na maelekezo ya usakinishaji yanatolewa katika hifadhi hii ya Github ili kuwezesha upakuaji wa binary ndani ya MSSQL kama mkusanyiko wa CLR, hivyo kuwezesha utekelezaji wa maombi ya HTTP GET kutoka ndani ya MSSQL.
Msingi wa kazi hii umefungwa katika faili ya http.cs
, ambayo inatumia darasa la WebClient
kutekeleza ombi la GET na kupata maudhui kama ilivyoonyeshwa hapa chini:
Kabla ya kutekeleza amri ya SQL CREATE ASSEMBLY
, inapendekezwa kukimbia kipande hiki cha SQL kuongeza hash ya SHA512 ya mkusanyiko kwenye orodha ya mkusanyiko unaoaminika wa seva (unaoweza kuangaliwa kupitia select * from sys.trusted_assemblies;
):
Baada ya kuongeza assembly kwa mafanikio na kuunda kazi, msimbo ufuatao wa SQL unaweza kutumika kufanya maombi ya HTTP:
Njia fupi ya kutoa maudhui kamili ya jedwali katika ombi moja inahusisha kutumia kipengele cha FOR JSON
. Njia hii ni fupi zaidi kuliko kutumia kipengele cha FOR XML
, ambacho kinahitaji hali maalum kama "raw". Kipengele cha FOR JSON
kinapendekezwa kwa sababu ya ufupi wake.
Hapa kuna jinsi ya kupata muundo, jedwali, na safu kutoka kwa hifadhidata ya sasa:
For users granted the VIEW SERVER STATE
permission on the server, it's possible to see all executing sessions on the SQL Server instance. However, without this permission, users can only view their current session. The currently executing SQL query can be retrieved by accessing sys.dm_exec_requests and sys.dm_exec_sql_text:
To check if you have the VIEW SERVER STATE permission, the following query can be used:
Non-standard whitespace characters: %C2%85 или %C2%A0:
Scientific (0e) and hex (0x) notation for obfuscating UNION:
A period instead of a whitespace between FROM and a column name:
\N separator between SELECT and a throwaway column:
According to this blog post it's possible to stack queries in MSSQL without using ";":
So for example, multiple queries such as:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)