コード監査の概要

WBOY
リリース: 2016-06-20 12:37:24
オリジナル
1101 人が閲覧しました

0x00 はじめに

私は以前、seay が書いた PHP コード監査の本を読み、すべてをざっと読んでみました。コード監査の初心者として、それを私のような初心者に紹介したいと思います。誰か私が学んだことと、全体的なフレームワークと一般的な脆弱性機能を提供してください。これは、この本の研究ノートと考えることができます。この本は、私のスムーズな思考に基づいて読むことができます。 : )

0x01 全体

コード監査を学習する目標は、CMS のコード セキュリティ監視を独立して完了できるようになることです。一般的な考え方は次のとおりです。

  • インクルード フォルダー内の common_fun.php などの関数コード、または同様のキーワードを持つファイルから始めて、全文コードを読み取ります。
  • 設定ファイル、config キーワードを含むファイルを確認し、mysql.class.php ファイルの connect() 関数を見つけて、データベースへの接続時に脆弱性があるかどうかを確認します。
  • ホームページ ファイル、index.php を読み続けて、プログラムの動作時にどの関数やファイルが呼び出されるかを理解します。index.php ファイルをマーキング ラインとして使用し、含まれているファイルをレイヤーごとに展開して読み取ります。機能を理解するには、その機能フォルダのホームページ ファイルを参照してください。

0x02 さまざまな脆弱性

a. ファイル操作の脆弱性

  • ファイル名パラメータが必要ない場合は、実行しないようにしてください。ユーザーが制御します
  • 並列ユーザーの権限 管理者の権限と操作権限
  • これに類似したパラメータを渡すことは禁止されています..、/、受信パラメータの確認、制限の作成、および停止プログラムの実行

1. ファイルインクルードの脆弱性:

(1) ローカルファイルインクルード:

  • 通常、モジュールのロード、テンプレートのロード、キャッシュに存在します。
  • の呼び出し インクルード関数: include()/include_once()、require()/require_once() 制御可能な変数の検索

( 2) リモート ファイル インクルード:

  • 前提条件:allow_url_include = on
  • は、ローカル インクルード

よりも出現頻度が低くなります。(3) ファイル インクルードの切り捨て:

  • %00 truncation (PHP バージョン 5.3 未満)
  • 疑問符の切り捨て (疑問符はリクエストパラメータの疑似切り捨てに相当します)
  • English (. ) バックスラッシュ (/) 切り捨て

2. ファイル読み取り (ダウンロード) の脆弱性:

検索キー関数:

file_get_contents()、highlight_file()、fopen( )、読み取り file() 、 fread() 、 fgetss() 、 fgets() 、 parse_ini_file() 、 show_source() 、 file() など

3. ファイル アップロードの脆弱性:

主要な関数を検索します:

move_uploaded_file() 次に、この関数を呼び出すコードがアップロード形式を制限するために存在するか、またはバイパスできるかを確認します。

(1) フィルタなしまたはローカルフィルタあり: サーバー側でフィルタなし、PHP 形式のファイルを直接アップロードして使用できます。

(2) ブラックリスト拡張子フィルタリング:

  • この制限は十分に包括的ではありません。IIS は、デフォルトで .asp、.cdx、.asa、.cer などの解析をサポートします。
  • 拡張子はバイパスできます:

ファイル形式 .php は許可されませんが、ファイル名 1.php をアップロードできます ( (3) ファイル ヘッダーのコンテンツ タイプの検証バイパス:

getimagesize() 関数: ファイル ヘッダーが GIF89a である限り true を返すことを確認します。 。
  • $_FILES["file"]["type"] の値を制限することは、content-type を制御可能な変数に人為的に制限することです。
  • (4) 予防策:

拡張子を比較するには、in_array() またはトリプルイコール === を使用します。
  • アップロードされたファイルの保存は名前変更であり、ルールはタイムスタンプを使用して乱数を連結します: md5(time() + rand(1,1000))。
  • 4. ファイル削除の脆弱性:

検索キー関数:

unlink() はバックトラッキング変数を使用します
  • 古いバージョンの Session_destroy( ) の下にあるファイルを削除できる機能があり、基本的には修復されました。
  • Metinfo の任意のファイル削除の脆弱性:

$action = delete は、ファイルが SQL でない場合、送信されたファイル名を削除します。

target.com/recovery.php?&action=delete&filename=../../index.php

b. コード実行の脆弱性

1. コード実行関数:

検索キー関数: eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()

(1) preg_replace( ) 関数 :

mixed preg_replace (mixed $pattern ,mixed $replacement ,mixed $subject [, int $limit = -1 [, int &$count ]] )

When $pattern修飾子が存在する場合、$replacement は PHP コードとして実行されます。

(2)mixed call_user_func( callable $callbank [ ,mixed $parameter [ ,mixed $...) :

最初のパラメータはコールバック関数、2 番目のパラメータはパラメータコールバック関数の

(3) eval() とassert():

assert のパラメータが指定された場合に PHP コードを実行できます。 () は文字列です

[区別]:

2. 動的関数の実行:
eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】
ログイン後にコピー

動的関数バックドア:

#!php<?php$_GET['a']($_GET['b']);?>
ログイン後にコピー

3.命令执行函数:

搜索关键函数: system() , exec() , shell_exec() , passthru() , pcntl_exec() , popen() , proc_open()

(1) popen 和 proc_open() :

#!php<?php popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' ); ?>
ログイン後にコピー

所在路径就会出现一个1.txt 里面的内容为命令执行后的结果

(2) 反引号命令执行:

  • echo whoami ; 直接就可以执行命令

  • 双引号和单引号的区别:

    #!php$a = 1echo " $a "    output:1echo ' $a '    output:$a
    ログイン後にコピー

双引号时,可以直接解析变量,造成代码执行漏洞,过狗绕过。

c.变量覆盖漏洞

1.函数使用不当:

  • int extract( array &$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )
  • void parse_str( string $str , array &$arr )
  • bool import_request_variables( string $type , string $prefix )

2.$$变量覆盖:

d.逻辑漏洞

需要思考的问题:

  • 程序是否可以重复安装
  • 修改密码是否存在越权修改其他用户密码
  • 找回密码验证码是否可以暴力破解
  • cookie是否可以预测 验证存在绕过

1.等于与存在判断绕过:

(1) in_array() : 比较之前会自动转换类型

(2) is_numeric() : 当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞

(3)双等于 == 和三等于 === :

  • 双等于会在变量比较时,进行类转换,与 in_array() 是一样的问题。
  • 三等于是 typevalue 的双重比较,相比之下更加安全。

2.账户体系中的越权问题:

  • 水平越权: A用户能够以B用户的身份,进行B用户的全部权限操作。前提A用户和B用户拥有相同的权限。
  • 垂直越权: A用户能够以C用户的身份,进行C用户的全部权限操作,前提C用户比A用户拥有更高的权限。

(1) 未 exit / return / die :

#!php<?phpif(file_exists('install.lock)){    header("Location:xxx.com");    //exit();}echo "test";?>
ログイン後にコピー

test 依旧会被输出,替换成安装流程,PHP依旧会进行。

(2) 支付漏洞:

  • 客户端修改单价
  • 客户端修改总价和购买数量
  • 服务端未校验严格
  • 重复发包利用时间差:

    #!php<?phpif (check_money($price)){  //Do something  //花费几秒  $money = $money - $price;}?>
    ログイン後にコピー

可能导致漏洞函数: str_replace()

#!php<?php$a = addslashes($_GET['a']);$b = addslashes($_GET['b']);echo "$a<br>$b<br>";$c = str_replace($a,'',$b);echo trim($c);?>
ログイン後にコピー

e.会话认证漏洞

  • COOKIE验证:没有使用SESSION验证,将信息直接保存在COOKIE中

    1. 找到传入sql语句的参数的传递过程 回溯变量到最原始的函数 看它保存在cookie的算法 是否可逆
    2. 和MD5比起 sha1更安全 解密sha1的网站更少
    3. 限制一个用户只能同时在一个IP上登录
  • 审计代码时,查看登录处代码

f.二次漏洞

1.类型:

  • 不是逻辑问题,是可信问题。
  • 业务逻辑复杂度,与二次漏洞触发率 成正比。
  • 购物车 / 订单 / 引用数据 / 文章编辑 / 草稿 ==> SQL注入 / XSS

2.技巧:

(1) 钻GPC等转义的空子:

  • 不受GPC保护的 $_SERVER 变量: PHP5以后,$_SERVER取到的header不再受GPC影响,就算开启特殊字符也不会被转义,存在注入
  • 编码问题转换:

    1. GBK的宽字节注入: %df ' 单引号自动被转义成(%5c),同时 %df 与 %5c 连在一起组合成 運 字单引号依然在,成功闭合。【php与mysql交互过程中发生的编码转换问题】
    2. mb_convert_encoding() :

      #!php<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <?php$sql = "WHERE id='".urldecode("-1%df%5c' == ")."'"; print_r(mb_convert_encoding($sql,"UTF-8","GBK"));?>
      ログイン後にコピー

(2)字符串问题:

  • 利用报错,找到敏感信息
  • 字符串截断:

    1. %00空字符截断:【PHP版本小于5.3】

      #!php<?php                                 include($_GET['file'].'.php');      //1.php?file=2.txt%00//2.txt里面是 <?php phpinfo()?>?>
      ログイン後にコピー
    2. iconv函数字符编码转换截断:【对PHP版本有要求】

      #!phpchr(128)—chr(255)可以截断字符<?php $a = '1'.chr(130).'2’; echo $a."<br>";                   //1�2echo iconv("UTF-8", "GBK", $a);   //1?>
      ログイン後にコピー
  • php:// 输入输出流:

    #!php<?php    include($_GET[‘file']);?>1.php?file=php://filter/convert.base64-encode(内容被base64编码)/resource=example.txt(远程文件)
    ログイン後にコピー
  • php代码解析标签:

    1. : バージョン php3.0.4 以降で利用可能
    2. <%…%>: asp タグ、asp_tags=on が必要です、デフォルトはオフです
  • 正規表現:

    1. いいえ ^ と $ は一致の開始位置を制限するために使用されます:
    2. 特殊文字はエスケープされません:
  • エラー挿入:

  • Windows findfirstfile 使用法: 12345.txt ファイルを検索するには、代わりに 1<& または 12< を使用します。 ;< (単独ではありません) 1 つは 1 つの文字のみを表し、2 つは複数の文字を表すため、「<」または「>」を 1 つ使用します。

  • 0x03 End

    私がセキュリティの道に足を踏み入れたのは、単に PHP が好きだったからです。コード監査の初心者、シーイ。この本は私にとってとても役に立ちました。私はこの記事を 2 日かけてまとめた初心者にとって役立つことを願っています (私はかわいい女の子です)。欠陥がある場合は、皆様のご指摘もお待ちしております。

    監査について開発したり話したりする方法を知らない人は、ただのフーリガンです。 :)

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート