CTF中常見的PHP知識點

PHP是一門比較松散的語言,既方便,又容易出現一些問題。本文主要概括一些常見的PHP弱類型,正則表達式函數跟變量覆蓋的內容,在CTF這方面也經常出現在代碼審計相關的題目中。

一、弱類型

0x01 "=="與"==="的區別
在使用"=="時會自動轉換類型,而"==="則是校驗類型,而非轉換。

1 == '1';  //true
1 == '1abcdef';  //true
0 == 'abcdefg';  //true
0 === 'abcdefg';  //false
0x02 Hash比較
使用"=="時,如果字符串滿足0e\d+,解析為科學計數法,否則視為正常字符串。

"0e132456789" == "0e7124511451155"  //true
"0e123456abc" == "0e1dddada"  //false
"0e1abc"=="0"     //true
md5('240610708') == md5('QNKCDZO')  //true

0e開頭的md5:
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514
0x03 傳入數組返回null系列
md5()是不能處理數組的,md5(數組)會返回null,同理的有sha1(),strlen(),eregx()。

$array1[] = array(
    "foo" => "bar",
    "bar" => "foo",
);
$array2 = array("foo", "bar", "hello", "world");
var_dump(md5($array1)==var_dump($array2));  //true
0x04 十六進制轉換
使用"=="時,PHP會將十六進制轉換為十進制然后再進行比較

"0x1e240"=="123456"     //true
"0x1e240"==123456       //true
"0x1e240"=="1e240"      //false
0x05 intval()函數
intval()函數會將從字符串的開始進行轉換直到遇到一個非數字的字符。
如果出現無法轉換的字符串,intval()不會報錯而是返回0。

if(intval($a)>1000) {
    mysql_query("select * from news where id=".$a)
}
這個時候$a的值有可能是1002 union…..
0x6 strcmp()函數
strcmp函數比較字符串的本質是將兩個變量轉換為ascii,然后進行減法運算。
在PHP5.3版本之后使用這個函數比較array跟sring會返回0。

$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某種意義上null也就是相當于false。
0x07 switch()函數
如果switch是數字類型的case的判斷時,switch會將其中的參數轉換為int類型。

$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
    echo "i is less than 3 but not negative";
    break;
case 3:
    echo "i is 3";
}
0x08 in_array(),array_search()函數
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),
如果strict參數沒有提供,那么in_array就會使用松散比較來判斷$needle是否在$haystack中。
當strince的值為true時,in_array()會比較needls的類型和haystack中的類型是否相同。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array));  //true
var_dump(in_array('1bc', $array));  //true
0x09 is_numeric()函數
當有兩個is_numeric判斷并用and連接時,and后面的is_numeric可以繞過.
"="優先級比and高。
<?php
$a=$_GET['a'];
$b=$_GET['b'];
$c=is_numeric($a) and is_numeric($b);
var_dump(is_numeric($a));
var_dump(is_numeric($b)); 
var_dump($c);  //$b可以不是數字,同樣返回true
$test=true and false;
var_dump($test);     //返回true 
?>

16進制也可以繞過is_numeric()檢驗,可以用來繞過sql注入里的過濾.
<?php
$a = is_numeric ( $_GET ['a'] ) ? $_GET ['a'] : 0;
$con = mysql_connect ( 'localhost', 'root', 'root' );
mysql_select_db ( 'test' );
$sql = 'insert into a values(' . $a . ',"a")';
mysql_query ( $sql );
?>
test.php?a=0x31206f7220313d31時,數據庫中成功插入值
0x10 json繞過
輸入一個json類型的字符串,json_decode函數解密成一個數組,
判斷數組中key的值是否等于 $key的值,但是$key的值我們不知道,
但是可以利用0=="admin"這種形式繞過
最終payload message={"key":0}

<?php
if (isset($_POST['message'])) {
    $message = json_decode($_POST['message']);
    $key ="*********";
    if ($message->key == $key) {
        echo "flag";
    } 
    else {
        echo "fail";
    }
 }
 else{
     echo "~~~~";
 }
?>

二、正則表達式

0x01 eregi()函數
1. 字符串對比解析,當ereg讀取字符串string時,%00后面的字符串不會不會被解析。
#這里 a=abcd%001234,可以繞過
<?php
    if (ereg ("^[a-zA-Z]+$", $_GET['a']) === FALSE)  {
        echo 'You password must be alphabet';
    }
?>

2. 如果傳入數組,ereg返回NULL
0x02 preg_match函數
如果在進行正則表達式匹配的時候,沒有限制字符串的開始和結束(^ 和 $),則可以存在繞過的問題.

$ip = '1.1.1.1 abcd'; // 可以繞過
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
  die('error');
} else {
  // echo('key...')
}

0x03 preg_replace函數

preg_replace() 的第一個參數如果存在 /e 模式修飾符,則允許代碼執行。
如果沒有 /e 修飾符,可以嘗試 %00 截斷。

<?php
    preg_replace("/test/e",$_GET["nac"],"jutst test");
?>

?nac=phpinfo() #可以被執行

三、變量覆蓋

0x01 extract()函數
extract() 函數從數組中把變量導入到當前的符號表中。
對于數組中的每個元素,鍵名用于變量名,鍵值用于變量值。

<?php  
    $auth = '0';  
    // 這里可以覆蓋$auth的變量值
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>
0x02 parse_str()函數
parse_str() 的作用是解析字符串,并注冊成變量.
與 parse_str() 類似的函數還有 mb_parse_str(),parse_str() 將字符串解析成多個變量,
如果參數 str 是 URL 傳遞入的查詢字符串(query string),則將它解析為變量并設置到當前作用域.

//var.php?var=new  
$var='init';  
parse_str($_SERVER['QUERY_STRING']);
// $var 會變成 new
echo $var;

0x03 $$的使用
如果把變量本身的 key 也當變量,也就是使用了 $$,就可能存在問題。

// http://127.0.0.1/index.php?_CONFIG=123
$_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 {****}';
}
0x04 unset()
unset($bar); 用來銷毀指定的變量,如果變量 $bar 包含在請求參數中,
可能出現銷毀一些變量而實現程序邏輯繞過。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380