php常见敏感函数
总结
命令执行
- exec()
- system()
- shell_exec()
- passthru()
- preg_replace()函数 执行命令但是需要/e 模式
- escapeshellcmd()函数
- popen() 此函数需要写入一个文本当中 > D:/1.txt’, ‘r’ ); ?>
- proc_open()
- pcntl_exec() 也是写入一个文件当中 pcntl_exec( “/bin/bash” , array(“whoami”));
- create_funtion()主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给 create_function()执行任意命令。
string create_function(string $args , string $code )
$args 变量部分
$code 方法代码部分(要执行的代码)
1 | |
- call_user_func 和 call_user_func_array 和 array_map。这三个函数都是将第一个参数当作一个方法名,第二个参数当作该方法的内部参数。不同的是第一个函数接受的回调内部参数是单个变量,而后两个函数接受的回调内部参数必须是数组类型。
1 | |
- `` 反引号
代码执行
- eval()
- assert()
- pre_replace()当匹配模式
**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244) !important;">/e</font>**时,该函数会将**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244) !important;">$replacement</font>**作为 php 代码执行 - call_user_func()
文件包含
- require()
- include()
- require_once()
- include_once()
- php 伪协议
文件上传
- request()->file()->move() request()->file()->file() thinkphp 文件上传
**$_FILES**超全局数组- move_upload_file()
文件读写/创建删除
读: ****
- file()
- fgets()读取一行
- fgetc()读取一个
- file_get_content()
- fread()
写:
- fwrite()
- file_put_contents()
删除:
- unlink() 文件删除
- rmdir() 目录删除
创建:
- tempnam()创建临时文件
- tmofile() 创建临时文件
其他
- fopen() 打开或远程读取一个 url
- readfile() 输出一个文件
- rename() 重命名
- fputs()文件上传
目录遍历
- opendir()
- readdir()
- closedir()
SSRF
- curl_exec()
- file_get_contents()直接用 file_get_contents()加载 url 指向文件
- fopen()
- fsockopen(函数会使用 socket 跟服务器建立 tcp 连接,传输原始数据
sql 注入
select、insert、update、mysql_query、mysqli 等关键字。
- 利用 sprintf 绕过一些过滤字符的函数,例如 xxx 函数转义过滤掉了’,那么我们就可以利用 sprintf 的特性绕过过滤。sprintf()和 addslashes()(在 php 中它对单双引号,反斜杠,NULL 字符添加反斜杠)配合使用造成注入。
sprint()正常来讲当字符中%的个数大于参数的个数时必须用占位符,占位符位于 % 符号之后,由数字和 “$“ 组成。利用它把%\匹配占位符从而使单引号逃逸。
1 | |
- mysql_connect()打开一个到 Mysql 服务器的连接
- mysql_query() 发送一条 sql 查询(2,3 都是在 PHP5.5.0 起已废用)
- urldecode()二次解码
对已自动解码的参数再次调用
<font style="color:rgba(0, 0, 0, 0.85);">urldecode()</font>,可能导致安全问题。例如,攻击者可通过双重编码绕过过滤(如将<font style="color:rgba(0, 0, 0, 0.85);">'</font>编码为<font style="color:rgba(0, 0, 0, 0.85);">%2527</font>,第一次自动解码为<font style="color:rgba(0, 0, 0, 0.85);">%27</font>,二次解码为<font style="color:rgba(0, 0, 0, 0.85);">'</font>,可能引发 SQL 注入)
- rawurldecode()原理同 4
- is_numeric()
只用它对参数进行安全处理存进数据库,且在二次使用时未处理会造成二次注入
它不会过滤十六进制的数但在 sql 中会解析十六进制的数为对应的 ASCII 字符
变量覆盖
1.extract()
从数组中将变量导入到当前的符号表。
1 | |
2.parse_str()把查询字符串解析到变量中
3.$$
4.import_request_variables()将 GET/POST/Cookie 变量导入到全局作用域中(相当于开启全局变量注册), 所以如果禁止了 register_globals,但又想用到一些全局变量,则可以使用该函数。
5.Register_globals=ON 时,GET 方式提交变量会直接覆盖。本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。