摘要:在WEB应用中有时候程序员为了考虑灵活性,简明性,会在代码调用或者命令执行函数去处理。好比当应用在调用一些能将字符串转换为代码的函数时,没有考虑用户是都能控制这个字符串,将形成代码执行漏洞。一样调用系统命令处理,将形成命令执行漏洞
php
eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。 若是没有在代码字符串中调用 return 语句,则返回 NULL。若是代码中存在解析错误,则 eval() 函数返回 false。
system — 执行外部程序,而且显示输出 $code=$_GET['x']; echo system($code) //x=ipconfig x=ver
可控变量,以及漏洞函数 无拓展功能,通常没有此类函数
本地文件包含和远程文件包含漏洞,本身的服务器容许别人的php代码,实现远程文件包含 index.php <?php $file = $_GET['file']; if(isset($file)){ include("$file"); // require(); // require_once(); // include_once(); }else{ echo "file fail"; } ?> 同文件目录下存在其余文件会读取,目录下存在index.php,默认访问index.php,127.0.0.1/include/?file=dudu.php ../../etc/httpd.conf 本地包含漏洞能够读取其余文件 172.0.0.1/uploads/include.php?file=图片马的地址 有文件包含,直接上传,或者日志进行上传。蚁剑连马时候,连得是目标马的地址 ○ PHP中形成文件包含的四个函数
当使用include()函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。 当使用require()函数包含文件时,只要程序一执行就会当即调用文件,发生错误的时候会输出错误信息,而且终止脚本的运行。
require_once()功能和require()相同,区别在于当重复调用同一文件时,程序只调用一次。 当上述的四个函数包含一个新文件时,该文件将做为PHP代码执行,php内核并不在乎该被包含的文件是什么类型,若是被包含的是txt文件,图片文件,远程URL,也都将做为PHP代码执行
○ 本地文件包含,远程文件包含的区别
PHP伪协议 事实就是支持的协议和封装的协议12种 file:// - 访问本地文件系统 http:// - 访问http网站 ftp:// - 访问FTP(s)URLS php:// - 访问各个输入输出流 zlib:// - 压缩流 data:// - 数据(RFC 2397) glob:// -查找匹配的文件路径模型 ssh2:// - Secure Shell 2 rar:// - RAR ogg:// - 音频流 expect:// - 处理交互式的流 目标文件 robots.txt 路径为127.0.0.1/www/robots.txt <?php phpinfo();?> robots.zip 127.0.0.1/www/robots.zip robots.txt 1.php 127.0.0.1/www/1.php <?php echo('Hello world')?> flag.txt D:/flag.txt flag{123test} 经常使用协议: 1.目录遍历获取flag:
2.php://input php://filter (1) php://input用于执行php代码
也能够写入shell获取服务器权限 <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[CMD])?>');?>
(2)php://filter 用于读取源码 ?file=php://filter/convert.base64-encode/resource=1.php
3.file:// 用于读取本地系统文件,在CTF中读取本地文件
4.data:// 能够写入后门,获取权限执行任意命令
5.zip:// zip://[压缩文件的绝对路径]#[压缩文件的子文件名]
6.phar协议的做用是归档,将多个文件分组为一个文件。能够处理tar和zip文件