Clicky

Skocz do zawartości


Zdjęcie
- - - - -

QB vs SQL Injection

10 odpowiedzi w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 ZuyPan

ZuyPan

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 171 postów

Napisano 01 sierpień 2013 - 18:24

Witam
Pierwszy raz zdarza mi się coś takiego, ale użytkownicy strony którą ostatnio zrobiłem zacięcie twierdzą, że jest w niej dziura na jednej z podstron. Wstyd powiedzieć, ale ja jakoś tak nie potrafię sam przeprowadzić tego typu ataku by sprawdzić, po prostu nigdy mi nie wychodzi co daje dwie opcje:
- strona jest zabezpieczona i nie działa,
- to ja nie umiem go przeprowadzić
Chodzi o paginację:
Kontroler:
    public function action_ranking()
    {
        $model = Model::factory('Frontend_Characters');
        $pagination = Pagination::factory(array(
            'current_page'      => array('source' => 'route', 'key' => 'page'),
            'total_items'      => $model->count_characters(),
            'items_per_page'    => 100,
            'view'              => 'layouts/'.Layout::get_layout().'/pagination/twitterbootstrap',
            'auto_hide'        => TRUE,
            'first_page_in_url' => FALSE,
        ));
        $characters = $model->get_few($pagination->offset, $pagination->items_per_page);
        $this->_subpage = Layout::factory('frontend/character/ranking')->set('characters', $characters)->set('pagination', $pagination->render())->set('offset', $pagination->offset);
    }// End action_ranking.


Model:
public function get_few($offset, $limit)
    {
        return DB::select(array('player.id', 'player_id'), array('player.name', 'player_name'), array('player.job', 'player_job'), array('player.skill_group', 'player_skill_group'), array('player.level', 'player_level'), array('player.exp', 'player_exp'), array('player.playtime', 'player_playtime'), array('player_index.empire', 'player_index_empire'))
                ->from('player')
                ->join('player_index')->on('pid1', '=', DB::expr('`player`.`id` OR `pid2` = `player`.`id` OR `pid3` = `player`.`id` OR `pid4` = `player`.`id`'))
                ->join('astium_common.gmlist', 'left')->on('player.name', '=', 'gmlist.mName')
                ->where('gmlist.mName', 'IS', NULL)
                ->order_by('level', 'DESC')->order_by('exp', 'DESC')
                ->offset(':offset')
                ->limit(':limit')
                ->parameters(array(
                    ':offset'  => $offset,
                    ':limit'    => $limit,
                ))
                ->execute('player')
                ->as_array();
    }// End get_few.


Jakoś nie chcę mi się wierzyć, że gdzieś tu jest dziura. Przecież QB układa zapytanie z klocków i czyści wszystkie zewnętrzne dane. Jedynym czynnikiem zewnętrznym jest tu numer strony z routingu, ale podaje go jako parametr więc powinno być ok.

#2 Daredzik

Daredzik

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 308 postów
  • Skąd:Pszczyna

Napisano 01 sierpień 2013 - 18:57

link ?

#3 thejw23

thejw23

    Senior Mastah

  • Webmastahy
  • PipPipPip
  • 824 postów

Napisano 01 sierpień 2013 - 20:58

Dopytaj się co znaczy "jest w niej dziura", jakie są tego objawy, skąd o tym wiedzą.
Numer strony z routingu możesz potraktować intval(), tak dla pewności.

#4 ZuyPan

ZuyPan

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 171 postów

Napisano 02 sierpień 2013 - 00:23

http://astium.pl/character/ranking (tak wiem, wygląda tragicznie)

@thejw23 To nie jest społeczność która tak po prostu powie gdzie jest bug i jak go używać :) To strona gry mmo gdzie jeśli ktoś znajdzie dziurę to wykorzysta ją dla siebie. Ja dostałem tylko zgłoszenie w stylu "haha ty $!@#$!$ masz dziurę w stronie w rankingu $%@$%" i to od kilku osób. No cóż bądź co bądź dało mi to do myślenia...

#5 thejw23

thejw23

    Senior Mastah

  • Webmastahy
  • PipPipPip
  • 824 postów

Napisano 02 sierpień 2013 - 00:27

Masz jeszcze drugi ranking, po prawej stronie. Może dziura jest przy show/ID

Możesz pobawić się aplikacjami typu WebCruiser.

#6 ZuyPan

ZuyPan

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 171 postów

Napisano 02 sierpień 2013 - 00:35

    public function get_informations($id)
    {
        $informations = DB::select(array('player.id', 'player_id'), array('player.name', 'player_name'), array('player.account_id', 'player_account_id'), 'job', array('player.level', 'player_level'), 'skill_group', array('guild.id', 'guild_id'), array('guild.name', 'guild_name'), 'guild.master', 'alignment', 'empire')
                ->from('player')
                ->join('player_index')->on('pid1', '=', DB::expr('`player`.`id` OR `pid2` = `player`.`id` OR `pid3` = `player`.`id` OR `pid4` = `player`.`id`'))
                ->join('guild_member', 'LEFT OUTER')->on('player.id', '=', 'guild_member.pid')
                ->join('guild', 'LEFT OUTER')->on('guild_member.guild_id', '=', 'guild.id')
                ->where('player.id', '=', ':id')
                ->param(':id', HTML::chars($id))
                ->execute('player')
                ->current();
        $informations['marriage'] = DB::select()
                ->from('marriage')
                ->where('pid1', '=', ':id')
                ->or_where('pid2', '=', ':id')
                ->and_where('is_married', '=', '1')
                ->param(':id', HTML::chars($id))
                ->execute('player')
                ->current();
        $informations['stats'] = DB::select('szState', 'lValue')
                ->from('quest')
                ->where('quest.dwPID', '=', ':id')
                ->and_where('quest.szName', '=', 'achievement')
                ->or_where('quest.szName', '=', 'stats')
                ->and_where('quest.szState', 'IN', array('mob_kill','total_kill','pc_kill','pc_kill_peace','pc_kill_enemy','boss_kill','metin_destroy','meters','meters_mount'))
                ->param(':id', HTML::chars($id))
                ->execute('player')
                ->as_array('szState');
        $informations['achievements'] = DB::select()
                ->from('quest')
                ->where('dwPID', '=', ':id')
                ->and_where('szName', '=', 'achievement')
                ->param(':id', HTML::chars($id))
                ->execute('player')
                ->as_array('szState');
        return $informations;
    }// End get_informations.


Tu nawet jest HTML::chars więc ni cholery dziury nie widzę. Ech, może to false alarm tak z nienawiści :D

#7 Daredzik

Daredzik

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 308 postów
  • Skąd:Pszczyna

Napisano 02 sierpień 2013 - 00:47

może logi kohany bądź ngnixa bo wiem, że to on jest odpalony ;)

#8 Zepco

Zepco

    Senior Mastah

  • Moderator
  • 1583 postów
  • Skąd:Kielce

Napisano 02 sierpień 2013 - 14:34

Daredzik ma rację, możesz zobaczyć po logach co ludzie dodają do ścieżki żeby podmienić id.
Ja takie rzeczy wycinam już na starcie w routingu, gdzie parametr <page> musi być liczbą i koniec. To samo można zrobić rzutując typ czy użyć intval() jak radził @thejw23.

OŚWIADCZENIE: Ja, niżej podpisany, świadomy wszystkich konsekwencji tego posta postanawiam go dopuścić do użytku publicznego, albowiem bo gdyż aczkolwiek uważam, że nie wyrządzi on (znaczy: post) krzywdy nikomu innemu niźli mnie samemu (czyli autorowi posta).
-- Zepco --


#9 ZuyPan

ZuyPan

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 171 postów

Napisano 02 sierpień 2013 - 15:29

Dobra po logach patrząc to tylko gadanie.
Pojawił się inny problem (pozwolę sobie dopisać tutaj ponieważ jest to w obrębie tej samej aplikacji)
2013-08-02 10:17:39 --- EMERGENCY: ErrorException [ 2 ]: require(): Unable to allocate memory for pool. ~ SYSPATH/classes/Kohana/Core.php [ 511 ] in /var/www/astium.pl/system/classes/Kohana/Core.php:511
2013-08-02 10:17:39 --- DEBUG: #0 /var/www/astium.pl/system/classes/Kohana/Core.php(511): Kohana_Core::error_handler(2, 'require(): Unab...', '/var/www/astium...', 511, Array)
#1 /var/www/astium.pl/system/classes/Kohana/Core.php(511): Kohana_Core::auto_load()
#2 [internal function]: Kohana_Core::auto_load('Kohana_Route')
#3 /var/www/astium.pl/system/classes/Route.php(3): spl_autoload_call('Kohana_Route')
#4 /var/www/astium.pl/system/classes/Kohana/Core.php(511): require('/var/www/astium...')
#5 [internal function]: Kohana_Core::auto_load('Route')
#6 /var/www/astium.pl/application/bootstrap.php(134): spl_autoload_call('Route')
#7 /var/www/astium.pl/index.php(102): require('/var/www/astium...')
#8 {main} in /var/www/astium.pl/system/classes/Kohana/Core.php:511

Google milczy. Tego błędu to ja już ni cholery nie rozumiem. Coś z pamięcią? Możliwe by ktoś jakoś coś zhakierował?

#10 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 02 sierpień 2013 - 15:55

MMO = dzieci
dzieci = farmazony

#11 Maciek

Maciek

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 780 postów

Napisano 02 sierpień 2013 - 15:57

Google milczy.

Może Ci bana dali? ;)

Wyszukane na szybko (fraza "ErrorException [ 2 ]: require(): Unable to allocate memory for pool") sugeruje, że może to mieć związek z Alternative PHP Cache (APC).




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych