ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
PHP 関数のいくつかの抜け穴のコレクションを共有する
この記事は主に、PHP 関数のいくつかの抜け穴のコレクションを共有するものであり、皆様のお役に立てれば幸いです。
1. 弱い型の比較

2. MD5比較の脆弱性
PHPがハッシュ値を実行するために「!=」または「==」を使用する場合、 「0x」で始まる各ハッシュ値を科学的表記法の 0 の累乗 (0) として解釈するため、2 つの異なるパスワードがハッシュ化される場合、それらのハッシュ値は両方とも「0e」で始まる場合、php はそれらが「0e」であると認識します。同じ。一般的なペイロードには
0x01 md5(str) QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a 0x02 sha1(str) sha1('aaroZmOk') sha1('aaK1STfY') sha1('aaO8zKZF') sha1('aa3OFF9m')
if(@md5($_GET['a']) == @md5($_GET['b'])) { echo "yes"; } //http://127.0.0.1/1.php?a[]=1&b[]=2
3.ereg 関数の脆弱性: 00 truncationereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
ログイン後にコピー
文字列比較解析を回避できます。 $_GET[ 'password'] が配列の場合、戻り値は NULL になります ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
123 || asd || 123%00&&&** の場合、戻り値は true になります
4. $key とは何ですか?
プログラムは変数自体のキーを変数として抽出し、それを処理のために関数に渡すことができることを忘れないでください。 <?php
print_r(@$_GET);
foreach ($_GET AS $key => $value)
{ print $key."\n";
}?>
ログイン後にコピー
<?php print_r(@$_GET); foreach ($_GET AS $key => $value) { print $key."\n"; }?>
5. 変数のカバレッジ
関係する主な関数は、extract 関数です。例を見てみましょう。プロセス ページは非常に単純です。
同時に! PHP の機能 $ を使用すると、変数名を割り当てることができ、変数を上書きすることもできます。
<?php $auth = '0'; // 这里可以覆盖$auth的变量值 print_r($_GET); echo "</br>"; extract($_GET); if($auth == 1){ echo "private!"; } else{ echo "public!"; } ?>
http://127.0.0.1:8080/test.php?a=12
を構築します。 
6.strcmp
<?php $a='hi'; foreach($_GET as $key => $value) { echo $key."</br>".$value; $$key = $value; } print "</br>".$a;?>
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。 先将两个参数先转换成string类型。 当比较数组和字符串的时候,返回是0。 如果参数不是string类型,直接return
http://127.0.0.1:8080/test.php?a=12
即可达到目的。6.strcmp
<?php $password=$_GET['password']; if (strcmp('xd',$password)) { echo 'NO!'; } else{ echo 'YES!'; }?>
<?phpecho is_numeric(233333); # 1echo is_numeric('233333'); # 1echo is_numeric(0x233333); # 1echo is_numeric('0x233333'); # 1echo is_numeric('233333abc'); # 0?>
构造http://127.0.0.1:8080/test.php?password[]=
Constructionhttp://127.0.0.1:8080/test.php?password[]=
7.is_numeric
言うまでもなく:
<?php$ip = 'asd 1.1.1.1 abcd'; // 可以绕过if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) { die('error'); } else { echo('key...'); }?>
8.preg_match
正規表現マッチングを実行する際に文字列(^と$)の先頭と末尾に制限がない場合、バイパスの問題が発生する可能性があります
<?php $var='init'; print $var."</br>"; parse_str($_SERVER['QUERY_STRING']); echo $_SERVER['QUERY_STRING']."</br>"; print $var;?>
9.parse_str
parse_str() と同様の関数は mb_parse_str() です。parse_str は文字列を複数の変数に解析します。パラメータ str が URL によって渡されたクエリ文字列である場合、それは変数に解析され、現在のスコープに設定されます。
変数の上書きの一種
<?php
echo 0 == 'a' ;// a 转换为数字为 0 重点注意
// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
// 十六进制与整数,被转换为同一进制比较
'0xccccccccc' == '54975581388' ; // 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0
1 == '1'; 1 == '01'; 10 == '1e1'; '100' == '1e2' ;
// 十六进制数与带空格十六进制数,被转换为十六进制整数
'0xABCdef' == ' 0xABCdef'; echo '0010e2' == '1e3'; // 0e 开头会被当成数字,又是等于 0*10^xxx=0
// 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过
'0e509367213418206700842008763514' == '0e481036490867661113260034900752'; '0e481036490867661113260034900752' == '0' ;
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));?>
ログイン後にコピー11.unset
<?php echo 0 == 'a' ;// a 转换为数字为 0 重点注意 // 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc // 十六进制与整数,被转换为同一进制比较 '0xccccccccc' == '54975581388' ; // 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0 1 == '1'; 1 == '01'; 10 == '1e1'; '100' == '1e2' ; // 十六进制数与带空格十六进制数,被转换为十六进制整数 '0xABCdef' == ' 0xABCdef'; echo '0010e2' == '1e3'; // 0e 开头会被当成数字,又是等于 0*10^xxx=0 // 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过 '0e509367213418206700842008763514' == '0e481036490867661113260034900752'; '0e481036490867661113260034900752' == '0' ; var_dump(md5('240610708') == md5('QNKCDZO')); var_dump(md5('aabg7XSs') == md5('aabC9RqS')); var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));?>
unset(bar); リクエストパラメータに変数barが含まれている場合、それを破棄します。プログラム ロジックをバイパスするには、いくつかの変数を破棄します。 <?php $_CONFIG['extraSecure'] = true;foreach(array('_GET','_POST') as $method) { foreach($$method as $key=>$value) { // $key == _CONFIG
// $$key == $_CONFIG
// 这个函数会把 $_CONFIG 变量销毁
unset($$key);
}
}if ($_CONFIG['extraSecure'] == false) { echo 'flag {****}';
}?>
ログイン後にコピー
<?php $_CONFIG['extraSecure'] = true;foreach(array('_GET','_POST') as $method) { foreach($$method as $key=>$value) { // $key == _CONFIG // $$key == $_CONFIG // 这个函数会把 $_CONFIG 变量销毁 unset($$key); } }if ($_CONFIG['extraSecure'] == false) { echo 'flag {****}'; }?>
12.intval()
intから文字列へ: $var = 5;
方式1:$item = (string)$var;
方式2:$item = strval($var);
ログイン後にコピー
文字列からintへ: intval()関数。 $var = 5; 方式1:$item = (string)$var; 方式2:$item = strval($var);
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0 可以使用字符串-0转换,来自于wechall的方法
ちなみに intval は %00 で切り捨てることができます
if($req['number']!=strval(intval($req['number']))){ $info = "number must be equal to it's integer!! "; }
$req['number']=0%00 とすれば可能ですbypassed
13.switch()
switchが数値型の場合判定の場合、switchはパラメータをint型に変換し、効果はintval関数と同等になります。次のように: <?php
$i ="abc";
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 $i ="abc"; switch ($i) { case 0: case 1: case 2: echo "i is less than 3 but not negative"; break; case 3: echo "i is 3"; } ?>
14.in_array()
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true
ログイン後にコピーPHP が int とみなす文字列を入力すると、変換が強制されます
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true
15.脆弱性のシリアル化とシリアル化解除
这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。
例如__construct()方法会在一个对象被创建时自动调用,对应的__destruct则会在一个对象被销毁时调用等等。
这里有两个比较特别的Magic方法,__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
ログイン後にコピー<?phpclass test{
public $username = ''; public $password = ''; public $file = ''; public function out(){
echo "username: ".$this->username."<br>"."password: ".$this->password ;
} public function __toString() {
return file_get_contents($this->file);
}
}$a = new test();$a->file = 'C:\Users\YZ\Desktop\plan.txt';echo serialize($a);?>//tostring方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了
ログイン後にコピーecho unserialize は __tostring をトリガーしますfunction 、C:UsersYZDesktopplan.txt ファイルは以下で読むことができます<?phpclass test{
public $username = ''; public $password = ''; public $file = ''; public function out(){
echo "username: ".$this->username."<br>"."password: ".$this->password ;
} public function __toString() {
return file_get_contents($this->file);
}
}$a = 'O:4:"test":3:{s:8:"username";s:0:"";s:8:"password";s:0:"";s:4:"file";s:28:"C:\Users\YZ\Desktop\plan.txt";}';echo unserialize($a);?>
ログイン後にコピー
这里我们先简单介绍一下php中的魔术方法(这里如果对于类、对象、方法不熟的先去学学吧),即Magic方法,php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct,__toString,__sleep,__wakeup等等。这些函数都会在某些特殊时候被自动调用。 例如__construct()方法会在一个对象被创建时自动调用,对应的__destruct则会在一个对象被销毁时调用等等。 这里有两个比较特别的Magic方法,__sleep 方法会在一个对象被序列化的时候调用。 __wakeup方法会在一个对象被反序列化的时候调用。
<?phpclass test{ public $username = ''; public $password = ''; public $file = ''; public function out(){ echo "username: ".$this->username."<br>"."password: ".$this->password ; } public function __toString() { return file_get_contents($this->file); } }$a = new test();$a->file = 'C:\Users\YZ\Desktop\plan.txt';echo serialize($a);?>//tostring方法会在输出实例的时候执行,如果实例路径是隐秘文件就可以读取了
<?phpclass test{ public $username = ''; public $password = ''; public $file = ''; public function out(){ echo "username: ".$this->username."<br>"."password: ".$this->password ; } public function __toString() { return file_get_contents($this->file); } }$a = 'O:4:"test":3:{s:8:"username";s:0:"";s:8:"password";s:0:"";s:4:"file";s:28:"C:\Users\YZ\Desktop\plan.txt";}';echo unserialize($a);?>
16.session 逆シリアル化の脆弱性
主な理由は ini_set('session.serialize_handler', 'php_serialize'); です。 ', 'php');
この 2 つはセッションの処理方法が異なりますUsersYZDesktopplan.txt";}';echo unserialize($a);?>
16.session デシリアライズの脆弱性
主な理由は ini_set('session.serialize_handler', 'php_serialize'); ini_set('session.serialize_handler', 'php');
この 2 つはセッションの処理方法が異なります 関連する推奨事項:
いくつかのセキュリティ脆弱性とそれに対応する予防策デシリアライゼーションオブジェクトインジェクションの脆弱性に関する対策
以上がPHP 関数のいくつかの抜け穴のコレクションを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
