利用linux目录结构特性引发的解析漏洞

打开后获得源码开始审计

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>cetc7</title>
</head>
<body>
<?php
session_start();#开始记录session

if (!isset($_GET[page])) {#如果没有设置page的get参数就显示源码退出程序
show_source(__FILE__);
die();
}

if (isset($_GET[page]) && $_GET[page] != 'index.php') {#如果设置了page参数并且get参数不等于index.php
include('flag.php');#就包含flag.php
}else {
header('Location: ?page=flag.php');#如果没有设置上述的参数那么就会重定向跳转到当前页面的?page=flag也就是添加这个参数
}

?>

<form action="#" method="get">
page : <input type="text" name="page" value="">
id : <input type="text" name="id" value="">
<input type="submit" name="submit" value="submit">
</form>
<br />
<a href="index.phps">view-source</a>

<?php
if ($_SESSION['admin']) {#如果设置了admin 的SESSION值
$con = $_POST['con'];#定义con变量接受post值
$file = $_POST['file'];#定义file变量接受post值
$filename = "backup/".$file;#拼接filename为 backup/file

if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){#这里只匹配最后一个.
/.+\.ph(p[3457]?|t|tml)$/i
.表示匹配任何字符不/.+\.ph(p[3457]?|t|tml)$/i包括换行
+表示匹配1个或更多个前面的标记
ph表示匹配ph这两个字符
p表示匹配p这个字符
[3457]表示匹配集合中任意字符
?表示匹配0个或者一个前面的字符
|表示匹配或者前面的或者后面的t tml
$表示匹配字符串的结尾
i表示忽略大小写
die("Bad file extension");
}else{
chdir('uploaded');#这里改变了目录
$f = fopen($filename, 'w');
fwrite($f, $con);#写入f文件con内容
fclose($f);
}
}
?>

<?php #如果设置了id 并且id的浮点值不等于1并且截取id的最后一个值等于9这里可以使用php弱类型1-9绕过
if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
include 'config.php';
$id = mysql_real_escape_string($_GET[id]);#mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
$sql="select * from cetc007.user where id='$id'";
$result = mysql_query($sql);
$result = mysql_fetch_object($result);
} else {
$result = False;
die();
}

if(!$result)die("<br >something wae wrong ! <br>");
if($result){
echo "id: ".$result->id."</br>";
echo "name:".$result->user."</br>";
$_SESSION['admin'] = True;
}
?>

</body>
</html>

第一个php便是重定向到page页面

第二个是上传文件并保存但是首先需要session为admin

接着看第三个是要利用php弱类型

如果设置了id 并且id的浮点值不等于1并且截取id的最后一个值等于9这里可以使用php弱类型1-9绕过

http://111.200.241.244:63802/index.php?page=flag.php&id=1-9

接着上传文件,这里主要是包括有一个目录的改变也就是uploaded/backup/目录下面而正则匹配的绕过则需要考虑的是linux的目录结构特性

apache2.x的解析漏洞 1.php.xxx会被当作php来解析,那么我当时上传的时候,并没有能够成功, 
其中 .. 代表当前目录的父目录 , .代表当前目录,所以这里的c.php/b.php/..也就是访问b.php的父目录,也就是 c.php 

那么这里便构造

zf.php/b.php/..

正则的话是判断.之后的字符,因此我们可以利用‘/.’的方式绕过,这个方式的意思是在文件名目录下在加个空目录,相当于没加,因此达到绕过正则的目的。

file=…/flag.php/.

通过蚁剑进行连接

逻辑漏洞与