🎯
PHP代码审计入门指南
  • PHP代码审计入门指南
  • 序言
  • PHP审计基础
    • ⚒️工具准备
    • VS CODE 常用快捷键
    • PHP代码审计思路
    • 💉PHP用户可控输入速查表
    • 🧬PHP敏感函数速查表
    • 🩹PHP原生过滤方法
    • PHP动态调试-Xdebug安装配置
  • PHP常见漏洞
    • 命令注入
    • 代码注入
    • 文件包含
    • SQL注入
    • 文件操作
    • XSS
    • SSRF
    • CSRF
    • XXE
    • 反序列化
    • LDAP注入
    • 其他漏洞
  • PHP常见框架
    • Thinkphp
    • Laravel
    • Codeigniter
    • Yii
    • Cakephp
  • PHP审计实例
    • -
  • 附录
    • PHP弱类型
  • 🎉总结
  • 🔗参考
由 GitBook 提供支持
在本页
  • 命令执行
  • 代码注入/文件包含
  • SQL/LDAP注入
  • 文件读取/SSRF
  • 文件上传/写入/其他
  1. 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 (进程控制功能更强大)

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);

$ld = ldap_connect("localhost");…. $lb = @ldap_bind($ld, "cn=test,dc=test,dc=com", "test");

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获取信息

fsockopen

打开一个套接字连接(远程 tcp/udp raw)

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

link

创建文件硬链接

link($target, $link);

symlink

创建符号链接(软链接)

symlink($target, $link);

tmpfile

创建一个临时文件 (在临时目录存放 随机文件名 返回句柄)

$temp = tmpfile(); fwrite($temp, "123456"); fclose($temp);

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

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

$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。

simplexml_load_string

加载解析XML字符串 有可能存在XXE 漏洞

$xml=simplexml_load_string($_REQUEST['xml']); print_r($xml);

simplexml_load_file

读取文件作为XML文档解析 有可能存在XXE 漏洞

unserialize

反序列化

上一页PHP用户可控输入速查表下一页PHP原生过滤方法

最后更新于3年前

function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_exec($ch); curl_close($ch); } $url = $_GET['url']; curl($url);

<?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; ?> 来自 <>

🧬
见PHP手册
https://wooyun.js.org/drops/Mongodb%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB.html
https://www.cnblogs.com/0nc3/p/12063436.html
https://www.php.net/manual/zh/function.curl-exec.php
https://www.php.net/manual/zh/function.fsockopen.php
https://www.php.net/manual/zh/function.fwrite.php
Thinkphp 文件上传
https://xz.aliyun.com/t/6887