pikachu-unsafeupload

首先在文章的开始,我要推荐一个漏洞测试靶场,叫做pikachu,这是一个比较完整的web靶场,里面包含了SQL注入,XSS,文件包含,文件上传,任意文件下载等漏洞,比较适合在学习时测试。
因为最近一段时间在研究代码审计,但是直接上手CMS去审计还是比较难,所以就从pikachu进行审计,之前在北方区拉练赛时我发现他们的赛题就是直接抄的pikachu的源码,所以在文章的结尾我会分享一下,之前市赛审计出mysql密码的技巧。

Client Check

首先呢,根据名称我们也能猜测出这里过滤条件应该是客户端过滤。pikachu-unsafeupload_第1张图片
但是,我们还是要看一下源码。
pikachu-unsafeupload_第2张图片
这里我们可以看到,本段代码,在include_once $PIKA_ROOT_DIR.‘inc/uploadfunction.php’;
一段包含了uploadfunction.php文件,这里是存放文件上传函数的地方,我们继续往下看,发现页面的上传功能是调用了upload_client()函数,我们现在去查看uploadfunction.php。
pikachu-unsafeupload_第3张图片
我们看到之前在clientcheck.php文件中上传调用的函数,通过阅读我们发现并没有任何的过滤手段,所以现在我们去查看前端代码。本着遇事不决,摁下F12的原则,我们可以查看到他的确是在前端进行验证,这里有两个办法,一是直接禁用页面加载JS这样这里定义的JS验证也就失效了,二是也是比较推荐的办法,首先上传格式为允许上传的格式,这里允许上传的格式是[jpg,png,gif],进行抓包,在抓包工具中修改后缀,达到绕过前端的效果。这里我们来演示一下第二种做法。
pikachu-unsafeupload_第4张图片
我们在箭头一的位置进行修改文件名,在箭头二我们可以发现已经成功上传,并且返回了上传的地址。长话短说就等会最后一起验证了。
pikachu-unsafeupload_第5张图片

MIME type

首先我们依旧是查看源码,通过文件名大概也能猜到是MIME绕过,但是我们依旧是要常规操作进行测试一波。
pikachu-unsafeupload_第6张图片
通过本段代码,我们可以知道,首先建立了一个数组,里面存放了三种MIME类型,之后建立了一个上传目录,并将数组以及存放地址作为参数调用upload_sick()函数。
pikachu-unsafeupload_第7张图片
我们在箭头的位置可以看到对上传的文件MIME类型进行验证,如果上传的文件的类型不是数组中存放的类型则禁止上传。所以这里的绕过方法同上,也是在burpsutie中进行改包。将数据包中的content-type值修改为允许上传的MIME类型。这里以image/jpg为例进行修改上传。
pikachu-unsafeupload_第8张图片
这里我们发现已经成功上传。

getimagesize

首先通过名字,我们又可以猜测出这个页面估计是使用了getimagesize()这个函数,这个函数是干什么的呢?这个函数用于获取图像大小及相关信息,也就是说他是可以通过获取图片信息知道我们上传的是不是假图片,所以我们前面的方法也就不好用了。
pikachu-unsafeupload_第9张图片
在本段代码中,我们发现页面创建了两个数组,分别存储了后缀名以及MIME类型,并且根据当天日期生成了一个文件夹,之后调用了upload()函数
pikachu-unsafeupload_第10张图片
我们溯源找到这个函数,在这一小段中我们可以发现,后端验证了上传方式并对上传后的后缀进行了验证,并且验证了大小写以及空值,也就是讲我们只能上传数组中有的后缀名并且更改大小写无效,也不能让后缀名为空。pikachu-unsafeupload_第11张图片
在这一段中我们又发现了,代码对MIME类型也进行了验证,但这都是小问题,在下面我们发现了它通过了getimagesize()函数进行获取了图片信息,验证了上传图片是否是假图片并且限制了上传大小不能超过50kb,并且对上传后的文件名进行了重命名操作。
是不是看似过滤的很严密?那么下面我们来绕过一下试试看。
首先我们需要修改木马文件,在文件前面添加GIF89a从而欺骗绕过getimagesize函数,也可以通过在windows的dos界面进行图片以及php合并操作,这里就不讲这种操作了。pikachu-unsafeupload_第12张图片
然后我们进行抓包上传,因为是白名单原则所以我们必须上传图片类型的后缀名以及MIME类型,然后进行上传操作。
pikachu-unsafeupload_第13张图片
我们看到已经成功上传并且路径为
uploads/2020/02/06/9126165e3be20d06eb4681438516.jpg

但是这是上传后只是一个图片,并没有办法可以执行想要的操作,所以这时候我们还需要使用文件包含。利用之前的页面上传一段具有文件包含的木马文件。

pikachu-unsafeupload_第14张图片
然后通过访问我们之前上传的文件包含文件进行利用,构建payload为
http://192.168.52.133/pikachu/vul/unsafeupload/uploads/include.php?name=2020/02/06/9126165e3be20d06eb4681438516.jpg
pikachu-unsafeupload_第15张图片
发现成功利用。这里因为我没有设置编码,所以中文在这里都是显示乱码。
在uploads目录我们发现之前上传的文件都在这里pikachu-unsafeupload_第16张图片

彩蛋

其实搜集到数据库密码的方法不难,我也正是通过数据库密码答对了一个大题。要不然让我手工去写payload去注入真的有点头疼。
在这里的测试环境中是通过/inc/config.inc.php这个文件,里面存放了数据库名以及用户名及密码还有数据库端口。pikachu-unsafeupload_第17张图片
但是具体环境不同,我之前是在一个php页面找到的密码,他连接数据库是直接通过mysql_connect()进行连接,就比较呆。所以得到数据库名后又是root用户权限,所以自然而然就稳了,当然因为比赛厂家的那个靶机里面有不少题目都在里面,我是直接渗透进入靶机了所以可以进行较多操作,像查看源代码,但是也有一部分老哥说没有办法渗透进主机,这我就不知道了。据说宁波是直接摘取的这个源码作为题目,所以我就出了这么一份教程。因为我想教程总要做到详细,让所有人都能看懂,所以本章讲解可能有些啰嗦。希望大家能多多包涵啊~

最后,祝大家万事如意!本文章仅供学习使用!

你可能感兴趣的:(web渗透,安全)