利用linux目录结构特性引发的解析漏洞
打开后获得源码开始审计
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>cetc7</title> </head> <body> <?php session_start();
if (!isset($_GET[page])) { show_source(__FILE__); die(); }
if (isset($_GET[page]) && $_GET[page] != 'index.php') { include('flag.php'); }else { header('Location: ?page=flag.php'); }
?>
<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']) { $con = $_POST['con']; $file = $_POST['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); fclose($f); } } ?>
<?php if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') { include 'config.php'; $id = mysql_real_escape_string($_GET[id]); $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
|
那么这里便构造
正则的话是判断.之后的字符,因此我们可以利用‘/.’的方式绕过,这个方式的意思是在文件名目录下在加个空目录,相当于没加,因此达到绕过正则的目的。
通过蚁剑进行连接
逻辑漏洞与