WgpSec(狼组安全) CTF PHPCode题目记录

PHPCode


strcmp

题目描述

 <?php
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['a'])) {
    if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
        //比较两个字符串(区分大小写)
        die('Flag: '.$flag);
    else
        print 'No';
}
?> 

首先引入flag.php文件,$_GET 是通过 URL 参数传递到当前脚本的变量数组,所以直接在url上可以写入。看判断如果变量不为空,所以可以尝试定义 a 的值。

重点来了,strcmp()函数是比较两个 字符串 的大小。

语法:

strcmp(str1,str2)

返回值:

  • 0 - 如果两个字符串相等
  • <0 - 如果 str1 小于 str2
  • >0 - 如果 str1 大于 str2

 但是正因为strcmp函数只能比较字符串,而且是 规定 字符串,所以我们可以直接把a当作数组来比较,但是他可以把数组的某个元素单独进行比较,所以我们直接 ?a[]=  他检测到是数组,返回值为0,从而得出flag。


md5

题目描述

<?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['username']) and isset($_GET['password'])) {
    if ($_GET['username'] == $_GET['password'])
        print 'Your password can not be your username.';
    else if (md5($_GET['username']) === md5($_GET['password']))
        die('Flag: '.$flag);
    else
        print 'Invalid password';
}
?> 

首先开头 error_reporting(0) 表示关闭错误报告,如果 username 和 password 同时不为空,且如果 username 和 password 相等 会输出 Your password can not be your username. 不然如果 md5加密 username 和 password 完全相同,则输出 flag 结束。

我第一个想到的是md5加密后的前几位相同,因为在php中0e会被当做科学计数法,就算后面有字母,其结果也都是0,所以if判断结果使true。

QNKCDZO

0e830400451993494058024219903391

240610708

0e462097431906509019562988736854

结果试了  ?username=QNKCDZO&password=240610708   之后行不通

又想到md5加密数组之后返回值为“false”,所以直接构建 ?username[]=0&password[]=2 ,从而得出flag。


sha

题目描述

<?php
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['name']) and isset($_GET['password'])){
    var_dump($_GET['name']);
    echo " ";
    var_dump($_GET['password']);
    var_dump(sha1($_GET['name']));
    var_dump(sha1($_GET['password']));
    if ($_GET['name'] == $_GET['password'])
        echo 'Your password can not be your name!';
    else if (sha1($_GET['name']) === sha1($_GET['password']))
        die('Flag: '.$flag);
    else
        echo 'Invalid password.';
}
else
    echo 'Login first!';
?>

首先如果name和password相等,var_dump() 是返回数据的类型,重要的在下面如果sha1加密后name 完全等于 sha1加密后password 则返回flag。

这里sha1加密和md5一样也是不能直接加密数组,所以同理 ?name[]=0&password[]=1,从而得出flag。


hash

题目描述

<?php
error_reporting(0);
include("flag.php");
$hashed_key = 'd1ae9ee95ff52b64fae95e565d57fb3943de636df77f77b96fb2290338aa11b2';
$parsed = parse_url($_SERVER['REQUEST_URI']);
if(isset($parsed["query"])){
    $query = $parsed["query"];
    $parsed_query = parse_str($query);
    if($parsed_query!=NULL){
        $action = $parsed_query['action'];
    }

    if($action === "auth"){
        $key = $_GET["key"];
        $hashed_input = hash('sha256', $key);
        if($hashed_input !== $hashed_key){
            die("no");
        }

        echo $flag;
    }
}else{
    highlight_file(__FILE__);
}?>

首先这题要了解parse_url()函数和parse_url函数

parse_url()函数会解析一个URL并返回一个关联数组,包含在URL中出现的各个组成部分

parse_str()函数如果值为URL传递入的查询字符串,则会将他解析为变量

例如:

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
$parsed = parse_url($url);    //解析为关联数组
print_r($parsed);
echo "<br>";
$query = $parsed["query"];    //输出数组中对象
print($query);
echo "<br>";
var_dump($query);
$parsed_query = parse_str($query);    //解析为字符串
echo "<br>";
var_dump($parsed_query);
echo "<br>";
$action = $parsed_query['action'];
var_dump($action);
?>

输出结果为:

Array ( [scheme] => http [host] => hostname [user] => username [pass] => password [path] => /path [query] => arg=value [fragment] => anchor )
arg=value
string(9) "arg=value"
NULL
NULL

但是在parse_url()解析后提交的parse_str解析,这里通过query提交覆盖了parse_str变量,如果$hashed_input!==&hashed_key,则输出flag,不过在这里我们可以用 $hashed_input 覆盖 $hashed_key ,所以随便传入key的值为c,构建url,从而的出flag。

?query=&hashed_key=2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6&action=auth&key=c


md5equal

题目描述

<?php
include("flag.php");
highlight_file(__FILE__);
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
    if ($a != 'QNKCDZO' && $md51 == $md52) {
        echo $flag;
    } else {
        echo "false!!!";
    }
}
else{echo "please input a";}
?> please input a

首先这里@_GET['a'],@在这检查值是否为空,防止没有$_GET出现报错,但是代价高,一般用isset()来判断。

他说如果 $a != 'QNKCDZO' 与 $md51 == $md52 同时成立就输出flag,这里就用到了上面讲的,md5加密后的前几位相同,因为在php中0e会被当做科学计数法,就算后面有字母,其结果也都是0,所以if判断结果使true。所以?a=240610708,从而得出flag。

0e开头的md5和原值:


QNKCDZO
0e830400451993494058024219903391


240610708
0e462097431906509019562988736854


s878926199a
0e545993274517709034328855841020


s155964671a
0e342768416822451524974117254469 

......


以上纯属个人做法,如有不同观点,请多多留言交流

题目来自于WgpSec CTF(狼族安全团队CTF)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值