2

「Acunetix Web Vulnerability Scanner」で自分のサイトをスキャンしたとき、とても驚きました。プログラムは、xss フィルタリングで get parameters を使用すると、ページに多くの xss 脆弱性を表示します。例えば:

URL encoded GET input state was set to " onmouseover=prompt(967567) bad="
The input is reflected inside a tag parameter between double quotes.

結果が空のときに404エラーが表示されないためだと思います(そうあるべきです)。「リクエストが空です」のようなメッセージを表示します

私のコントローラー:

$this->pagination->initialize($config); 
    $this->load->model('aircraft_model');

    $data['type'] = $this->input->get('type', TRUE);
    $data['year'] = $this->input->get('year', TRUE);
    $data['state'] = $this->input->get('state', TRUE);
        $type_param = array (
        'type'    => $this->input->get('type', TRUE),
        );

        $parameters = array(
        'year'    => $this->input->get('year', TRUE),
        'state_id'   => $this->input->get('state', TRUE),
        );
        foreach ($parameters as $key=>$val)
                {
                    if(!$parameters[$key])
                    {
                        unset($parameters[$key]);
                    }
                }

    $data['aircraft'] = $this->aircraft_model->get_aircraft($config['per_page'], $this->uri->segment(3, 1),$parameters, $type_param);
    $data['title'] = 'Самолеты | ';
    $data['error'] = '';
    if (empty($data['aircraft']))
    {
       $data['error'] = '<br /><div class="alert alert-info"><b>По таким критериям не найдено ниодного самолета</b></div>';
    }

    $name = 'aircraft';
    $this->template->index_view($data, $name);

グローバル xss フィルタリング プログラムをオンにしても、xss の脆弱性が見つかります。可能性のある xss のメッセージが間違っている可能性がありますか?

また、SQLインジェクションが1つあります。

Attack details:
Path Fragment input / was set to \
Error message found: 
You have an error in your SQL syntax

SQL エラー:

Error Number: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-10, 10' at line 3
SELECT * FROM (`db_cyclopedia`) LIMIT -10, 10

コントローラ:

$this->load->model('cyclopedia_model');
    $this->load->library('pagination');
    $config['use_page_numbers'] = TRUE;

    [pagination config]

    $config['suffix'] = '/?'.http_build_query(array('type' => $this->input->get('type', TRUE)), '', "&");

    $config['base_url'] = base_url().'cyclopedia/page/';
    $count_all = $this->cyclopedia_model->count_all($this->input->get('type', TRUE));
    if (!empty($count_all)){
    $config['total_rows'] = $count_all;    
    }
    else
    {
    $config['total_rows'] = $this->db->count_all('cyclopedia');
    }
    $config['per_page'] = 10;
    $config['first_url'] = base_url().'cyclopedia/page/1'.'/?'.http_build_query(array('type' => $this->input->get('type', TRUE)), '', "&");

    $this->pagination->initialize($config); 

        $parameters = array(
        'cyclopedia_cat_id' => $this->input->get('type', TRUE),
        );
        foreach ($parameters as $key=>$val)
                {
                    if(!$parameters[$key])
                    {
                        unset($parameters[$key]);
                    }
                }
    $data['type'] = $this->input->get('type', TRUE);   
    $data['cyclopedia'] = $this->cyclopedia_model->get_cyclopedia($config['per_page'], $this->uri->segment(3, 1),$parameters);
    $data['title'] = 'Энциклопедия | ';
    if (empty($data['cyclopedia']))
    {
        show_404();
    }

    $name = 'cyclopedia';
    $this->template->index_view($data, $name);

そして、HTTP パラメーター汚染 (パラメーターの取得) に関するいくつかの問題があります。

Attack details
URL encoded GET input state was set to &n954725=v953060
Parameter precedence: last occurrence
Affected link: /aircraft/grid/?type=&year=&state=&n954725=v953060
Affected parameter: type=

多くのコードで申し訳ありませんが、コードイグナイター/フレームワークと安全第一の私の最初の経験です。

更新: この site.com/1 codeigniter ショーのようなサイト URL の場合:

An Error Was Encountered
Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.

このメッセージの代わりに 404 を表示するにはどうすればよいですか?

4

1 に答える 1

2

これは、ユーザーからの入力を受け取ります。

$config['first_url'] = base_url().'cyclopedia/page/1'.'/?'.http_build_query(array('type' => $this->input->get('type', TRUE)), '', "&");

次に、Pagination.php ライブラリの次の行は、適切な HTML エスケープなしで出力ページに吐き出します。

$output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;

一般に、自動スキャン ツールは多くの誤検知を生成しますが、これは、クロスサイト スクリプティング攻撃の実際のリスクにつながる本物の HTML インジェクションの脆弱性です。

$first_url修正するには、HTML コンテキスト (例: )に挿入されるすべての出力を でラップしますhtmlspecialchars()。残念ながら、これはライブラリ コードであるため、独自のページネーションのフォークを開始する必要があります。他のライブラリを使用する方が良いかもしれません。

xss_clean確実に保護することはできないため、依存しないでください。入力レイヤーでの出力の問題に対処しようとしていますが、これは決して正しく機能しません。攻撃を逃したり、完全に有効な入力を壊したりします。全体の考え方は、XSS の問題が実際に何であるかについての基本的な初歩的な誤解を裏切っています。

ページネーションには同じ修正が必要な箇所が他にもありますが、CodeIgniter の非常に品質の悪いコードを読むのに必要以上の時間を費やしたくありません。

CodeIgniter がこの程度の人気を獲得した理由がわかりません。

于 2013-03-02T17:18:47.323 に答える