zoukankan      html  css  js  c++  java
  • 跟bWAPP学WEB安全(PHP代码)--OS命令注入

    背景


    这是温故知新的一个系列,也是重新拾起WEB安全的一个系列,同时希望能稍微有点对初学者的帮助。第一篇先来讲讲OS命令注入
    bWAPP里面有两个页面也就是两个漏洞,来验证OS命令注入。一个是有回显的,一个是没有的,其实本质都是一样,没有回显的,可以利用类似ceye平台来验证dns请求或者http请求,自己搭建一个也不难,flask或者Django起一个,调试模式,看日志也是OK的。

    难度区分


    一般来讲,bWAPP有三个难度,高中低,一般高的也不是不可以绕过,但是很复杂,不在这个系列里面去温故知新或者去记录了,但是有些会给出链接,供参考。

    正文


    前两个作为开篇前言,后面的系列就不会再写了,下面开始正文。

    代码分析


    先上代码:

      <?php
    
        if(isset($_POST["target"]))
        {
    
            $target = $_POST["target"];
    
            if($target == "")
            {
    
                echo "<font color="red">Enter a domain name...</font>";
    
            }
    
            else
            {
    
                echo "<p align="left">" . shell_exec("nslookup  " . commandi($target)) . "</p>";
    
            }
    
        }
    
        ?>
    

    可以看出问题的关键就在这里shell_exec,高危函数,类似的还有很多,可以参考我的博客WEB安全第一篇--对服务器的致命一击:代码与命令注入

    追踪代码,再来看看

    function commandi($data)
    {
    
        switch($_COOKIE["security_level"])
        {
    
            case "0" :
    
                $data = no_check($data);
                break;
    
            case "1" :
    
                $data = commandi_check_1($data);
                break;
    
            case "2" :
    
                $data = commandi_check_2($data);
                break;
    
            default :
    
                $data = no_check($data);
                break;
    
        }
    
        return $data;
    
    }
    

    可以看出难度不同,检查不同,难度低没有检查,难度中等,使用commandi_check_1函数进行检查,难度高等使用commandi_check_2函数进行检查。具体来看看这两个检查函数

    function commandi_check_1($data)
    {
        
        $input = str_replace("&", "", $data);
        $input = str_replace(";", "", $input);
        
        return $input;
        
    }
    
    function commandi_check_2($data)
    {
       
        return escapeshellcmd($data);
        
    }
    
    function commandi_check_3($data)
    {
        
        $input = str_replace("&", "", $data);
        $input = str_replace(";", "", $input);
        $input = str_replace("|", "", $input);
        
        return $input;
        
    }
    

    不检查的好说,直接 | 拼接在执行的命令就行了,难度高的用来escapeshellcmd函数,标准PHP防御OS命令执行的函数,绕过方式可以参考Exploit/bypass PHP escapeshellarg/escapeshellcmd functions

    我们来说说中等

    中等难度


    在中等难度中过滤了&和;其实这没啥用一个|拼接一样执行,我们按照commandi_check_3的标准过滤掉|,再来尝试注入。
    可以尝试``我们来试试


    Payload:%26%26%60id%20>1.txt%60

    参考文献


    https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote commands execution/Intruder/command_exec.txt
    https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote commands execution/Intruder/command-execution-unix.txt

  • 相关阅读:
    [leetCode]剑指 Offer 62. 圆圈中最后剩下的数字
    [leetCode]剑指 Offer 61. 扑克牌中的顺子
    [leetCode]剑指 Offer 60. n个骰子的点数
    POJ
    POJ
    POJ
    codeforces
    LightOJ
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/10212667.html
Copyright © 2011-2022 走看看