目次
2 はじめに
3 実際の戦闘
4 概要

PHPでの弱い型変換の実装

Jul 24, 2018 am 11:51 AM
ctf

この記事で共有した内容は、php の弱い型変換に関するもので、非常に参考になる内容です。困っている友人のお役に立てれば幸いです。

1 はじめに

最近の CTF コンテストで PHP の弱い型に関する問題が何度も出題されましたので、PHP の弱い型に関する知識とそれを回避する方法をまとめたいと思います

2 はじめに

php には 2 つの比較記号 == と ===

1 <?php
2 $a = $b ;
3 $a===$b ;
4 ?>
ログイン後にコピー

=== があります。比較するとき、まず 2 つの文字列の型が一致するかどうかを判断します。が等しい場合、比較

== 比較する場合、文字列型は最初に同じ型に変換されてから比較されます。

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
ログイン後にコピー

ここでは、 value は文字列と比較されます。比較する場合、文字列は数値に変換されます。

1 <?php
2 var_dump("admin"==0);  //true
3 var_dump("1admin"==1); //true
4 var_dump("admin1"==1) //false
5 var_dump("admin1"==0) //true
6 var_dump("0e123456"=="0e4456789"); //true 
7 ?>  //上述代码可自行测试
ログイン後にコピー

1 上記のコードを確認してください。「admin」==0 比較すると、admin は数値に変換されます。値、強制変換、admin は文字列であるため、変換の結果は、0 は当然 0
2 "1admin"==1 と等しくなります。比較すると、1admin は数値に変換され、結果は次のようになります。 1 ですが、「admin1」==1 はエラーに相当します。つまり、「admin1」は 0 に変換されます。なぜですか? ? 3 "0e123456"=="0e456789" 0eなどの文字列は科学技術法で数値として認識されます。0は何度上げてもゼロなので等しいです

上記の質問については、PHP マニュアルを確認しました。

文字列を数値として扱う場合、結果と型は次のようになります。 '.'、'e'、'E'を含まず、その数値が整数の範囲内である
文字列はintとして扱われ、値が取得されます。それ以外の場合はfloatとして扱われます。文字列の開始部分によって、文字列が有効な数値で始まる場合はその値が使用され、それ以外の場合は値が 0 になります。

1 <?php
2 $test=1 + "10.5"; // $test=11.5(float)
3 $test=1+"-1.3e3"; //$test=-1299(float)
4 $test=1+"bob-1.3e3";//$test=1(int)
5 $test=1+"2admin";//$test=3(int)
6 $test=1+"admin2";//$test=1(int)
7 ?>
ログイン後にコピー

これは、「admin1」==1 =>False

3 実際の戦闘

md5 バイパス (ハッシュ比較の欠陥)

の理由を説明しています。
 1 <?php
 2 if (isset($_GET[&#39;Username&#39;]) && isset($_GET[&#39;password&#39;])) {
 3     $logined = true;
 4     $Username = $_GET[&#39;Username&#39;];
 5     $password = $_GET[&#39;password&#39;];
 6 
 7      if (!ctype_alpha($Username)) {$logined = false;}
 8      if (!is_numeric($password) ) {$logined = false;}
 9      if (md5($Username) != md5($password)) {$logined = false;}
10      if ($logined){
11     echo "successful";
12       }else{
13            echo "login failed!";
14         }
15     }
16 ?>
ログイン後にコピー

質問の主な考え方は、文字列と数値型を入力することであり、それらの md5 値が等しい場合、次のステートメントを正常に実行できます。

上で述べた 0e で始まる md5 文字列 私は以前そこにいたことがありますが、0e は比較するときに科学表記として扱われるため、0e の後に何が来ても 0 の累乗は 0 です。 md5('240610708') == md5('QNKCDZO')正常にバイパスされました!

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514
ログイン後にコピー

json bypass

<?php
if (isset($_POST[&#39;message&#39;])) {
    $message = json_decode($_POST[&#39;message&#39;]);
    $key ="*********";
    if ($message->key == $key) {
        echo "flag";
    } 
    else {
        echo "fail";
    }
 }
 else{
     echo "~~~~";
 }
?>
ログイン後にコピー

JSON タイプの文字列、json_decode を入力してください。この関数は次のように復号化します。配列を取得し、配列内の key の値が $key の値と等しいかどうかを判断しますが、$key の値はわかりません。ただし、形式 0=="admin" を使用してバイパスできます。 it

Final payload message={"key":0}

array_search is_array bypass

 1 <?php
 2 if(!is_array($_GET[&#39;test&#39;])){exit();}
 3 $test=$_GET[&#39;test&#39;];
 4 for($i=0;$i<count($test);$i++){
 5     if($test[$i]==="admin"){
 6         echo "error";
 7         exit();
 8     }
 9     $test[$i]=intval($test[$i]);
10 }
11 if(array_search("admin",$test)===0){
12     echo "flag";
13 }
14 else{
15     echo "false";
16 }
17 ?>
ログイン後にコピー

上記は私が書いたものです、最初に受信した配列が配列であるかどうかを判断し、次に配列内の各値をループし、配列内の各値が admin と等しくないことを確認し、各値を int 型に変換してから、受信した配列に admin が含まれているかどうかを判断します。したがって、戻りフラグ

payload test[]=0 はバイパスできます

以下は、公式マニュアルの array_search

mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
ログイン後にコピー

$needle の紹介です。$haystack が必要です。$ strict はオプションです 関数判定$ ヘイスタックの値が $needle に存在します 存在する場合は、その値のキー値が返されます 3 番目のパラメータのデフォルトは false です true に設定すると、厳密なフィルタリングが実行されます

1 <?php
2 $a=array(0,1);
3 var_dump(array_search("admin",$a)); // int(0) => 返回键值0
4 var_dump(array_seach("1admin",$a));  // int(1) ==>返回键值1
5 ?>
ログイン後にコピー

array_search 関数は == に似ています。つまり、$ a=="admin" はもちろん $a=0 です。もちろん、3 番目のパラメータが true の場合、

strcmp をバイパスすることはできません。 Bypass php -v <5.3

 1 <?php
 2     $password="***************"
 3      if(isset($_POST[&#39;password&#39;])){
 4 
 5         if (strcmp($_POST[&#39;password&#39;], $password) == 0) {
 6             echo "Right!!!login success";n
 7             exit();
 8         } else {
 9             echo "Wrong password..";
10         }
11 ?>
ログイン後にコピー

strcmp は 2 つの文字列を比較します。str10 を返します。それらが等しい場合、戻ります。 0.

$password の値がわかりません。質問には strcmp が判断する必要があります。受け入れられる値は、$password と等しい必要があります。strcmp によって渡される予期される型は文字列型です。何が起こるでしょうか。配列を渡すとどうなるでしょうか?

パスワード[]=xxxを渡しますが、関数の関係で回避できます 互換性のない型を受け取った場合はエラーになりますが、それでも正しいと判断されます等しい

ペイロード: パスワード[]=xxx

スイッチバイパス

 1 <?php
 2 $a="4admin";
 3 switch ($a) {
 4     case 1:
 5         echo "fail1";
 6         break;
 7     case 2:
 8         echo "fail2";
 9         break;
10     case 3:
11         echo "fail3";
12         break;
13     case 4:
14         echo "sucess";  //结果输出success;
15         break;
16     default:
17         echo "failall";
18         break;
19 }
20 ?>
ログイン後にコピー

この原理は前の原理と同じです同様です、詳細は説明しません

4 概要

これらの PHP の弱い型は氷山の一角です。上記でコード監査の重要性が確認されました。

関連する推奨事項:

PHP でのキーワード var の使用例

php キュー処理: PHP メッセージ キューの実装原理 (画像とテキスト)

以上がPHPでの弱い型変換の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

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

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles