RCE奇技淫巧:1、参数值长度限制2、长度限制+不能有字母数字

9 篇文章 0 订阅
4 篇文章 0 订阅

奇技淫巧

一、首先打破长度限制

有以下三种方法:

001、用多个参数来实现分段写

当我们的url中id参数长度被被限制了,那么我们可以采用将需要执行的代码进行分开再合拢

后端:eval($_get[id]) ,id长度被限制

前端:?id=echo `$_get[1]`&1=whoami

注意千万不能这样写:?id=`$_get[1]`&1=echo whoami

因为这样的真实还原是:$_get[1]=`"echo whoami"`;地址栏传递值会自动加上双引号

002、先要执行的一句话代码写入一个文件1,再用文件1包含这个文件2;

访问文件1,就执行文件1的include,就将文件2包含进来了,文件2就也会被执行,文件2执行就是解码,解码后是eval执行语句,然后就还会执行文件2解码后的eval()内容

eval($_get[parm])

先将base64编码后的eval内容写入N这个文件;(PD...等值就是eval转码之后的内容)

然后在下面再去把所有参数传给eval($_get[parm]),然后eval一执行就会执行include,include一执行就会把get[1]当成一个php文件包含进该文件中,因为你访问了该文件,所以包含进来的文件也会被执行,而包含进来的文件就是对N文件中的内容再解码回去,解码回去又是一个eval()的执行函数,所以访问包含进来的文件时,也会执行eval,执行eval时,eval就会执行里面的php代码

---之所以要先转码再解码是因为,file_put_contents是不能写特殊符号的;

003、回调函数usort,这个函数其实是用来给数组排序的,参数1是数组,参数2是排序规则的函数;因此我们的数组肯定是会被usort放进排序规则函数中去执行的;因此我们也可以把这个usot当成一个回调函数;

---当a,b();abc(a,b);当abc可以将a放入b函数中,那么这个abc()就可以称之为回调函数

eval($_get[parm])

从上面看出,我们的parm参数没有呀,那么我们这个参数应该在哪里写?

这个usort方法我们使用post请求来实现

这里第三种跟第一种有点像

注意post请求的content-type和id(parm)=usort(...$GET);必须要空一行;最后记得eval是需要有分号的;

...$_GET是代表接收多个参数;其中这里应该是数组参数,一个是普通参数

参数长度限制+不能有大小写字母+数字

我去,这还玩个屁呀,前面长度限制我还有的搞,大不了将parm参数的值写成接收$_GET[1],然后参数1才是接收真正的代码嘛;

但是这个直接就是不能有字母,那我参数值里面不能有字母还玩个屁啊;

NONONO!!

首先我们要明确一点,这个过滤规则只是针对接收的parm变量,不会针对其他任何东西

因此上面我们既然可以将参数parm写成$_get[1],然后去接收1的值,就是将代码转义,我去接收存放代码的那个变量;

那么我们是不是也可以将代码写入一个脚本文件中,然后去执行那个脚本文件即可;

哈哈哈,现在有思路啦;

这里说一嘴,既然我们是将代码写入脚本文件中,那么我们何不直接去将该代码写入临时文件中呢,这样我们运行完了脚本中的程序之后,临时文件还能自动删除,这岂不是还能增加安全性吗;

实现步骤:

1、首先,我们需要考虑的就是怎样将代码写入临时文件中,临时文件的内容是你提交的内容中的一些基本信息;如果我们提交的是一个文本文件,那么文本文件的内容也会写入临时文件中;因此我们可以通过在文本文件中写入一串脚本;然后在通过post提交这个脚本文件的时候系统就会自动就其脚本文件内的内容写入临时文件中;

好,因此我们需要在本地写一个脚本文件,方便临时文件的内容自动写入

2、脚本文件的写入:我们的脚本文件的内容是会写入临时文件中的,后面我们的临时文件也是需要去被执行的,那么执行的方式应该是什么?就是系统在执行这个脚本文件的时候应该把他成是什么脚本语言去执行?

因为真实环境中的服务器通常是部署在Linux下的,所以我们这里就应该写Linux的脚本文件,因此确定是写Linux的shell的话,那么我们的开头就应该是

#!/bin/bash

Linux的具体命令----

3、好,临时文件的内容可以被确定了之后,接下来就是考虑怎么去执行这个临时文件了,就是说怎么让系统用Linux的方式去执行这个Linux 的shell脚本;

---我们Linux的脚本执行方式的其中一种:引号

我们用反引号括起来的文件都会被当成Linux文件去执行;

4、欧克欧克,到达最后一步了:我们怎么去选中这个临时文件:

使用glob路径匹配符

POST /web.php?code=?><?=`.+/???/????????[@-[]`;?> HTTP/1.1 //大多数临时文件的格式

这里的[@-[]代表匹配一个大写字符

就这样,我将glob匹配放入eval中后,eval就会执行这个匹配,然后就会匹配到对应的临时文件;

注意:系统不会把这个当成正则表达式,

因为正则表达式是必须在类似于这种函数里面的:pre_match()

流程简解:1、创建文本文件,存放代码,用于临时文件创建   1-2点↑

2、执行该临时文件,`反引号`     3点↑

3、匹配临时文件 4点↑

补充小知识点:

1、Linux中:ps -ef 和netstat的区别

netstat是查看网络状态的命令,包括监听的端口号(-l);

ps -ef 是查看当前的所有进程,包括端口号

2、注意:只能一个提交表单,一个用于访问,因为提交表单的时候, 你访问的是html文件;所以你的shell脚本是写在用于访问的那个数据包里面的,且为了生成临时文件,需要将用于访问的get访问模式修改成post访问模式;只有post访问才能生成临时文件;

既然你是post传参,肯定除开修改post请求模式以外,还需要添加post请求模式中 必要的值;但是不需要删除开始的值,因为后端验证是通过获取一个一个字段来验证的,所以你不删除的字段他也不会获取,所以不需要删除多余的;

--需要添加的部分:

注意,这个执行命令是添加在.txt文件中

执行过程:首先访问php,然后php获取参数,然后执行php代码,php代码在执行的时候,会因为反引号,就会直接将该反引号的东西当成Linux命令执行;跟system/exec执行命令一样;

而这个命令就是:执行匹配上的临时文件,临时文件里面的内容就是这个请求头中从上传文件中取出来的内容

3、tmp注意必须要有执行权限,不然Linux系统不能为其创建临时文件;且必须是post请求

---------------------------------我们只讲思路,不讲详细过程;

                                          过程是背,思路是理解;

                                           想要走多远,10%背+90%理解

祝你年薪百万,成绩辉煌!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值