少し前に、南京郵電大学のネットワーク攻撃と防御プラットフォームについて質問しました。記事を書いた後、まだそれを要約する必要があります。問題はすべて Web 形式であり、すべて PHP を使用して作成されているため、SQL インジェクションや XSS などの従来の脆弱性を調査していない問題が多く、その多くは PHP 自体の構文に問題があります。 PHP が現在世界で最高の言語であることを考えると、PHP 自体の問題も Web セキュリティの側面として考慮される可能性があります。 PHP の特徴は、弱い型付けと、組み込み関数による受信パラメータの緩やかな処理です。この記事は主に、攻守のプラットフォームを構築する際に遭遇したPHP関数の問題点や、PHPの弱い型によって引き起こされる問題点を記録するものです。
PHPの弱い型の紹介
$param = 1; $param = array(); $param = "stringg";
型変換の問題
型変換は避けられない問題です。たとえば、GET または POST パラメータを int 型に変換する必要がある場合、または 2 つの変数が一致しない場合、PHP は変数を自動的に変換します。ただし、PHP は型指定が弱い言語であるため、型変換を実行するときに多くの予期せぬ問題が発生します。比較演算子
型変換
$a==$bの比較$a=null;$b=flase ; //true$a='';$b=null;//true
0=='0'//true0 == 'abcdefg'//true0 === 'abcdefg'//false1 == '1abcdef'//true
ハッシュ比較
上記の方法に加えて、ハッシュ比較を行う際にも問題があります。次のように:"0e132456789"=="0e7124511451155" //true"0e123456abc"=="0e1dddada"//false"0e1abc"=="0" //true
16進数変換
16進数の剰余文字列に対して比較演算を実行する場合にも問題があります。例は次のとおりです。"0x1e240"=="123456"//true "0x1e240"==123456//true "0x1e240"=="1e240"//false
型変換
一般的な変換は、主に int から string へ、string から int への変換です。 int から文字列へ:$var = 5;
方法 2: $item = strval($var);
var_dump(intval('2'))//2 var_dump(intval('3abcd'))//3 var_dump(intval('abcd'))//0
if(intval($a)>1000) { mysql_query("select * from news where id=".$a) }
組み込み関数のパラメータの緩さ
$array1[] = array( "foo" => "bar", "bar" => "foo", ); $array2 = array("foo", "bar", "hello", "world"); var_dump(md5($array1)==var_dump($array2));//true
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。
$i ="2abc"; switch ($i) { case 0: case 1: case 2: echo "i is less than 3 but not negative"; break; case 3: echo "i is 3"; }
在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true
可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。
array_search()与in_array()也是一样的问题。