护网杯ltshop题解

登录后可以看到home与info页面,home页面中可以看到flag需要兑换才能得到,info页面中可以看到当前用户的相关信息,其中赠送了20元余额

  • 直接点击兑换flag,提示你的辣条之王还不够多

  • 输入数量,批量兑换辣条之王,当输入非数字与负数时提示兑换数目非法,继续尝试正数发现当输入在0-18446744073709551615时,提示一个也换不起,不要尝试了,当大于18446744073709551615时,提示兑换数目非法,即输入范围需要在uint64范围内

  • 点击购买大辣条,提示成功购买一个,点击4次后兑换了4包,余额为0,无法继续兑换,而兑换辣条之王需要5个大辣条,兑换0个时也提示一个也换不起,不要兑换了,所以考虑至少拥有5个大辣条才允许进行兑换操作

  • 余额最多只有20,结合此处的购买场景,考虑竞态条件漏洞,于是注册新的账号,burp拦截购买请求后,使用Intruder进行并发请求(Payload type:Null payloads)image-20181010111346429

  • 长度为162的即为请求成功,而这样的请求远远超过了4个,查看info页面,发现余额为0,大辣条数目为10,此时兑换辣条之王可以兑换成功,并且兑换0个时提示成功兑换0个

  • 之前brup拦截时发现Cookie: go_iris_cookie=727c0799-97b8-43a9-bcd2-995ab93a5739; 搜索go_iris,可知web服务使用go语言的iris框架写的,而go语言是强类型的,也就解释了为什么输入范围控制在uint64范围内,因为输入数目为0时也成功兑换,推测服务器判断是否允许兑换时执行number * 5 <= 大辣条数目 并且number为uint64类型,所以考虑存在uint64溢出问题

  • 使用python计算number值

    1
    2
    3
    4
    5
    >>> a = (2 ** 64 - 1) // 5 + 1
    >>> a
    3689348814741910324
    >>> a * 5 % (2 ** 64)
    4

    即当输入3689348814741910324时,溢出了uint64,此时只要大辣条数目大于等于4即可兑换成功,

image-20181010113623217

此时辣条数目远大于9999999,所以兑换得到flag:

image-20181010113409220