利用上传htaccess文件解析漏洞绕过验证进行上传PHP脚本木马
什么是网站(web)漏洞?
web漏洞通常是指网站程序上的漏洞,可能是由于代码编写者在编写代码时考虑不周全等原因而造成的漏洞,这些漏洞一旦被恶意攻击者利用,会根据漏洞的危害程度,造成不可估量的损失。
Web常见漏洞
- SQL注入
- XSS跨站点脚本
- 任意文件读取漏洞
- 上传漏洞
- CSRF
- 命令注入
- 弱口令漏洞
- 敏感信息泄露漏洞
htaccess绕过上传漏洞解析
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
PHP在处理.htaccess文件中的配置时存在漏洞,本地攻击者可能利用此漏洞绕过PHP的某些安全限制。
如果将PHP用作Apache模块的话,就可以使用.htaccess文件中的指令更改配置设置。用户可以使用这些选项更改display_errors之类权限选项,
可以绕过不同函数中的safe_mode或open_basedir安全限制。例如,用户可以通过.htaccess设置session.save_path。
session_save_path()和ini_set()函数中对save_path检查了safe_mode和open_basedir,但在.htaccess中确可以绕过这个检查。
文件上传漏洞在WEB端属于危害比较大的漏洞,一旦成功利用漏洞,可能导致网站被下后门,甚至可以直接拿下服务器权限。
白名单
服务端通过获取上传文件的扩展名来匹配预先定义的合法扩展名数组,如果未能成功匹配的话,认为上传文件不合法,返回报错信息,如果扩展名能成功匹配,则认为上传文件合法,进行文件保存操作。
拿上传图片举例,服务端定义的白名单:
$WhiteList=array("png","jpg","jpeg","gif");
可以看到,上述代码中只允许上传"png","jpg","jpeg","gif"
这四种格式文件,上传文件时,服务端会检测后缀,如果所上传的文件格式后缀,没有在白名单允许的范围内,系统会拒绝上传。
黑名单
服务端通过获取上传文件的扩展名来匹配预先定义的非法扩展名数组,如果能成功匹配的话,认为上传文件不合法,返回报错信息,如果扩展名没有匹配到,则认为上传文件合法,进行文件保存操作。
拿上传图片举例,服务端定义的黑名单:
$BlackList=array("php","htaccess","asp","aspx");
根据黑名单列表可以看出,服务器不允许上传攻击中常用的php、htaccess、asp、aspx
等脚本文件,也就是说这些文件都会被服务端所拦截,不能上传成功。
下面开始实验
点击它后,我们看到了网站的首页,看到如下画面
我们看到下方显示了允许上传的类型,可以猜测,这应该是一个白名单验证,系统只允许列出的文件后缀进行上传。
首先我们在桌面上找到一个后缀名为.png
的图片,然后我们点击浏览,选择创建好的3.png,然后点击提交。
然后,我们在桌面创建一个php文件,测试是否能上传成功。
在php文件里写入如下内容,并命名为1.php
//post会把123当做参数进行传递,eval会执行后面的语句。
eval在php中会将字符串当做代码来执行, 而post的意思是使用post的方式进行传递参数。
一句话木马,顾名思义,它的体积很小,只由一句php代码构成。
点击浏览,选择创建好的1.php,然后点击提交
可以看到提示:错误的文件类型,也就是只可以上传它白名单内的内容,如果上传白名单外的东西,会被系统拒绝。
因为在白名单列表中有jpg格式,因此在我们再将它的后缀名改为jpg,命名为123.jpg,查看是否能成功。
可以看到,改为jpg可以上传成功。
虽然jpg文件上传成功,但它其中的php代码并不能执行成功,使用中国菜刀也不会连接成功的。
因为jpg是图片格式,不能解析其中的php代码,要想解析php代码,后缀必须为php或者其他可以解析php代码的格式。
- 提示:这个时候我们就需要对其进行绕过,服务器会检测我们所上传的后缀是否在白名单内,如果不在的话就禁止上传。
我们利用htaccess来绕过上传检测,我们创建一个后缀名为.htaccess
的文件,文件内容为AddType application/x-httpd-php .jpg
这句话的意思是让Apache服务器识别并解析后缀名.jpg
的文件名。
- 提示:上传成功到服务器的.htaccess文件里的代码可以让 .jpg后缀名文件格式的文件名以 php格式解析 所以我们把PHP脚本木马文件的后缀名改为.jpg格式,让.htaccess文件解析PHP脚本木马文件里的php代码 ,使木马上传成功。
我们开始上传1.htaccess
文件,我们查看结果。
我们找到了flag值,我们把.htaccess
文件里的代码上传到服务器后,我们把php脚本木马文件从.php
修改成.jpg
格式,让.htaccess
文件解析php脚本,则木马成功。
在本次试验中,我们尝试多种方法对其进行绕过。
我们再次上传了jpg文件,虽然上传成功但并没有用处,因为Apache把它解析成图片了
首先我们直接上传了php文件,因为白名单中没有php后缀的格式,拒绝上传,因此失败了
接下来上传了htaccess文件,这个上传成功了,爆出了falg值。
因此我们得出结论,需要成功的执行代码,需要两个条件:
上传文件后缀必须要在网站白名单之内,否则无法上传。
上传文件后缀必须是Apache无法识别的后缀。
只有最后一个满足了这两点,因此一句话木马才能上传成功。
因为本实验仅作为测试用,无法连接中国菜刀,在真实的环境中,我们可以将上传木马的地址复制到菜刀里连接,这样就拿到了网站的Shell(具体操作步骤敬请关注本平台的其他相关课程)。