目錄
1.==繞過
2.===繞過
3.intval()函數(shù)
4.strpos()函數(shù)
?5.in_array()函數(shù)
?6.preg_match()函數(shù)
?7.str_replace函數(shù)
1.==繞過
PHP比較運算符 ==在進(jìn)行比較的時候是弱類型比較,只需要比較兩個值相等就行,不會比較類型
繞過方法如:1=1.0,1=+1、
$a=1;
if($a==$_GET['x']){
??? echo $flag;
}
//使用1.0就可以繞過?
if($_GET['name'] != $_GET['password']){
??? if(MD5($_GET['name']) == MD5($_GET['password'])){
??????? echo $flag;
??? }
??? echo '?';
}
//MD5('QNKCDZO')==MD5('240610708')
//echo MD5('QNKCDZO');
//echo MD5('240610708');
PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進(jìn)行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經(jīng)過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認(rèn)為他們相同,都是0。
2.===繞過
PHP比較運算符 ===在進(jìn)行比較的時候,會先判斷兩種字符串的類型是否相等,再比較值是否相等。只要兩邊字符串類型不同會返回false
繞過方法:使用數(shù)組繞過
if($_GET['name'] != $_GET['password']){
??? if(MD5($_GET['name']) == MD5($_GET['password'])){
??????? echo $flag;
??? }
??? echo '?';
}
//name[]=1&password[]=2
PHP中md5()函數(shù)無法處理數(shù)組(會返回NULL)
==的也可以用數(shù)組繞過
3.intval()函數(shù)
intval() 函數(shù)通過使用指定的進(jìn)制 base 轉(zhuǎn)換(默認(rèn)是十進(jìn)制),返回變量 var 的 integer 數(shù)值。 intval() 不能用于 object,否則會產(chǎn)生 E_NOTICE 錯誤并返回 1(注意這個通常配合preg_match來使用)
語法
int intval ( mixed $var [, int $base = 10 ] )
參數(shù)說明:$var:要轉(zhuǎn)換成 integer 的數(shù)量值。
$base:轉(zhuǎn)化所使用的進(jìn)制。如果 base為空,通過檢測 var 的格式來決定使用的進(jìn)制:
- 如果字符串包括了 "0x" (或 "0X") 的前綴,使用 16 進(jìn)制 (hex);
- 否則,如果字符串以 "0" 開始,使用 8 進(jìn)制(octal);
- 否則,將使用 10 進(jìn)制 (decimal)。
繞過方法:通過使用0x或者0開始的格式來繞過不相等的判斷(像一些要先判斷不相等再判斷相等的題目)
$i='666';
$ii=$_GET['n'];
if(intval($ii==$i,0?)){
??? echo $flag;
}
//n=0x29a? ?666的二進(jìn)制是29a
通過檢測 $ii的格式來決定使用的進(jìn)制
4.strpos()函數(shù)
strpos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(區(qū)分大小寫)。(函數(shù)返回查找到這個find字符串的位置,那么如果是0位置,就值得注意了)
注釋:strpos() 函數(shù)是區(qū)分大小寫的。
?strpos(string,find,start)
參數(shù) 描述 string 必需。規(guī)定被搜索的字符串。 find 必需。規(guī)定要查找的字符。
start 可選。規(guī)定開始搜索的位置
繞過方法:利用換行進(jìn)行繞過(%0a)?
$i='666';
$ii=$_GET['h'];
if(strpos($ii,$i,"0")){
??? echo $flag;
}
//?num=%0a666
?5.in_array()函數(shù)
in_array() 函數(shù)搜索數(shù)組中是否存在指定的值。
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
參數(shù) 描述 needle 必需。規(guī)定要在數(shù)組搜索的值。 haystack 必需。規(guī)定要搜索的數(shù)組。 strict 可選。如果該參數(shù)設(shè)置為 TRUE,則 in_array() 函數(shù)檢查搜索的數(shù)據(jù)與數(shù)組的值的類型是否相同。
問題就出在第三個參數(shù),如果第三個參數(shù)不設(shè)置為true就不檢測類型,是弱比較,相當(dāng)于==號
繞過方法:與==一樣?
$whitelist = [1,2,3];
$page=$_GET['i'];
if (in_array($page, $whitelist)) {
??? echo "yes";
}
//?i=1ex
?6.preg_match()函數(shù)
preg_match 函數(shù)用于執(zhí)行一個正則表達(dá)式匹配。
詳細(xì)用法可以參考:https://www.runoob.com/php/php-preg_match.html
繞過方法:preg_match只能處理字符串,如果不按規(guī)定傳一個字符串,通常是傳一個數(shù)組進(jìn)去,這樣就會報錯,如果正則不匹配多行(/m)也可用上面的換行方法繞過
if(isset($_GET['num'])){
??? $num = $_GET['num'];
??? if(preg_match("/[0-9]/", $num)){[t1]?
??????? die("no no no!");
??? }
??? if(intval($num)){
??????? echo $flag;
??? }
}
//?num[]=1
上面介紹過了,intval() 不能用于 object,否則會產(chǎn)生 E_NOTICE 錯誤并返回 1
?7.str_replace函數(shù)
str_replace() 函數(shù)用于替換字符串中指定字符(區(qū)分大小寫)
<?php
echo str_replace("world","Peter","Hello world!");
?>//輸出:Hello Peter!
str_replace(find,replace,string,count)
參數(shù) 描述 find 必需。規(guī)定要查找的值。 replace 必需。規(guī)定替換?find?中的值的值。 string 必需。規(guī)定被搜索的字符串。 count 可選。一個變量,對替換數(shù)進(jìn)行計數(shù)。
繞過方法:str_replace無法迭代過濾 ,可以通過雙寫繞過
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;
?>文章來源:http://www.zghlxwxcb.cn/news/detail-466918.html
//?s=sselectelect文章來源地址http://www.zghlxwxcb.cn/news/detail-466918.html
到了這里,關(guān)于PHP CTF常見考題的繞過技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!