题目
发现view-source
<!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)){
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>
第一段分析
参数page存在且其值不等于index.php,才会包含flag.php
<?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');
}
?>
第二段分析
首先$_SESSION['admin']
,将$con
的内容写入到$file
,但文件后缀名不可以为.php3/4/5/6/7/t/html
<?php
if ($_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);
}
}
?>
第三段分析
$_SESSION['admin'] = True
可以满足第二段所需
该段需要满足参数id存在,id的浮点值不为'1'
,id参数的最后一个数值是9
<?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;
}
?>
总结
1、第三段
可以使用id=1+9来绕过
payload:
http://159.138.137.79:56884//index.php?page=flag.php&id=1+9
2、第二段
获得了admin,$con
等于文件的内容,$file
为文件名,$filename = "backup/".$file
,因为preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename
是判断.之后的值,那么可以使用例如peak.php/.
绕过,(/.表示在peak.php文件所在目录加一个新的空目录,相当于没加,例如在一个网站后面加/.,测试后即可了解),绕过正则后,还有一个问题,它改变了当前目录,这就是chdir搞得鬼,那,何为chdir?
chdir
(PHP 4, PHP 5, PHP 7)
chdir — 改变目录
说明
chdir( string $directory) : bool
将 PHP 的当前目录改为 directory。
参数
directory
新的当前目录
返回值
成功时返回 TRUE, 或者在失败时返回 FALSE。
错误/异常
Throws an error of level E_WARNING on failure.
范例
Example #1 chdir() 例子
<?php
// current directory
echo getcwd() . "\n";
chdir('public_html');
// current directory
echo getcwd() . "\n";
?>
以上例程的输出类似于:
/home/vincent
/home/vincent/public_html
相当于,将当前所在目录后面添加一个新的目录,该文件即在新添的这个目录下,根据代码所知,原本是在根目录下,现在在根目录后面添加一个uploaded目录
,$filename就在根目录/uploaded下
,所以,第二段的payload为: