[极客大挑战 2019]BuyFlag

0x00

打开WEB界面如下

大致浏览一下网页,在pay.php页面发现如下

这里我们知道了几个获取flag需要满足的条件,查看该界面源码发现如下

通过代码审计和以上条件综合得到如下:

  • 1.必须为CUIT的学生(暂时不知道如何使用)
  • 2.money需要传入100000000
  • 3.password需要通过 ==404的验证,但是还需要绕过is_numeric函数(这里我们可以根据php弱类型语言的特性进行绕过,令password=404a)
    我们进行如下请求

    得到如下结果,可能我们还忽略了某些参数,导致第一个条件不会使用

    我们使用BurpSuite抓包,来获得更多的信息,得到结果如下

    发现cookie里面的数据有点奇怪,将它修改为1,重新请求得到如下

    发现返回结果变了,看来第一个条件是这样使用,但是新的问题是数字太长(这里应该是对位数进行了过滤)
    我们在开发的时候比较较长的整型时,一般都是将其看成字符串进行比较的
    所以我猜测money的比较是使用php的字符串比较函数strcmp()函数
    php的strcmp()函数存在一些安全问题,当传入的类型不是字符串类型,函数就会发生错误,显示报错信息后会return 0
    strcmp()函数正确的使用方法中 0 表示相同,所以我们可以以此来绕过位数过滤
    修改数据包如下(money修改为数组类型),重新进行请求

    得到结果如下

0x01 总结

  • 1.php弱类型语言 == 比较问题
php == 比较字符串与整型,会将字符串转化成整型,后再比较
字符串为字母开头转化为 0
字符串为数字开头转化为 开头的一系列数字,去掉字符串部分
  • 2.php strcmp()函数安全问题
strcmp()函数进行比较时,当传入结果不为字符串时 return 0,与正确使用时两字符串相同的返回结果一样
posted @ 2020-09-08 17:56  she11s  阅读(218)  评论(0编辑  收藏  举报