Autor | Zpráva | ||
---|---|---|---|
Martin Joneš Profil |
Mám tabulku a script pro zápis hodnot do MySQLi a pak script, který data z tabulky vytáhne. Pokud dám speciální charakter (jako je například iOS smajlik) přímo do zdrojáku, zobrazí se správně, takže v dokumentu chyba není. Když tyto charaktery vložím přes phpMyAdmin do databáze, pouze část charakterů se zobrazí. Zbytek se zobrazí, jako otazník. Pokud si dám do tabulky s příkazem POST stecialni charakter, zapíše se do databáze ale pak se nezobrazí jako jeden, ale jako 3 otazníky. Databázi a všechny tabulky mám nastaveny na utf8mb4_unicode_ci. Podle různosti výsledků hádám, že musím nějakým způsobem modifikovat script na zobrazení i pro zapsání hodnot z tabulky. Ví někdo jak? Děkuji.
|
||
Keeehi Profil |
#2 · Zasláno: 28. 12. 2016, 13:13:51
Voláš i něco takového?
$mysqli->set_charset('utf8'); |
||
Joker Profil |
#3 · Zasláno: 28. 12. 2016, 13:28:09
Martin Joneš:
Kódování databáze není až tak podstatné, důležité jsou tři věci: 1. V jakém kódování o sobě stránka říká, že je (hlavička Content-Type), 2. v jakém kódování je skutečně kód (tj. kódování PHP souboru) a 3. komunikační kódování s databází, které se nastavuje tím set_charset. Všechno by mělo být stejné. Pokud jsou špatně jen texty z databáze, jsou nejpravděpodobnější dvě možnosti: 1. Buď bylo špatně kódování na vstupu, tj. texty byly už vložené se špatným kódováním. To se pozná tak, že ty texty budou špatně i při pohledu přímo na data např. v phpMyAdmin. Je to ta horší možnost, protože to pak znamená, že se musí všechno znovu vložit (popř. všechno projít a opravit). 2. Nebo je špatně nastavené komunikační kódování s databází. (Při pohledu např. v phpMyAdmin jsou texty v databázi vidět správně.) To je lepší varianta, stačí nastavit správné kódování a mělo by to fungovat. |
||
Martin Joneš Profil |
Joker:
Dokument je v UTF8 i meta charset="UTF-8" v hlavičce mám. Bude jen špatně kódovaná komunikace s databází. Zrovna koumám kód.. snad na to přijdu. Keeehi, Joker: Ja už si vážně nevím rady.. Buď mi to ukáže nějaký O s pérem na klobouku, nebo otazníky.. xD Povedlo se mi zobrazit jen jednoho smajlíka ani nevím z kolika. xD Můžete se kouknout na živou ukázku mého ztroskotanectví zde na main page jsou smajlíci vložení do zdrojáku. Taky jsem zveřejnil kód na GitHub |
||
Martin Joneš Profil |
#5 · Zasláno: 28. 12. 2016, 15:17:18
Joker, Keeehi:
Cesta k souboru, který zveřejňuje příspěvky je /administrator/pages/new_article.php a soubor, který jej čte: /template/default/articles.php Kdyby jste chtěli, můžete se podívat na GitHub a třeba si s tím pohrát. Pomohlo by mi to, každopádně díky. |
||
Keeehi Profil |
Martin Joneš:
A [#2] jsi četl? Protože github v tom tvém kódu žádné nastavení kódování pro komunikaci s databází nenašel! Na konec config.php přidej mysqli_set_charset($db, "utf8"); |
||
Martin Joneš Profil |
Keeehi:
V HTML jsem od roku 2014, CSS zhruba rok a teprve se učím PHP, obcas tedy budu mít hloupé otázky. Smím se zeptat, jakou školu jsi/jste studoval? Popř nějaké knížky na PHP? Keeehi: Jojo, četl a zkoušel.. Nic jsem nevykoumal, takže jsem ten kód odstranil. Proto to na GitHubu nikde nebylo. Keeehi: Přidal jsem to tedy na konec config.php a mělo to takový efekt, že se mi nenačítá stránka /login a /articles. Při zobrazení zdroje v prohlížeči je vidět, že klientovi se dostalo v případě /login pouze prázdný dokument a v případě /articles polovina dokumentu. Parse error: syntax error, unexpected ''utf8'' (T_CONSTANT_ENCAPSED_STRING) in your code on line 7 upravil jsem na mysqli_set_charset($db,"utf8"); , což "funguje" (očividně to nemělo rádo mezeru) ale stejně to zobrazuje neznámý znaky - otazníky.
Tady je porovnání: Imgur |
||
Lonanek Profil |
Martin Joneš:
„upravil jsem na mysqli_set_charset($db,"utf8"); , což "funguje" (očividně to nemělo rádo mezeru)“
Očividně ta mezera to nebyla (můžete se přesvědčit sám). mysqli_set_charset($db, "utf8"); funguje korektně i třeba se dvěma mezerami mezi parametry. Spíše bych to tipoval na zapomenuté uvozovky nebo jinou syntaktickou chybu.
V souboru login.php máte BOM znaky, Proč je každá tabulka v databázi s jiným porovnáním? Problém s diakritikou nevidím žádný, smajlíky si musíte vyhodnotit převedením (pokud je chcete mít zobrazené jako obrázky). |
||
Martin Joneš Profil |
Lonanek:
Četl jsem si, co BOM znaky jsou, trochu nechápu, jestli je to problém. Jinak to ale funguje, takže by to problém snad být nemohl. Tabulky s obsahem, které potřebuji vypsat jsou v utf8mb4_unicode_ci ostatní tabulky nemají na tuto vliv. - nezáleží na tom, jaké mám porovnání v tabulce users, Když s tou to nijak nesouvisí, ne? Většinu času jsem na telefonu a ne počítači a textový editor na mobilu také nic moc, takže.. |
||
Lonanek Profil |
#10 · Zasláno: 28. 12. 2016, 18:34:02
BOM znaky umí i znefunkčnit php kód.
Můžete ještě nastavit interní kódování na mb_internal_encoding("UTF-8"); v souboru config.php
|
||
Martin Joneš Profil |
Lonanek:
Proč je nedát rovnou do index.php? Nebudou se tím náhodou všechny includovane soubory dekódovat pomocí UTF-8? |
||
Lonanek Profil |
#12 · Zasláno: 28. 12. 2016, 18:48:36
Soubor config.php načítáš v každém skriptu, index.php jen když jej zavoláš.
|
||
Martin Joneš Profil |
Lonanek:
Nene, index.php se načítá v každém případě. Přečti si .htaccess Soubor index.php na základě URL zavolá soubor, jemu hodny, ten nadále includne další scripty a soubory. Asi je to lamácky udělaný, ale mě to takhle vyhovuje. xD Případné BOM znaky jsem z login.php odstranil, děkuji za upozornění. |
||
Lonanek Profil |
#14 · Zasláno: 28. 12. 2016, 19:03:51
No z mého pohledu je to nastavení chování systému. Kde jinde by mělo být nastavení, když ne v konfiguračním souboru. Ale pokud to vyhovuje jinak a budeš se s tím v budoucnu dobře vyrovnávat, pak je to na tobě.
|
||
Martin Joneš Profil |
Lonanek:
V config.php mám jen databázi. Ta se volá v případě, že jsem přihlášený v administraci, že jsem na přihlašovací stránce, nebo na stránce article/s. Např. home.php, což je domovská stránka config.php nevolá. V každém případě jsem to do index.php přidal a heleme se, pořád to nezobrazuje data z databáze správně. Article "Emojis" je zapsaný v databázi správně, ale špatně vypsán. Ostatní jsou příkladem špatného zápisu přes požadavek POST illimis-project.tk/articles |
||
Keeehi Profil |
#16 · Zasláno: 28. 12. 2016, 19:26:13
Martin Joneš:
github.com/jondycz/Illimis-Project/blob/master/template/default/articles.php Přesto že pracuješ s multibytovým kódováním, nepoužíváš pro to určené funkce. Například místo strlen bys měl používat mb_strlen a další. Je možné, že tyto funkce ti rozbíjejí kódování. I když dle mých zkušeností, to nebývá až tak razantní, ale možné to je. Zkus v tom souboru zakomentovat na chvíli řádky 100-104 a vypisovat data tak, jak ti je dodala databáze. (Pokud jsi soubor lokálně měnil, tak si uprav podle toho čísla řádků.) „Ostatní jsou příkladem špatného zápisu přes požadavek POST illimis-project.tk/articles“ Ostatními se prozatím nemusíš zabývat. Důležité je teď umět správně vypsat správně uložená data. |
||
Martin Joneš Profil |
Keeehi:
Já právě znám jen minimum funkcí. Pak, když si čtu nějaký kód, přemýšlím, jestli slovo za $ je něco, co musím nejdřív definovat, nebo to už je definovaný v PHP jako nějaká funkce. EDIT: proč řádky 100-104? Nepotřebuju zakomentovat div. Ten na to vliv nemá. Nevím, jestli nemáme jiné zobrazování řádků, ale řádkem 100 mi v Notepad++ začíná <!-- Main Content..--> Zakomentovat jsem řádky s funkcí strlen 118-121 a nechal vypsat $query2[content] jak je. Bez efektu. Jen jsem si zrušil stránkování. Mužů přidat do GitHubu contributory, ti můžou editovat source code, pokud jsem to pochopil správně. |
||
Lonanek Profil |
#18 · Zasláno: 28. 12. 2016, 19:42:40
Keeehi:
Na stránce illimis-project.tk/article?emojis je přímý výpis obsahu databáze. Jak je vidět, nejsou znaky převedeny správně. Spodní text je vložen přímo do zdrojového kódu tak jak je v databázi. |
||
Martin Joneš Profil |
Lonanek:
Em.. celkem se bojím. Jak je možný, že se obsah stránky mění? Já nedával přístup do FTP ani do databáze. Sakra.. že ty jsi našel nějaký exploit? Chlapci.. takhle na mě nemůžete. Jde mi mráz po zádech. Vy jste až moc vzdělaní. Já jsem nenapsal obsah databáze do textu.. Jak je možný, že máš přístup do FTP? |
||
Keeehi Profil |
#20 · Zasláno: 28. 12. 2016, 19:53:42
Martin Joneš:
Nevím, co našel Lonanek, ale ano, máš tam bezpečnostní díru, kvůli které může kdokoli i bez přihlášení přidávat články. Stačí jen poslat správný požadavek. Celý exploit může vypadat takto: <iframe name="page" width=1200 height=800></iframe> <form target="page" action="http://illimis-project.tk/admin?new_article" method="post"> <input type="text" name="heading" value="Tos nečekal že?"> <input type="text" name="link" value="ojojoj"> <input type="text" name="article" value="Nemáš dobře zabezpečenou administraci."> <input type="submit" name="submit" value="zobraz"> </form> |
||
Martin Joneš Profil |
Lonanek:
Blázne.. hlavně mi tam nic nedělej.. jak jsi to krucinál udělal? Ode dneska jsi pro me buh. Keeehi: Dobře, ten exploit teď chápu. Ale jak se mu povedlo editovat zdroják? Jemu se povedlo editovat clanek, ktery je napsany ve zdroji dokumentu, který není načítaný z databáze. |
||
Keeehi Profil |
#22 · Zasláno: 28. 12. 2016, 19:58:07
Problém, který jsem našel já je v souboru github.com/jondycz/Illimis-Project/blob/d21194b5fa22e370cefd3d8459419a1522a2ff4a/check.php. Za funkcí header na řádku 14 musí následovat volání
exit(); . Protože funkce header sice odešle prohlížeči hlavičku o přesměrování, běh scriptu ale neukončuje! Proto se script provede (vloží se článek) a pak se "provede" přesměrování.
|
||
Martin Joneš Profil |
Tak jako.. pohoda.. já přijdu řešit jeden problém, kterej ani nedořeším a už začnu řešit exploity v zabezpečení.. xD Vy jste fakt bohové.. Nechcete si přivydělat a jít ucit na Mosteckou průmku? Potřebují víc učitelů, co umí víc, než studenti..
Takže počkat.. Keeehi dokázal pomocí iframu změnit obsah stránky, zatímco Lonanek se přímo dostal do Administrace a hezký na pána si přes můj dokonalý textový editor přidal článek? Další věc: kdybych nezveřejnil zdroják na GitHubu, asi by pro vás nebylo tak jednoduché najít exploity a mít možnost dělat bordel, že? |
||
Lonanek Profil |
Martin Joneš:
„Em.. celkem se bojím. Jak je možný, že se obsah stránky mění?“ Není se čeho bát, jen jsi na "správném" hostingu. Není to přes žádnou bezpečnostní chybu, nejsem ani hacker ani škodolíbek. Problém je v kódování uložených (ukládaných) dat. Veškeré nastavení komunikace je správné => UTF-8. |
||
Martin Joneš Profil |
Lonanek:
Takže ty jsi taky na endoře a diky PHP (které vidí hlouběji, než Document root) máš přístup k mým souborům? Chápu to správně? Navíc mám zakázané POST požadavky že zahraničí, takže by to mělo jít jen chytrým lidem z ČR Keeehi: Voláním exit se ten exploit, který jsi našel ty řeší? |
||
Keeehi Profil |
Martin Joneš:
„Ale jak se mu povedlo editovat zdroják?“ To nevím, nejsem on. Buď uhodnul tvoje heslo, nebo se tam dostal jinak. Pokud neopravíš tu chybu co jsem popsal v [#22], tak věřím, že bych ti dokázal demonstrovat, že tam máš i nezabezpečený upload souborů => měl bych být schpen tam nahrát jakýkoli soubor. Když tam nahraji php script, můžu si už pak prakticky dělat co chci. Pomocí toho scriptu pak klidně mohu měnit zdrojové kódy jiných scriptů atd. :) Ode mě se nemusíš bát žádných devastujících útoků (ono je to totiž nelegální) spíš chybu najdu, ověřím a jak sám vidíš, ještě ti napíšu řešení, jak ji opravit. „Voláním exit se ten exploit, který jsi našel ty řeší?“ Ano. Exit ihned ukončí běh scriptu, a tak se už nevykonají ty následující příkazy pro přidání řádku do databáze. To co dělá Lonanek to samozřejmě neřeší. |
||
Martin Joneš Profil |
Keeehi:
Bozinku.. děkuju moc. Za co všechno mám tedy dávat exit();? Jen za funkci header? Tu chybu jsem už opravil. Nečekal bych, že ale taková blbost, jako 5 znaků dokáží odstranit, nebo vytvořit díru v zabezpečení. Jste fakt machři |
||
Lonanek Profil |
#28 · Zasláno: 28. 12. 2016, 20:18:51
Martin Joneš:
„Takže ty jsi taky na endoře“ Mám tam trošku jiná práva. Keeehi: „To co dělá Lonanek to samozřejmě neřeší.“ To není bezpečnostní chybou. Jak jsem naznačil výše. |
||
Keeehi Profil |
#29 · Zasláno: 28. 12. 2016, 20:20:27
Martin Joneš:
„Za co všechno mám tedy dávat exit();?“ Logicky přece tam, kam patří. Co jsi chtěl v té části udělat? Přesměrovat a ukončit provádění scriptu. Funkce header neukončuje provádění scriptu, proto to musíš udělat příkazem exit(); Když už jsem u toho, tak ti popíšu kde je probém u github.com/jondycz/Illimis-Project/blob/d21194b5fa22e370cefd3d8459419a1522a2ff4a/administrator/pages/tplinstaller.php 1) řádek 21 - mimetype je informace, kterou posílá prohlížeč. Já jako útočník mohu tedy klidně poslat php soubor a k tomu přidat informaci, že to je zip soubor. V důsledku je tedy hodnota v $_FILES["zip_file"]["type"] úplně zbytečná. Jelikož ji může kdokoli jakkoli měnit, nedá se k ničemu rozumnému použít.
2) řádek 27 - tady je to úplně triviální svůj soubor pojmenuji exploit.zip.php. Přes tvojí podmínku to projde, jelikož "zip" je za první tečkou. Ovšem pořád to je PHP soubor končící .php, takže ho server klidně spustí. |
||
Martin Joneš Profil |
Lonanek:
Takže jsi něco jako moderátor? Zaměstnanec endory? Víš co.. děláš moji vysněnou práci.. závidím ti. Keeehi: Bylo by jedno, jestli to je nebo není zip. Když uploadneš zip, v kterým je index.php, tak ho muzes spustit pres /template/index.php. uploadnutý zip se hned extrahuje. Tvůj soubor .php by to extrahovat nemohlo, což by způsobilo chybu a soubor smazalo. K této uploadovaci funkci ale přístup nemáš, že ne? Jediné zabezpečení, které jsem udělal bylo odmítnutí všech .Php souboru ve složce /administrator/ - hází chybu 403 Forbidden Lonanek: „Problém je v kódování uložených (ukládaných) dat.“ Uložených, ukládaných kde? Na SQL mám vše správně a kódování dokumentů také. Ručně vložena hodnota do SQL se také vypisuje špatně. Jak tedy může být kódování komunikace správné? Pak nezbývá možnost, čím by se to dalo řešit. |
||
Téma pokračuje na další straně.
|
0