php特性入门
in_array函数漏洞
- 如题:(ctfshow web99)
- 这里
rand(1,$i)
是在从1
到$i
之间随机选择一个数输出。 - 关于in_array函数的机制:
- 格式:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
,即首位参数为需查询的数值,第二个参数为目标数组,最后一个参数为是否为严格比较。 - 这里没有设置
$strict
即是否为严格比较的值,默认为FALSE
,即非严格比较。如输入2.php
,根据 PHP 类型转换规则 ,从字符串转换为数值时,'2.php'
会被转换为2
(因为它以数字开头,遇到非数字字符就停止转换)。然后该数据就会和$allow
中的元素做查询,看是否有该元素存在。 - 所以这里我们就可以利用
2.php
激活if
语句,利用file_put_contents
函数()。 - 这里相当精妙:利用
file_put_contents
函数来绕过检查并且创造一个1.php
文件。并且将$POST
方式所传入的content
变量所代表的数据代码内容,写入1.php
文件。
- 格式:
- 所以直接采用一句话木马,在
1.php
传入一个content=<?= @eval(?_REQUEST['a'])?>
语句,让1.php
可以执行一个$_REQUEST
超全局变量接收命令并且将结果输出到前端网页端中。 - 由于
$_REQUEST
超全局变量可以接收$_GET
、$_POST
超全局变量,所以可以在导航栏中使用a=system("ls");
指令对该服务器进行控制,并且抓取目标文件。
file_put_contents 函数机制利用
基本机制:
语法:
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
,filename
即规定要写入数据的文件,data
即要写入文件的数据。可以是字符串、数组或数据流。flags
可选。规定如何打开/写入文件。可能的值:- FILE_USE_INCLUDE_PATH
- FILE_APPEND
- LOCK_EX
context
可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。重要规则:如果文件不存在,将创建一个文件,并且打开文件。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dedsec的博客!