Toc
  1. PHP敏感函数速查表
    1. PHP一些容易出现安全问题的函数方法
  • 命令执行
  • 代码注入/文件包含
  • SQL/LDAP注入
  • 文件读取/SSRF
  • 文件上传/写入/其他
  • Toc
    0 results found
    白帽酱
    PHP代码审计入门基础-PHP敏感函数速查表
    2021/10/27 笔记 笔记 PHP

    PHP敏感函数速查表

    最近正在写一篇PHP代码审计的入门指南文档. 如果表格内出现遗漏或错误,欢迎大家私信反馈.

    PHP一些容易出现安全问题的函数方法

    命令执行

    一些常见的可以执行系统命令的函数/语法

    函数/语法 描述 例子
    system 执行命令并输出结果 system(‘id’);
    exec 执行命令 只可获取最后一行结果 exec(‘id’,$a); print_r($a);
    passthru 同 system passthru(‘id’);
    shell_exec ` (反引号) 执行命令并返回结果 $a=shell_exec(‘id’);print_r($a); $a=`id`;print_r($a);
    popen 执行命令并建立管道 返回一个指针 使用fread等函数操作指针进行读写 $a=popen(“id”, “r”); echo fread($a, 2096);
    proc_open 同 popen (进程控制功能更强大) 见PHP手册
    pcntl_exec 执行命令 只返回是否发生错误 pcntl_exec(‘id’);

    代码注入/文件包含

    函数/语法结构 描述 例子
    eval 将传入的参数内容作为PHP代码执行 eval 不是函数 是一种语法结构 不能当做函数动态调用 eval(‘phpinfo();’);
    assert 将传入的参数内容作为PHP代码执行 版本在PHP7以下是函数 PHP7及以上为语法结构 assert(‘phpinfo();’);
    preg_replace 当preg_replace使用/e修饰符且原字符串可控时时 有可能执行php代码 echo preg_replace(“/e”,”{${PHPINFO()}}”,”123”);
    call_user_func 把第一个参数作为回调函数调用 需要两个参数都完全可控才可利用 只能传入一个参数调用 call_user_func(‘assert’, ‘phpinfo();’);
    call_user_func_array 同call_user_func 可传入一个数组带入多个参数调用函数 call_user_func_array (‘file_put_contents’, [‘1.txt’,’6666’]);
    create_function 根据传递的参数创建匿名函数,并为其返回唯一名称 利用需要第二个参数可控 且创建的函数被执行 $f = create_function(‘’,’system($_GET[123]);’); $f();
    include 包含并运行指定文件 执行出错会抛出错误 include ‘vars.php’; (括号可有可无)
    require 同include 执行出错会抛出警告 require(‘somefile.php’); (括号可有可无)
    require_once 同require 但会检查之前是否已经包含该文件 确保不重复包含
    include_once 同include 但会检查之前是否已经包含该文件 确保不重复包含

    SQL/LDAP注入

    函数/方法 备注
    mysql_query
    odbc_exec
    mysqli_query
    mysql_db_query
    mysql_unbuffered_query

    mysqli::query

    用法

    $mysqli = new mysqli(“localhost”, “my_user”, “my_password”, “world”);

    $mysqli->query();

    pg_query
    pg_query_params
    pg_send_query
    pg_send_query_params
    sqlsrv_query

    pdo::query

    $pdo=new PDO(“mysql:host=localhost;dbname=phpdemo”,”root”,”1234”); $pdo->query($sql);;

    PDO

    SQLite3::query

    SQLite3::exec

    $db = new SQLite3(‘mysqlitedb.db’); $db->query(‘SELECT bar FROM foo’); $db->exec(‘CREATE TABLE bar (bar STRING)’);

    $mongo = new mongoclient(); $data = $coll->find($data); https://wooyun.js.org/drops/Mongodb%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB.html
    $ld = ldap_connect(“localhost”);…. $lb = @ldap_bind($ld, “cn=test,dc=test,dc=com”, “test”); https://www.cnblogs.com/0nc3/p/12063436.html
    Db::query Thinkphp
    Db::execute Thinkphp

    文件读取/SSRF

    函数 描述 例子
    file_get_contents 读入文件返回字符串 echo file_get_contents(“flag.txt”); echo file_get_contents(“https://www.bilibili.com/");
    curl_setopt curl_exec Curl访问url获取信息 function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_exec($ch); curl_close($ch); } $url = $_GET[‘url’]; curl($url); https://www.php.net/manual/zh/function.curl-exec.php
    fsockopen 打开一个套接字连接(远程 tcp/udp raw) https://www.php.net/manual/zh/function.fsockopen.php
    readfile 读取一个文件,并写入到输出缓冲 同file_get_contents
    fopen/fread/fgets/fgetss /fgetc/fgetcsv/fpassthru/fscanf 打开文件或者 URL 读取文件流 $file = fopen(“test.txt”,”r”); echo fread($file,”1234”); fclose($file);
    file 把整个文件读入一个数组中 echo implode(‘’, file(‘https://www.bilibili.com/'));
    highlight_file/show_source 语法高亮一个文件 highlight_file(“1.php”);
    parse_ini_file 读取并解析一个ini配置文件 print_r(parse_ini_file(‘1.ini’));
    simplexml_load_file 读取文件作为XML文档解析

    文件上传/写入/其他

    函数 描述 例子
    file_put_contents 将一个字符串写入文件 file_put_contents(“1.txt”,”6666”);
    move_uploaded_file 将上传的临时文件移动到新的位置 move_uploaded_file($_FILES[“pictures”][“tmp_name”],”1.php”)
    rename 重命名文件/目录 rename($oldname, $newname);
    rmdir 删除目录
    mkdir 创建目录
    unlink 删除文件
    copy 复制文件 copy($file, $newfile);
    fopen/fputs/fwrite 打开文件或者 URL https://www.php.net/manual/zh/function.fwrite.php
    link 创建文件硬链接 link($target, $link);
    symlink 创建符号链接(软链接) symlink($target, $link);
    tmpfile 创建一个临时文件 (在临时目录存放 随机文件名 返回句柄) $temp = tmpfile(); fwrite($temp, “123456”); fclose($temp);

    request()->file()->move()

    request()->file()->file()

    Thinkphp 文件上传

    $file = request()->file($name);

    $file->move($filepath);

    extractTo 解压ZIP到目录
    DOMDocument loadXML simplexml_import_dom 加载解析XML 有可能存在XXEE 漏洞 file_get_contents获取客户端输入内容 new DOMDocument()初始化XML解析器 loadXML($xmlfile)加载客户端输入的XML内容 simplexml_import_dom($dom)获取XML文档节点,如果成功则返回SimpleXMLElement对象,如果失败则返回FALSE。 <?php $xmlfile=file_get_contents(‘php://input’); $dom=new DOMDocument(); $dom->loadXML($xmlfile); $xml=simplexml_import_dom($dom); $xxe=$xml->xxe; $str=”$xxe \n”; echo $str; ?> 来自 <_https://xz.aliyun.com/t/6887_>
    simplexml_load_string 加载解析XML字符串 有可能存在XXE 漏洞 $xml=simplexml_load_string($_REQUEST[‘xml’]); print_r($xml);
    simplexml_load_file 读取文件作为XML文档解析 有可能存在XXE 漏洞
    unserialize 反序列化
    本文作者:白帽酱
    版权声明:本文首发于白帽酱的博客,转载请注明出处!