zoukankan      html  css  js  c++  java
  • WEB安全第一篇--对服务器的致命一击:代码与命令注入

    零、前言

      最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件、底层安全、漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的payload技巧以便于备忘。不是大神、博客内容非常基础,如果真的有人看而且是大牛们,请不要喷我,欢迎指正我的错误(水平有限)。

    一、基本原理:

    1、代码注入和命令注入的本质:

      用户输入没有经过过滤而且与程序员开发的代码拼接后构成完成的可执行的代码段被服务器执行(命令也是代码的一部分,不过是拼接在命令执行类函数或方法的参数里面而已)。

    2、命令注入举个例子:Python重度用户(迷汉子)

     1 @app.route("/osinject")
     2 def osinject():
     3     command = request.args.get("cmd")
     4     response = os.popen(command).read()
     5     return jsonify({"result":response})
     6 
     7 #这是一个flask的一个函数例子:
     8 """
     9 command 就是输入
    10 可以构造http://127.0.0.1:5443/osinject?cmd=ping%20-c%205%20192.168.10.135|whoami
    11 就可以执行whoami了
    12 """

    3、代码注入例子:

    1 //www.local.com
    2 /*
    3     /codeinject/code.php
    4     http://www.local.com/codeinject/code.php?code=phpinfo();
    5 */
    6 <?php
    7     @eval("$_GET["code"]")
    8 ?>

    4、php、java、python中常见的可以进行命令注入或者代码注入的函数:

      (1)php的:@我自己,我自己就写过一遍关于这类函数的小日志,可以访问看一下:http://www.cnblogs.com/KevinGeorge/p/8127054.html

      (2)python的:

        -*-command:systempopensubprocess.callspawn

        -*-code: mapfilter educe...   

    1 '''
    2 python 函数名可以直接作为普通函数的参数的,理论上,如果定义了这样的函数都危险
    3 '''
    4 def myreduce(funcname,param):
    5     return funcname(param)

      (3)java的:

        -*-command:java.lang.Runtime.getRuntime().exec(command)

        _*_code:不太懂java,这方面的接触实在不多,囧。

     二、漏洞挖掘:

      1、在请求中出现的位置:

        (1)POST和GET参数中

        (2)URL的filepath或者filename中(类似thinkphp的伪静态,或者python的url_for构造的一类)

      2、特殊的OS命令注入经常会出现在的业务位置:

        1、系统web管理界面的系统信息配置点:hostname、ipaddress、netmask、gateway、dnsserver、email等。

        2、功能类网站工具:ping、tracert、nslookup等

        3、文件查找或者操作功能:find、locate等

        4、系统信息查看类功能:cpuinfo、meminfo等

        5、关闭重启类操作、shutdown、ifconfig up、reboot、poweroff等

    三、常用payload模式:

      1、| ,& ,&&,||等操作    

       (1)& 表示先执行CMD1 再执行CMD2,这里不考虑CMD1是否成功。使用CMD1 & CMD2
       (2)&& 表示先执行CMD1,成功后再执行CMD,否则不执行CMD2。使用CMD1 && CMD2
       (3)|| 先执行CMD1,CMD1执行成功就不再执行CMD2,CMD1执行失败则执行CMD2。使用CMD1 || CMD2
      2、payload(& / ‘ “ 空格等特殊符号需要时编码)
       (1) cmd = 127.0.0.1 | whoami
       (2) cmd = 127.0.0.1 & whoami
       (3) cmd = 127.0.0.1 && whoami
       (4) cmd =  `whoami`
       (5) cmd = '/"|whoami(这里意思是用'/"引号闭合前面   /->表示或)
      3、常用的命令
       (1) 有回显的:whoami    id(验证类)
       (2)  没有回显的:nslookup wget 等看请求、dnslog httplog等 (验证类)
       (3)弹shell必须的,参考我自己的(http://www.cnblogs.com/KevinGeorge/p/8120226.html) 
      4、代码注入:
      (1)php的:检测phpinfo();攻击代码任意。
      (2)python的:import time;time.sleep(20),攻击代码任意。
      (3)java的:我是弱鸡想不到啊。
    四、防御:
      1、禁止相关函数
      2、过滤输入
      3、制定可输入内容

      

        

        

  • 相关阅读:
    shell脚本批量启动jar
    springboot最简单的AOP
    springboot 将null字段输出为空串
    随便记录
    MySQL case when 用法
    JavaDate数据返回到前端变数字的问题
    多级菜单无限递归
    linux tomacat 之部署 war包
    linux tomcat部署 之 jre
    leetcode Best Time to Buy and Sell Stock
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8232430.html
Copyright © 2011-2022 走看看