什么是网站(web)漏洞?
web漏洞通常是指网站程序上的漏洞,可能是由于代码编写者在编写代码时考虑不周全等原因而造成的漏洞,这些漏洞一旦被恶意攻击者利用,会根据漏洞的危害程度,造成不可估量的损失。
Web常见漏洞
- SQL注入
- XSS跨站点脚本
- 任意文件读取漏洞
- 上传漏洞
- CSRF
- 命令注入
- 弱口令漏洞
- 敏感信息泄露漏洞
Apache解析漏洞
Apache解析文件格式的特点是这样的:它解析文件格式会从后向前解析,如果文件格式它不认识,他就会继续向前解析。
举一个例子,有一个文件为1.jpg.qqq
,上传到Apache服务器中,因为Apache不认识qqq
是什么格式。因此它就会继续向前解析,这时就解析到了jpg。因此Apache就认为这是一个jpg的文件。
在本次试验中,我们使用上传漏洞结合Apache解析漏洞,通过构造文件名来突破上传,最终成功拿到flag
白名单
服务端通过获取上传文件的扩展名来匹配预先定义的合法扩展名数组,如果未能成功匹配的话,认为上传文件不合法,返回报错信息,如果扩展名能成功匹配,则认为上传文件合法,进行文件保存操作。
拿上传图片举例,服务端定义的白名单:
$WhiteList=array("png","jpg","jpeg","gif");
可以看到,上述代码中只允许上传"png","jpg","jpeg","gif"
这四种格式文件,上传文件时,服务端会检测后缀,如果所上传的文件格式后缀,没有在白名单允许的范围内,系统会拒绝上传。
黑名单
服务端通过获取上传文件的扩展名来匹配预先定义的非法扩展名数组,如果能成功匹配的话,认为上传文件不合法,返回报错信息,如果扩展名没有匹配到,则认为上传文件合法,进行文件保存操作。
拿上传图片举例,服务端定义的黑名单:
$BlackList=array("php","htaccess","asp","aspx");
根据黑名单列表可以看出,服务器不允许上传攻击中常用的php、htaccess、asp、aspx
等脚本文件,也就是说这些文件都会被服务端所拦截,不能上传成功。
下面开始实验
我们看到下方显示了允许上传的类型,可以猜测,这应该是一个白名单验证,系统只允许列出的文件后缀进行上传。
首先在桌面创建一个php一句话木马,测试是否能上传成功。
在php文件里写入如下内容,并命名为1.php
//post会把123当做参数进行传递,eval会执行后面的语句。
eval在php中会将字符串当做代码来执行, 而post的意思是使用post的方式进行传递参数。
一句话木马,顾名思义,它的体积很小,只由一句php代码构成。
点击浏览,选择创建好的1.php,然后点击提交
可以看到提示:必须上传规定的类型,也就是只可以上传它白名单内的内容,如果上传白名单外的东西,会被系统拒绝。
因为在白名单列表中有jpg格式,因此在我们再将它的后缀名改为jpg,命名为1.jpg,查看是否能成功。
可以看到,改为jpg可以上传成功。
虽然jpg文件上传成功,但它其中的php代码并不能执行成功,使用中国菜刀也不会连接成功的。
因为jpg是图片格式,不能解析其中的php代码,要想解析php代码,后缀必须为php或者其他可以解析php代码的格式。
- 提示:这个时候我们就需要对其进行绕过,服务器会检测我们所上传的后缀是否在白名单内,如果不在的话就禁止上传。
通过上述,我们已经知道了Apache解析漏洞的原理和它如何利用,这里我们就开始上传。
之前我们已经知道,Apache解析文件名后缀是从后向前解析,因此我们可以这样构造:
1.php.abc
因为Apache不识别abc格式的文件,这样他就会往前解析,这时他就会解析到了php。这样我们就可以执行成功了。
但是我们看到,上传失败,为什么呢?因为网站设置了白名单(这里之前已经详细的讲过,这里不再赘述),我们只能上传规定的上传类型。
因此我们尝试上传它白名单允许的格式,看是否可以成功上传:
我们尝试gif格式作为后缀,构造名称:
1.php.gif
可以看到,虽然上传成功,但并没有爆出flag,这是为何?
因为gif是最常见的图片格式,Apache是识别这个格式的,就把它当成了图片来处理,而1.php
就成为了它的文件名,gif
是它的格式。
接下来我们依次对其进行测试。
到最后一个,7z
格式,进行构造:
1.php.7z
测试:
可以看到,成功的爆出了flag,这又是为什么呢?因为Apache不识别7z
格式的文件,因此它就会向前解析,解析到了php,这样就成功的上传了一句话木马。
我们成功的上传,通过上传,并结合Apache解析漏洞,最终成功的获取了FLAG。
在本次试验中,我们尝试多种方法对其进行绕过。
首先我们直接上传了php文件,因为白名单中没有php后缀的格式,拒绝上传,因此失败了
我们再次上传了jpg文件,虽然上传成功但并没有用处,因为Apache把它解析成图片了
接下来上传了1.php.gif,这个上传成功了,但一句话木马的代码也没有执行成功,因为Apache识别了gif格式,把它当成了图片处理。
最后我们上传了1.php.7z,这个成功的爆出了flag。
因此我们得出结论,需要成功的执行代码,需要两个条件:
只有最后一个满足了这两点,因此一句话木马才能上传成功。
因为本实验仅作为测试用,无法连接中国菜刀,在真实的环境中,我们可以将上传木马的地址复制到菜刀里连接,这样就拿到了网站的Shell