用户
搜索
  • TA的每日心情
    擦汗
    2018-4-12 11:08
  • 签到天数: 80 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋-核心白帽

    Rank: 4

    36

    主题

    217

    帖子

    381

    魔法币
    收听
    0
    粉丝
    5
    注册时间
    2017-5-9

    限定版春秋段子手i春秋签约作者

    发表于 2017-10-31 18:13:04 2421884
    详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等)
    作者是namezz
    (看完图相当于做了一轮实验系列)
    现有文件代码如下
    1.png
    2.png
    3.png
    4.png
    include和include_once、require、require_once用处差不多,故只举include例说明。话不多说,开始正文。(正文太啰嗦了,直接看总结吧)
    功能说明
    分别包含aaa和zzz,效果如下图所示
    5.png
    6.png
    读取到zzz文件的内容<?phpecho __FILE__;并解析执行了,而aaa文件识别不为php,故直接输出源码内容。故包含/etc/passwd同理
    7.png
    用readfile读文件如图所示
    8.png
    9.png
    10.png
    由于加了图片头header,所以浏览器识别为图片类型。f12或抓包能看到响应包情况,能看到与include等不同的是,readfile是直接读文件内容,而不解析的。file_get_content同理(用法自行百度)。
    原理说明:文件包含究竟包含了啥
    首先,include函数和readfile函数都是先读取指定的内容(注意,这里是指定的内容而不是文件的内容,后面解释),而include函数会试图解析读取的内容,是否为php代码,如若是则执行,否则直接输出
    如图所示,使用file协议、http协议、php协议(官方文档:http://php.net/manual/zh/wrappers.php)效果分别如下
           11.png
    12.png
    13.png
    因为默认配置是没开allow_url_include的,所以使用http协议读文件会失败(开了就是远程包含,后面会说)
    以上使用file协议和php协议都读到了文件的源码,并执行了
    在使用php://filter/read=convert.base64-encode/php://filter/string.rot13/对读取的内容进行编码看看
    14.png
    15.png
    16.png
    这里由于<?php经rot13后转为<?cuc直接输出给浏览器,而浏览器不认识<?cuc标签,所以也没显示出来,但是查看源码也是能看到的
    发现,同样是php协议,读取了文件的内容,但是使用了base64或者rot13对内容进行编码,直接输出了,直接读到了zzz的源码,
    17.png
    读其他页面源码也是同理。还有需要一提的是这里不要直接包含i.php,因为用的是include而不是incloude_once,会无限包含调用自身,导致死循环(要理解递归,必先理解递归)。
    还是看不懂,不知道包含了啥?
    可以理解为包含了一个数据流
    如readfile('zzz')或include('zzz')打开一个数据流,内容为zzz文件的内容,而include('php://filter/read=convert.base64-encode/resource=zzz')为打开一个数据流,内容为zzz文件的base64编码内容,所以我这里有一个文件,内容为<?phpphpinfo();的base64编码,
    18.png
    再用php://filter/read=convert.base64-decode/resource=p.php去包含它,可以发现是执行了的
    19.png
    allow_url_fopenallow_url_include对文件包含的影响
    首先,看字面意思,allow_url_fopen是允许来自url的fopen,allow_url_include是允许来自url的include。下面用几个例子来说明一下
    r.php?a=http://127.0.0.1/zzz
    r.php?a=data:text/plain,qweraaa
    r.php?a=data:text/plain;base64,cXdlcmFhYQ==
    r.php?a=php://input
    20.png 21.png

    22.png
    接下来把allow_url_fopen关了再试一下
    23.png
    修改php.ini然后重启httpd服务
    24.png
    25.png
    发现failed了,但是php://input这个是不受allow_url_fopen影响的,关了也能读到post数据。
    而allow_url_include,字面意思,控制include类函数能引用的数据流来源,是否允许直接包含来自url获取的数据流,只要开了的话就能直接远程包含getshell,举例说明如下
    i.php?a=zzz
    i.php?a=file:///var/www/html/zzz
    i.php?a=php://filter/read=/resource=zzz
    i.php?a=http://127.0.0.1/zzz
    i.php?a=php://input
    i.php?a=data:text/plain,<?phpsystem('date');?>
    i.php?a=data:text/plain;base64,PD9waHAgc3lzdGVtKCdkYXRlJyk7Pz4=
    关闭allow_url_include的情况下,除了前三个是本地包含,后面的都走远程包含的全都报错,如图所示
    26.png
    打开allow_url_include后远程包含就行了,至此可以直接包含shell了
    27.png
    28.png
    29.png
    这里的__FILE__输出了http://127.0.0.1/zzz
    30.png
    图片马以及使用php协议绕过过滤进而getshell1、存在本地文件包含且只允许上传图片文件
    这是一个图片
    31.png
    打开后长这样
    32.png
    包含它,是乱码
    33.png
    在理解文件包含原理后,往图片添加php代码
    34.png
    打开图片,还是长这样,没变化
    35.png
    不过源码已经带了php代码
    36.png
    包含图片
    37.png
    php代码已经被执行了。
    2、存在本地文件包含且只允许上传图片文件且校验包含文件后缀是否为php
    代码示例如下:
    $f=$_GET[f];
    if ( isset( $f )&&strtolower( substr( $f, -4 ) ) == ".php" )
            {   
    require( $f );
            }
    使用zip或者phar协议
    新建shell文件
    38.png
    压缩为zip
    39.png
    重命名为jpg
    40.png
    41.png
    然后上传
    打开当然显示图片损坏
    42.png
    43.png
    然后使用phar协议或zip协议包含
    44.png
    45.png
    本地文件包含利用之一:包含日志文件getshell
    这是一个空的日志文件
    46.png
    访问http://192.168.43.101/?=<?php phpinfo();?>
    47.png
    当然是404,但是在日志里面已经记录了这个请求了
    48.png
    不过发现get请求的uri是经过url编码的,这样是不能被识别为php代码解析执行的。我们修改ua为<?phpphpinfo();?>再次访问
    49.png
    50.png
    好的ua这里日志记录进去了,接下来包含日志就能执行php代码了
    51.png
    注意,这里有的默认配置日志文件夹仅允许root可读写,httpd默认用户apache是没权限的,会报错failed to open streamermission denied
    总结
    file_get_content、readfile类函数先读取对象的数据流,从文件或者php协议或者file协议或者http协议等读取数据流,而include、require类函数读取数据流后尝试对其进行解析与执行。故可以对数据流进行编码包含输出,导致读取源码或者任意文件下载,还可以花式编码解码绕过waf。
    zzz、php://filter/read=/resource=zzz、http://127.0.0.1/zzz、file:///var/www/html/zzz、phar://s.jpg/s.php、zip://s.jpg%23s.php的数据流内容为对应的php代码,包含以上数据流就相当于包含对应php代码,相应协议的具体用法自行百度。
    图片马本质是包含解析执行图片里面的php语句。
    包含日志文件getshell原理一样,利用httpd日志记录访问情况,控制其中ua字段(由于uri字段会被编码,导致不被识别为php代码),再包含日志实际上也是包含对应的php代码。
    so文件包含的目的是直接包含精心构造的恶意php代码,进而直接任意命令执行,当然如果能够直接上传.php文件并解析执行那就更好了,不用绕弯子绕文件包含那么麻烦。然而事情总不会是一帆风顺,在无法直接命令执行的时候(例如无法上传文件,不给上传恶意php代码等),就用文件包含去读源码,读配置文件,万一就找到其他地方存在漏洞了。
    LFI(本地文件包含)和RFI(远程文件包含)的区别就在于allow_url_include的设置。allow_url_include=1基本就可以为所欲为了。
    一些多余的东西
    data:,<文本数据>
    data:text/plain,<文本数据>
    data:text/html,<HTML代码>
    data:text/html;base64,<base64编码的HTML代码>
    data:text/css,<CSS代码>
    data:text/css;base64,<base64编码的CSS代码>
    data:text/javascript,<Javascript代码>
    <scriptsrc="data:text/javascript,alert('hello')"/>
    data:text/javascript;base64,<base64编码的Javascript代码>
    data:image/gif;base64,base64编码的gif图片数据
    扫码投喂作者,打多打少是个缘
    <imgsrc="data:image/png;base64,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"height="80" width="80"/>
    data:image/png;base64,base64编码的png图片数据
    data:image/jpeg;base64,base64编码的jpeg图片数据
    data:image/x-icon;base64,base64编码的icon图片数据
    data:text/html,<html><body><p><b>Hello,world!</b></p></body></html>
    -------------------------------------------------------------------------------------------------------
    发个小福利
    在前30评论中抽一个带入门,传授多年学习(装x)经验,妹子优先,会卖萌会撒娇会嘤嘤嘤者更佳
    -------------------------------------------------------------------------------------------------------

    评分

    参与人数 1魔法币 +1 收起 理由
    你为谁蓄起长发 + 1 作者说扫描文章中二维码可以加作者好友.

    查看全部评分

    本帖被以下淘专辑推荐:

    发表于 2017-11-8 11:22:57
    既然你都这么说了:
    我就附上一个姿势。
    其实可以通过php input流来进行反向shell
    getshell啥的都省了。
    使用道具 举报 回复
    发表于 2017-11-1 11:32:03
    先收藏了,再慢慢看看,楼主幸苦了!另外传授经验是不是真的啊,楼主
    使用道具 举报 回复
    总感觉每回看文章时,自己就像一只看这夜晚星空的

    评分

    参与人数 1魔法币 +1 收起 理由
    你为谁蓄起长发 + 1 中奖了 说下你的愿望吧

    查看全部评分

    no pain no gain
    使用道具 举报 回复
    - -好像被教一下学习 一直想了解PHP的感觉入门有点难
    使用道具 举报 回复
    学习了  我就是冲最后一句来的
    使用道具 举报 回复
    虽然并没有看懂,但是幸苦dalao了。。。
    使用道具 举报 回复
    求源码 可以自己搭建练习一下
    使用道具 举报 回复
    我是6楼,冲最后一句话来
    使用道具 举报 回复
    很全,学习了
    使用道具 举报 回复
    发表于 2017-11-1 14:40:57
    我是7楼,等一个天亮了
    使用道具 举报 回复
    发表于 2017-11-1 15:48:36
    嘻嘻嘻 楼主辛苦 学习了
    使用道具 举报 回复
    发表于 2017-11-1 18:53:12
    坐等楼主收徒
    使用道具 举报 回复
    发表于 2017-11-1 20:24:22
    ok,hen  ok
    使用道具 举报 回复
    发表于 2017-11-1 23:40:03
    使用道具 举报 回复
    求大佬带装逼
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册