php中
== 轉化為相同類型后比較
=== 先判斷數據類型后比較數值
var_dump("asdf"==0);#bool(true)
var_dump("asdf"==1);#bool(false)
var_dump("0asdf"==0);#bool(true)
var_dump("1asdf"==1);#bool(true)
1、md5撞庫
例:
<?php
include_once("flag.php");
if(isset($_GET['username'])&&isset($_GET['password'])){
$logined=true;
$username=$_GET['username'];
$password=$_GET['password'];
echo "username md5:";
print(md5($username));
echo "<br />"."password md5:";
print(md5($password));
echo "<br />";
if(!ctype_alpha($username)){$logined=false;}
if(!is_numeric($password)){$logined=false;}
if(md5($username)!=md5($password)){$logined=false;}
if($logined){
print($flag);
}else{
echo "falied";
}
}
?>
ctype_alpha函數,檢驗字符串是否為純字母
is_numeric函數,校驗字符串是否為純數字或純數字字符串
使用以0e開頭的md5值即可繞過(0e科學計數);
tipes:md5等字符串處理函數沒有對數組的處理能力且返回值為null;
例:
<?php
include_once("flag.php");
$a=$_GET['a'];
$b=$_GET['b'];
var_dump(md5($a));
var_dump(md5($b));
if(md5($a)===md5($b)){print($flag);//echo 'success';
}
var_dump(sha1($a));
?>
例:
<?php
$password="qaz123";
if(isset($_REQUEST['password'])){
if(strcmp($_REQUEST['password'],$password)==0){
echo "success";
exit();
}else{
echo "password wrong";
}
}
?>
該漏洞觸發點為strcmp函數無法處理數組,導致了函數值會返回空
s w i t c h
json
<?php
if(isset($_POST['a'])){
$a=json_decode($_POST['a']);
$key="**********";
//var_dump("asdfaasdasdf"==0);#該問題核心
if($a->key == $key)
{
echo "flag";
}
}
else{
echo "on no!";
}
?>payload:a={"key":0}
is_array array_search
<?php
if(!is_array($_GET['a'])){
echo "is not array!";
exit();}
$a=$_GET['a'];
for($i=0;$i<count($a);$i++){
if($a[$i]==="admin"){
echo "error1";
exit();
}
$a[$i]=intval($a[$i]);
}
if(array_search("admin",$a)===0){
echo "flag";
}
else{
echo "error2";
}
?>
上方代碼先校驗是否為數組,之后遍歷數組,之后檢查所有數組是否有admin字段,如果有則會退出, 之后對數組中的值進行了int整型強轉,又要求再數組中必須有admin字段;