私は以前、seay が書いた PHP コード監査の本を読み、すべてをざっと読んでみました。コード監査の初心者として、それを私のような初心者に紹介したいと思います。誰か私が学んだことと、全体的なフレームワークと一般的な脆弱性機能を提供してください。これは、この本の研究ノートと考えることができます。この本は、私のスムーズな思考に基づいて読むことができます。 : )
コード監査を学習する目標は、CMS のコード セキュリティ監視を独立して完了できるようになることです。一般的な考え方は次のとおりです。
(1) ローカルファイルインクルード:
( 2) リモート ファイル インクルード:
よりも出現頻度が低くなります。(3) ファイル インクルードの切り捨て:
検索キー関数:
file_get_contents()、highlight_file()、fopen( )、読み取り file() 、 fread() 、 fgetss() 、 fgets() 、 parse_ini_file() 、 show_source() 、 file() など
主要な関数を検索します:
move_uploaded_file() 次に、この関数を呼び出すコードがアップロード形式を制限するために存在するか、またはバイパスできるかを確認します。
(1) フィルタなしまたはローカルフィルタあり: サーバー側でフィルタなし、PHP 形式のファイルを直接アップロードして使用できます。
(2) ブラックリスト拡張子フィルタリング:
ファイル形式 .php は許可されませんが、ファイル名 1.php をアップロードできます ( (3) ファイル ヘッダーのコンテンツ タイプの検証バイパス:
getimagesize() 関数: ファイル ヘッダーが GIF89a である限り true を返すことを確認します。 。
拡張子を比較するには、in_array() またはトリプルイコール === を使用します。
unlink() はバックトラッキング変数を使用します
$action = delete は、ファイルが SQL でない場合、送信されたファイル名を削除します。
target.com/recovery.php?&action=delete&filename=../../index.php
b. コード実行の脆弱性
(1) preg_replace( ) 関数 :
mixed preg_replace (mixed $pattern ,mixed $replacement ,mixed $subject [, int $limit = -1 [, int &$count ]] )
When $pattern修飾子が存在する場合、$replacement は PHP コードとして実行されます。
最初のパラメータはコールバック関数、2 番目のパラメータはパラメータコールバック関数の
(3) eval() とassert():
assert のパラメータが指定された場合に PHP コードを実行できます。 () は文字列です
2. 動的関数の実行:
eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】
#!php<?php$_GET['a']($_GET['b']);?>
搜索关键函数: 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
需要思考的问题:
(1) in_array() : 比较之前会自动转换类型
(2) is_numeric() : 当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞
(3)双等于 == 和三等于 === :
(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);?>
COOKIE验证:没有使用SESSION验证,将信息直接保存在COOKIE中
审计代码时,查看登录处代码
(1) 钻GPC等转义的空子:
编码问题转换:
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)字符串问题:
字符串截断:
%00空字符截断:【PHP版本小于5.3】
#!php<?php include($_GET['file'].'.php'); //1.php?file=2.txt%00//2.txt里面是 <?php phpinfo()?>?>
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代码解析标签:
正規表現:
エラー挿入:
Windows findfirstfile 使用法: 12345.txt ファイルを検索するには、代わりに 1<& または 12< を使用します。 ;< (単独ではありません) 1 つは 1 つの文字のみを表し、2 つは複数の文字を表すため、「<」または「>」を 1 つ使用します。
私がセキュリティの道に足を踏み入れたのは、単に PHP が好きだったからです。コード監査の初心者、シーイ。この本は私にとってとても役に立ちました。私はこの記事を 2 日かけてまとめた初心者にとって役立つことを願っています (私はかわいい女の子です)。欠陥がある場合は、皆様のご指摘もお待ちしております。
監査について開発したり話したりする方法を知らない人は、ただのフーリガンです。 :)