« 1 2 »
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
Voláš i něco takového?
$mysqli->set_charset('utf8');
Joker
Profil
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
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
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
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
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
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
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
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
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
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
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.
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: