{"id":317,"date":"2018-06-06T08:00:37","date_gmt":"2018-06-06T06:00:37","guid":{"rendered":"http:\/\/cwiok.pl\/?p=317"},"modified":"2018-06-06T08:25:20","modified_gmt":"2018-06-06T06:25:20","slug":"atak-sql-injection-w-usludze-power-bi","status":"publish","type":"post","link":"https:\/\/cwiok.pl\/index.php\/pl\/2018\/06\/06\/atak-sql-injection-w-usludze-power-bi\/","title":{"rendered":"Atak SQL Injection w us\u0142udze Power BI"},"content":{"rendered":"<p>Zdaj\u0119 sobie spraw\u0119, \u017ce taki temat mo\u017ce by\u0107 oczywisto\u015bci\u0105 dla wielu do\u015bwiadczonych in\u017cynier\u00f3w danych czy SQLowc\u00f3w, ale mnie mocno zaskoczy\u0142. Nasz architekt Pawe\u0142 Potasi\u0144ski zwr\u00f3ci\u0142 mi uwag\u0119 na tak\u0105 mo\u017cliwo\u015b\u0107. W kontrolowanym \u015brodowisku Power BI pozwala na wstrzykni\u0119cie kodu SQL poprzez parametr i robienie (prawie) wszystkiego na co ma si\u0119 ochot\u0119 &#8211; nawet usuni\u0119cie bazy danych! O SQL Injection mo\u017cna poczyta\u0107 <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL_injection\">tutaj<\/a> lub obejrze\u0107 ten <a href=\"https:\/\/www.youtube.com\/watch?v=ciNHn38EyRc\">filmik<\/a>. A o moich skryptach w M <a href=\"http:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/30\/uwierzytelnianie-przy-uzyciu-wielu-loginow-i-hasel-do-jednego-zrodla-danych\/\">tu<\/a> lub <a href=\"http:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/23\/zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi\/\">tu<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-307\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03.jpg\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03.jpg 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-300x157.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-768x402.jpg 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-1024x536.jpg 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<p>Pierwotnie zadanie polega\u0142o na umo\u017cliwieniu zmiany liczby pobieranych wierszy z bazy. Maj\u0105c mo\u017cliwo\u015b\u0107 modyfikacji parametr\u00f3w w us\u0142udze Power BI, nie wydawa\u0142o si\u0119 to trudne. Aby zadeklarowa\u0107 parametr wyklika\u0142em taki kod:<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">\"1\" meta [IsParameterQuery=true, Type=\"Number\", IsParameterQueryRequired=true]<\/pre>\n<p>&nbsp;<\/p>\n<p>Wa\u017cne jest ustawienie tego jako liczb\u0119 albo inny typ. Tylko wtedy jest mo\u017cliwo\u015b\u0107 zmiany parametru w us\u0142udze Power BI.<\/p>\n<p>Nast\u0119pnie w M doda\u0142em zapytanie SQL:<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">let\r\n\r\nSource = Sql.Database(\"\", \"\", [Query=\"SELECT TOP \" &amp; Text.From(Number_of_rows)&amp;\" * FROM [dbo].[tblAuthors]\"])\r\nin\r\nSource<\/pre>\n<p>&nbsp;<\/p>\n<p>Dzia\u0142a\u0142o to dobrze. Nast\u0119pnie razem z Paw\u0142em zmienili\u015bmy typ parametru na &#8220;Text&#8221; i ustawili\u015bmy jego warto\u015b\u0107 na :<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">100 * FROM Sys.Tables-- \r\n<\/pre>\n<p>Dodam, \u017ce login i has\u0142o w wykorzystywanym \u015brodowisku mia\u0142y pe\u0142ny dost\u0119p, wi\u0119c rezultat \u0142atwy do przewidzenia:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-304 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection1.png\" alt=\"\" width=\"847\" height=\"114\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection1.png 847w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection1-300x40.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection1-768x103.png 768w\" sizes=\"auto, (max-width: 847px) 100vw, 847px\" \/><\/a><\/p>\n<p>Postanowi\u0142em eksperymentowa\u0107 dalej i zobaczy\u0107, jak daleko zajd\u0119. Po opublikowaniu raportu do us\u0142ugi, zmieni\u0142em warto\u015b\u0107 parametru tak jak to zrobi\u0142em w Power BI Desktop:<br \/>\n<a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-303 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection2.png\" alt=\"\" width=\"467\" height=\"164\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection2.png 467w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection2-300x105.png 300w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/a><\/p>\n<p>I otrzyma\u0142em b\u0142\u0105d:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-302 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection3.png\" alt=\"\" width=\"546\" height=\"160\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection3.png 546w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection3-300x88.png 300w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/a><\/p>\n<p>Wydaje si\u0119, \u017ce Power BI oczekuje takich samych kolumn podczas od\u015bwie\u017cania danych. Oczywi\u015bcie spr\u00f3bowa\u0142em obej\u015b\u0107 to ograniczenie. W tym wypadku mo\u017cna u\u017cy\u0107 te\u017c zwyk\u0142ego UNIONa.<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">100 name as Author_name, object_id as id, schema_id as country FROM Sys.tables--\"\r\n<\/pre>\n<p>Zadzia\u0142a\u0142o to idealnie:<br \/>\n<a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-301 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection4.png\" alt=\"\" width=\"522\" height=\"472\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection4.png 522w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection4-300x271.png 300w\" sizes=\"auto, (max-width: 522px) 100vw, 522px\" \/><\/a><\/p>\n<p>Parametr nie b\u0119dzie zawsze przed &#8220;FROM&#8221;. Czasami b\u0119dzie w procedurze sk\u0142adowanej albo w cz\u0119\u015bci WHERE. Co si\u0119 dzieje kiedy dodamy drugie zapytania po \u015bredniku? Je\u015bli damy zapytanie SELECT, dostaniemy tylko pierwszy jako wynik. Natomiast innego rodzaju zapytania zostan\u0105 wykonane, ale bez widocznej informacji zwrotnej. Bez wi\u0119kszych oczekiwa\u0144 zacz\u0105\u0142em od najwi\u0119kszego kalibru:<br \/>\n<a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-305 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection5.png\" alt=\"\" width=\"490\" height=\"146\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection5.png 490w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/SQL_Injection5-300x89.png 300w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><\/a><\/p>\n<p>I to zadzia\u0142a\u0142o:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/drop_database.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-329 size-full\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/drop_database.png\" alt=\"\" width=\"501\" height=\"78\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/drop_database.png 501w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/drop_database-300x47.png 300w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/a><\/p>\n<p>Zapytanie wykonuje si\u0119 bez \u017cadnych b\u0142\u0119d\u00f3w, co jest niepokoj\u0105ce. Zgodnie z <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/statements\/drop-database-transact-sql?view=sql-server-2017\"> dokumentacj\u0105<\/a> &#8220;Musisz by\u0107 pod\u0142\u0105czony do bazy danych master, \u017ceby usun\u0105\u0107 baz\u0119 danych&#8221; i &#8220;Zapytanie DROP DATABASE musi by\u0107 jedynym zapytaniem jakie jest wykonywane w danej transzy&#8221;. Ani pierwsza, ani druga rzecz si\u0119 nie sprawdzaj\u0105 w tym wypadku. B\u0119d\u0119 jeszcze analizowa\u0142, jak Power BI wysy\u0142a zapytania do bazy. Nie mniej jednak, mo\u017cna ca\u0142\u0105 spraw\u0119 traktowa\u0107 jako ciekawostk\u0119, poniewa\u017c nie mo\u017cna zmienia\u0107 warto\u015bci parametru bez dost\u0119pu do bazy. B\u0119d\u0119 jeszcze si\u0119 eksperymentowa\u0142 w wolnym czasie, ale prosz\u0119 o kontakt w wypadku podobnego oszukania Power BI!<\/p>\n<p>Dzi\u0119ki<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zdaj\u0119 sobie spraw\u0119, \u017ce taki temat mo\u017ce by\u0107 oczywisto\u015bci\u0105 dla wielu do\u015bwiadczonych in\u017cynier\u00f3w danych czy SQLowc\u00f3w, ale mnie mocno zaskoczy\u0142. Nasz architekt Pawe\u0142 Potasi\u0144ski zwr\u00f3ci\u0142 mi uwag\u0119 na tak\u0105 mo\u017cliwo\u015b\u0107. W kontrolowanym \u015brodowisku Power BI pozwala na wstrzykni\u0119cie kodu SQL poprzez parametr i robienie (prawie) wszystkiego na co ma si\u0119 ochot\u0119 &#8211; nawet usuni\u0119cie bazy danych! O SQL Injection mo\u017cna poczyta\u0107 <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL_injection\">tutaj<\/a> lub obejrze\u0107 ten <a href=\"https:\/\/www.youtube.com\/watch?v=ciNHn38EyRc\">filmik<\/a>. A o moich skryptach w M <a href=\"http:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/30\/uwierzytelnianie-przy-uzyciu-wielu-loginow-i-hasel-do-jednego-zrodla-danych\/\">tu<\/a> lub <a href=\"http:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/23\/zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi\/\">tu<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-307\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03.jpg\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03.jpg 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-300x157.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-768x402.jpg 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_04_database-injection_v03-1024x536.jpg 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<div class=\"tech_read_more\"><a href=\"https:\/\/cwiok.pl\/index.php\/pl\/2018\/06\/06\/atak-sql-injection-w-usludze-power-bi\/\">Read More<\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-317","post","type-post","status-publish","format-standard","hentry","category-powerbi-pl"],"_links":{"self":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/comments?post=317"}],"version-history":[{"count":0,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/317\/revisions"}],"wp:attachment":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/media?parent=317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/categories?post=317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/tags?post=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}