Vulnhub 学习记录 -1

/ 0评 / 0

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.phptest 文件

/test页面测试发现需要通过POST请求提交参数 file, 存在文件包含(下载)漏洞。

因此可以下载网站源码,分别如下:

index.php

<?php  
session_start();  
​  
include('c.php');  
include('head.php');  
if(@$_SESSION['logged']!=true)  
{  
    $_SESSION['logged']='';  

}  
​  
if($_SESSION['logged']==true && &nbsp;$_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> &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);  
     &nbsp; echo "You are allowed<br>";  
     &nbsp; $_SESSION['logged']=true;  
     &nbsp; $_SESSION['admin']=$row['username'];  
     &nbsp;   
     header('Location: panel.php', true, 302);  
 &nbsp;   
}  
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())  {  
&nbsp;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))   
 &nbsp; {  
     &nbsp; 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>';  
}  
 &nbsp; echo "</table>";  
}  
}  
​  
?>

add.php

<?php   
echo '<form  method="post" enctype="multipart/form-data">  
 &nbsp; &nbsp;Select image to upload:  
 &nbsp; &nbsp;<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 >  
 &nbsp; &nbsp;<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>  
 &nbsp; &nbsp;<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')  
    {  
 &nbsp; &nbsp; &nbsp;      include($dir.'/'.$choice.'.php');  
            die();  
    }  

 &nbsp; &nbsp; &nbsp; &nbsp;if($choice==='show')  
    {  
 &nbsp; &nbsp; &nbsp; &nbsp;  
        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 ) &nbsp; preg_match('/image/png/',$filetype )  preg_match('/image/gif/',$filetype ))  
                {  
                    if (move_uploaded_file($_FILES['image']['tmp_name'], 'uploaded_images/'.$_FILES['image']['name']))  
                             {  
                             &nbsp;echo "Uploaded successfully ";  
                             &nbsp;$update='insert into users(name,address,image,id) values(''.$name.'',''.$address.'',''.$iname.'', ''.$id.'')';   
                             mysqli_query($conn, $update);  
                             &nbsp;  
                            }  
                }  
            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端口并没有开放,所以无法直接连接。该种情况想要连接,有:

  1. 使用ssh进入服务器,本地连接数据库
  2. 该靶机存在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 -- '

成功注入并登录。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code