java入门 php
2017-04-09 14:20:40 Ni9htMar3 阅读数 14049

最近在做ctf的时候,碰见了好几次关于php伪协议的妙用,所以通过学习整理出相关知识

文档:http://cn2.php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-descriptioo

php伪协议,事实上是其支持的协议与封装协议

支持的种类有这12种
* file:// — 访问本地文件系统
* http:// — 访问 HTTP(s) 网址
* ftp:// — 访问 FTP(s) URLs
* php:// — 访问各个输入/输出流(I/O streams)
* zlib:// — 压缩流
* data:// — 数据(RFC 2397)
* glob:// — 查找匹配的文件路径模式
* phar:// — PHP 归档
* ssh2:// — Secure Shell 2
* rar:// — RAR
* ogg:// — 音频流
* expect:// — 处理交互式的流

先整理一下关于php://的用法

php://

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

php://stdin, php://stdout 和 php://stderr

php://stdinphp://stdoutphp://stderr 允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开php://stdin并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。 推荐简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器。

php://stdin是只读的,php://stdoutphp://stderr 是只写的。

举例:

php://stdin

<?php
    while($line = fopen('php://stdin','r'))
    {//open our file pointer to read from stdin
        echo $line."\n";
        echo fgets($line);//读取
    }
?>

这里写图片描述

可以看到打开了一个文件指针进行读取

php://stdout

<?php
    $fd = fopen('php://stdout', 'w');
    if ($fd) {
        echo $fd."\n";
        fwrite($fd, "这是一个测试");
        fwrite($fd, "\n");
        fclose($fd);
    }
?>

这里写图片描述

可以看到打开了一个文件指针进行写入

php://stderr

<?php
    $stderr = fopen( 'php://stderr', 'w' );
    echo $stderr."\n";
    fwrite($stderr, "lalala" );
    fclose($stderr);
?>

这里写图片描述

可以看到打开了一个文件指针进行写入

php://input

php://input 是个可以访问请求的原始数据的只读流。因为它不依赖于特定的 php.ini 指令。
注:enctype=”multipart/form-data” 的时候 php://input 是无效的。

举例:

就拿最近的HBCTF的一道题吧
相关源码:

<!--
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];

if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
    echo "hello admin!<br>";
    include($file); //class.php
}else{
    echo "you are not admin ! ";
}
 -->

这里写图片描述

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

举例:

<?php
    $out=fopen("php://stdout", 'w');  
    echo $out."\n";
    fwrite($out , "this is a test");
    fclose($out);
?>

这里写图片描述

php://fd

php://fd 允许直接访问指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。

php://memory 和 php://temp

php://memoryphp://temp 是一个类似文件 包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置的决定和 sys_get_temp_dir() 的方式一致。

php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。

php://filter

可以说这是最常使用的一个伪协议,一般可以利用进行任意文件读取。
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()file()file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter 参数

名称 描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(_
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(_
<;两个链的筛选列表> 任何没有以 read=write= 作前缀 的筛选器列表会视情况应用于读或写链。

封装协议摘要(针对 php://filter,参考被筛选的封装器。)

属性 支持
受限于 allow_url_include php://inputphp://stdinphp://memoryphp://temp
允许读取 php://stdinphp://inputphp://fdphp://memoryphp://temp
允许写入 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp
允许追加 php://stdoutphp://stderrphp://outputphp://fdphp://memoryphp://temp(等于写入)
允许同时读写 php://fdphp://memoryphp://temp
支持 stat() php://memoryphp://temp
仅仅支持 stream_select() php://stdinphp://stdoutphp://stderrphp://fdphp://temp

举例:

依旧拿HBCTF举例好啦
这里写图片描述
明显将class.php的代码以base64的形式输出,当然也可以试试字符转成rot13形式
这里写图片描述

这就涉及过滤器的灵活使用
php://filter/read=<读链需要应用的过滤器列表>
这个参数采用一个或以管道符 | 分隔的多个过滤器名称。
这里写图片描述

过滤器

过滤器有很多种,有字符串过滤器、转换过滤器、压缩过滤器、加密过滤器

字符串过滤器


  • string.rot13

进行rot13转换
  • string.toupper
    将字符全部大写
  • string.tolower
    将字符全部小写
  • string.strip_tags
    去除空字符、HTML 和 PHP 标记后的结果
    着重介绍一下这个,功能类似于strip_tags()函数,若不想某些字符不被消除,后面跟上字符,可利用字符串或是数组两种方式
  • 举例

    <?php
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'string.rot13');
        echo "rot13:";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'string.toupper');
        echo "Upper:";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'string.tolower');
        echo "Lower:";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        echo "Del1:";
        stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE);
        fwrite($fp, "<b>This is a test.</b>!!!!<h1>~~~~</h1>\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        echo "Del2:";
        stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, "<b>");
        fwrite($fp, "<b>This is a test.</b>!!!!<h1>~~~~</h1>\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, array('b','h1'));
        echo "Del3:";
        fwrite($fp, "<b>This is a test.</b>!!!!<h1>~~~~</h1>\n");
        fclose($fp);
    ?>

    这里写图片描述

    转换过滤器


    • convert.base64-encode & convert.base64-decode

    base64 编码解码
    convert.base64-encodeconvert.base64-decode使用这两个过滤器等同于分别用 base64_encode()base64_decode()函数处理所有的流数据。 convert.base64-encode支持以一个关联数组给出的参数。如果给出了line-lengthbase64 输出将被用 line-length个字符为长度而截成块。如果给出了* line-break-chars*,每块将被用给出的字符隔开。这些参数的效果和用 base64_encode()再加上 chunk_split()相同。
  • convert.quoted-printable-encode & convert.quoted-printable-decode
    quoted-printable 编码解码
    convert.quoted-printable-encodeconvert.quoted-printable-decode等同于用 quoted_printable_decode()函数处理所有的流数据。没有和* convert.quoted-printable-encode*相对应的函数。* convert.quoted-printable-encode*支持以一个关联数组给出的参数。除了支持和 convert.base64-encode一样的附加参数外,* convert.quoted-printable-encode*还支持布尔参数 binaryforce-encode-firstconvert.base64-decode只支持 line-break-chars参数作为从编码载荷中剥离的类型提示。
  • 举例:

    <?php
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'convert.base64-encode');
        echo "base64-encode:";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $param = array('line-length' => 8, 'line-break-chars' => "\n");
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'convert.base64-encode', STREAM_FILTER_WRITE, $param);
        echo "\nbase64-encode-split:\n";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'convert.base64-decode');
        echo "\nbase64-decode:";
        fwrite($fp, "VGhpcyBpcyBhIHRlc3QuCg==\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'convert.quoted-printable-encode');
        echo "quoted-printable-encode:";
        fwrite($fp, "This is a test.\n");
        fclose($fp);
    
        $fp = fopen('php://output', 'w');
        stream_filter_append($fp, 'convert.quoted-printable-decode');
        echo "\nquoted-printable-decode:";
        fwrite($fp, "This is a test.=0A");
        fclose($fp);
    ?>
    

    这里写图片描述

    压缩过滤器


    • zlib.deflate和 zlib.inflate

    zlib.deflate(压缩)zlib.inflate(解压)实现了定义与 » RFC 1951的压缩算法。 deflate过滤器可以接受以一个关联数组传递的最多三个参数。* level*定义了压缩强度(1-9)。数字更高通常会产生更小的载荷,但要消耗更多的处理时间。存在两个特殊压缩等级:0(完全不压缩)和 -1(zlib 内部默认值,目前是 6)。 window是压缩回溯窗口大小,以二的次方表示。更高的值(大到 15 —— 32768 字节)产生更好的压缩效果但消耗更多内存,低的值(低到 9 —— 512 字节)产生产生较差的压缩效果但内存消耗低。目前默认的 window大小是 15。 memory用来指示要分配多少工作内存。合法的数值范围是从 1(最小分配)到 9(最大分配)。内存分配仅影响速度,不会影响生成的载荷的大小。
    Note: 因为最常用的参数是压缩等级,也可以提供一个整数值作为此参数(而不用数组)。
  • bzip2.compress和 bzip2.decompress
    bzip2.compress过滤器接受以一个关联数组给出的最多两个参数:* blocks*是从 1 到 9 的整数值,指定分配多少个 100K 字节的内存块作为工作区。 work是 0 到 250 的整数值,指定在退回到一个慢一些,但更可靠的算法之前做多少次常规压缩算法的尝试。调整此参数仅影响到速度,压缩输出和内存使用都不受此设置的影响。将此参数设为 0 指示 bzip 库使用内部默认算法。 bzip2.decompress过滤器仅接受一个参数,可以用普通的布尔值传递,或者用一个关联数组中的* small*单元传递。当* small*设为&true; 值时,指示 bzip 库用最小的内存占用来执行解压缩,代价是速度会慢一些。
  • 加密过滤器

    _mcrypt.*__mdecrypt.*_使用 libmcrypt 提供了对称的加密和解密。这两组过滤器都支持 mcrypt 扩展库中相同的算法,格式为_mcrypt.ciphername_,其中 ciphername是密码的名字,将被传递给 mcrypt_module_open()。有以下五个过滤器参数可用:

    mcrypt 过滤器参数

    参数 是否必须 默认值 取值举例
    mode 可选 cbc cbc, cfb, ecb, nofb, ofb, stream
    algorithms_dir 可选 ini_get(‘mcrypt.algorithms_dir’) algorithms 模块的目录
    modes_dir 可选 ini_get(‘mcrypt.modes_dir’) modes 模块的目录
    iv 必须 N/A 典型为 8,16 或 32 字节的二进制数据。根据密码而定
    key 必须 N/A 典型为 8,16 或 32 字节的二进制数据。根据密码而定
    2018-01-19 17:02:44 uknow0904 阅读数 5069

    本文主要讲解从PHP5.X升级到PHP7的方法。

    一、安装在Ubuntu14.04或14.10中安装PHP7

    先添加一个更新源

    apt-get install python-software-properties

    sudo add-apt-repository ppa:ondrej/php

    更新

    apt-get update

    二、为Apache 服务器更新PHP7.0

    Apache执行PHP代码使用的是mod_php模块,安装最新的PHP版本:

    sudo apt-get install php7.0 libapache2-mod-php7.0 php7.0 -mcrypt

    如果你使用的是MySQL数据库,那么你需要执行以下语句同事更新PHP-MySQL的相关绑定。当然你也可以其他有用的模块,比如Curl, GD, Cli, JSON等。

    sudo apt-get install php7.0-mysql php7.0-cli php7.0-gd php7.0-json

    如果你想安装附加的PHP7.0的一些模块,你可以使用apt-cache命令进行模糊查询。

    sudo apt-cache search php7

    安装好以后可以重启Apache服务器然后验证php版本

    $ sudo service apache2 restart

    $ php -v

    你也可以放在web目录下进行验证

    sudo vi /var/www/html/info.php

    phpinfo();

    ?>

    如果在web页面上显示的还是5.X那么需要在apache2配置里面禁用php5的模块,然后重新安装下php7.0 (不出意外会自动加载),接着重启Apache2即可

    sudoadd-apt-repository ppa:ondrej/php

    sudoapt-get updateapt-cache search php7.1

    apt-get install php7.1

    a2dismod php5

    如果之前有其他版本,在这边禁用掉

    a2enmod php7.1

    apt-get install php7.1-mysql

    apt-get install php7.1-curl

    apt-get install php7.1-mbstring

    apt-get install php7.1-gd

    apt-get install php7.1-xml

    apt-get install php7.1-soap

    apt-get install php7.1-mcrypt

    2017-12-22 10:35:09 u013521188 阅读数 7613
    1. 首先下载PHP7安装包,使用wget http://am1.php.net/distributions/php-7.2.0.tar.bz2,或者直接访问下载,然后ftp到linux服务器
    2. 解压压缩包,tar –xjf php-7.0.2.tar.bz2
    3. 进入文件夹,cd php-7.0.2 ,安装必要的依赖工具,
    yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel

    这里主要是升级,一般在php5都安装了,所以这一步可以省略
    4. 安装几个依赖(必须安装,否则后面无法生成apache所用的libphp7.so文件)

    yum -y install perl
    yum –y install perl-devel
    yum -y install httpd-devel
    find /usr  -name apxs 取得所用路径,后面编译时用到。

    5.准备编译工作

    ./configure --prefix=/usr/local/php7 --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-xmlrpc --with-xsl --with-zlib --enable-fpm --enable-bcmath -enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-zip --enable-pcntl --with-curl --with-fpm-user=nginx --enable-ftp --enable-session --enable-xml --with-apxs2=/usr/bin/apxs

    **注意:其中的 –enable-gd-native-ttf 可以不安装,处理图形用的,如果有需求可以以后以扩展形式装
    –with-apxs2=/usr/bin/apxs 后面的路径改为第4步得到的路径
    –prefix=/usr/local/php7 单独安装在php7的文件夹,避免和php5冲突**
    6.编译
    make
    这一步容易出现很多问题,
    如果遇到譬如:undefine 。。。。
    /ext/cli./php …
    Openssl
    等等错误,而且确定安装了相关的模块,则一般清除之前的编译,删除相关文件后重新编译

    make clean
    rm –rf /usr/local/php7

    一般都可以解决问题。
    其他的错误可以参照这篇博客查阅这篇博客:
    http://www.cnblogs.com/sweetXiaoma/p/5855732.html
    http://www.linuxidc.com/Linux/2017-08/146220.htm
    关键还是自行解决,介于linux发行版太多,而且每台服务器的环境配置都不同,所以会遇到很多奇葩的问题。
    7.安装
    Make install
    8.准备配置文件

    cp php.ini-developement /etc/php.ini   //根据实际情况,可以使用production或者development默认配置
    cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

    9.需要修改apache的配置文件
    Vi /etc/httpd/conf/httpd.conf 找到LoadModule php7_module modules/libphp7.so,如果没有手动加上,
    将LoadModule php5_module modules/libphp5.so注释掉
    cp /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf_5
    Vi /etc/httpd/conf.d/php.conf
    改为下面这样:(将涉及到php5的注释掉,改为php7相关模块)

    <IfModule prefork.c>
      LoadModule php7_module modules/libphp7.so
    </IfModule>
    
    <Files ".user.ini">
        <IfModule mod_authz_core.c>
            Require all denied
        </IfModule>
        <IfModule !mod_authz_core.c>
            Order allow,deny
            Deny from all
            Satisfy All
    </IfModule>
    </Files>
    DirectoryIndex index.php
    # mod_php options
    <IfModule  mod_php7.c>
        <FilesMatch \.php$>
            SetHandler application/x-httpd-php
    </FilesMatch>
        php_value session.save_handler "files"
        php_value session.save_path    "/var/lib/php/session"
        php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"
    </IfModule>

    10.重启apache服务器
    service httpd restart

    2017-08-18 23:27:16 qq_36894136 阅读数 6257

    学习PHP有半个月了。每天都要打代码and写笔记。学过C和Java,在学习PHP的过程中比较顺利吧 (^-^) 代码打得越多,运行得越多,慢慢得会对程序理解得越深。下面就讲讲我学习PHP的心得。
    PHP入门很容易,语法很简单,但我不说PHP很容易。难易都是相对的,相对于Java来说PHP确实要简单些,但也不是花一点时间就可以学好的。先了解一下PHP是什么?PHP能做什么?为什么选择学习PHP呢?如果以后想走PHP,就努力专一花大量的时间深学它,不要有这种精几门编程语言的心态。
    最开始学习PHP的时候应该搭建一个LAMP或者WAMP环境。虽然网上有很多集成环境,安装也很方便,但我还是选择的自己搭建PHP环境。我觉得手动搭建环境比较灵活,对整个环境也会有更深的理解,对后期的学习也有帮助吧。当看见浏览器出现It works!,还是挺高兴的 o(≧v≦)o~~
    这里写图片描述
    然后学习PHP的基础知识和技术。这些知识大概有语言基础、字符串、数组、正则表达式、与web页面交互、加密、面向对象、会话等等,花了几天的时间来学习。不管学什么语言,基础都是最重要的。在语法上感觉php跟javascript也有一些相似之处。随着学习的知识不断增多,不懂的问题也开始出现,一直有写笔记的习惯。主要是一些自己的总结,收藏的博客,重复代码块等等。
    这里写图片描述
    再接下来接触到数据库。PHP支持多种数据库,尤其与MySQL关系最好。刚开始学习数据库基础的时候,还是建议大家在命令提示符下操作数据库。虽然有MySQL图形化管理工具,但是一开始不要太过于依赖它了。PHP提供了mysql扩展和mysqli扩展,用来操作数据库,前者已经被废除。还有就是对所有数据库都通用的一个扩展PDO,它屏蔽了各种数据库系统的差异,使用同一个接口来访问各种数据库。就像Java的JDBC那样,很方便程序从不同数据库之间的移植。
    在这里还要提到有关数据库的一些函数封装,我们用一般方法进行数据库操作要分开写很多方法。用面向对象的方法会增强开发效率。可以从网上找一些源代码来研究。另外还要注意MySQL的优化,让数据库尽量用更少的时间 找到我们需要的东西。
    还有就是调试程序的技巧,比如说可以分段echo结果,缩小调试范围,特别是在与数据库交互的时候,先输出SQL语句看看,再分析怎么会操作不成功等等。调试程序可能会占用很多的时间,当然还是要总结自己的调试经验。

    2015-03-13 12:28:09 loophome 阅读数 9572

    一般执行PHP代码,需要把PHP代码写成一个文件,但是有时候查一些PHP配置没有这个必要,能不能直接执行PHP代码呢?

    答案是可以的。

    在命令行下,采用CLI方式执行PHP代码,这里列出几个常用的命令。

    1)执行PHP代码

    php -r "phpinfo();"
    

    2)查看PHP版本(如果是-V参数,输出PHP的编译参数)

    php -v
    3)查看phpinfo配置

    php -i
    4)查看php加载的模块

    php -m





    kali下练习php

    阅读数 7985

    PHP 常用命令行

    阅读数 7544

    开启php错误日志

    阅读数 4055

    PHP CLI 模式详解

    阅读数 14461

    没有更多推荐了,返回首页