南邮 SQL注入1
题目:

点开source:
<html>
<head>
Secure Web Login
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {//如果上传两个变量user pass 则继续执行if下面的代码
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);//链接sae的mysql数据库
mysql_select_db(SAE_MYSQL_DB);//选择要修改的数据表
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));//去掉上传的user pass前后的空格,并对pass进行MD5加密
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";//从特定的表中取出user并复制给$sql
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));//对$sql进行查询,并将结果数组化,并赋值给$query
if($query[user]=="admin") { //满足条件就会输出flag
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
<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.phps">Source</a>
</html>
用brupsuit抓包即可得到结果,参考题解,不过网上还有另一种做法:
题目要求输入user,password,我们要避开密码的验证,可以构造语句,在输入user的时候把后面的password用#注释掉。
输入 admin‘)#
因为后面的语句被#注释了,要把源码原来的补上。
这里flag就拿到了
if($query[user]=="admin") { //满足条件就会输出flag
echo "<p>Logged in! flag:******************** </p>";//说明 user 要为 admin ,所以要想办法避免密码的验证
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
我们通过审计发现注入点 在(user='".$user."')做手脚,
在Username处输入 admin')#
在这里
' 起到连接前面的 ' 的作用,
)起到封闭前面的(作用,
#用来注释后面内容,使得代码运行时只判断admin
所以我们提交的时候可以简单地认为(虽然不规范,但是好理解)$sql="select user from ctf where (user='admin')#') and (pw='".$pass."')";#后边的变成了注释,不执行;只剩下$sql="select user from ctf where (user='admin'),所以不会判断密码正确与否。
然后就可以都得到flag了。
--------------------------------------------------
--------------------------------------------------
总结:这道题的代码虽然偏长,但我们不需要全部都懂;在此题中,当你提交用户名、密码之后,就开始执行代码(可以这样理解吧?)
知识点:php的阅读、理解
# 的巧妙使用
trim() 函数移除字符串两侧的空白字符或其他预定义字符。

浙公网安备 33010602011771号