题目:

南邮 SQL注入1 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

点开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抓包即可得到结果,参考题解,不过网上还有另一种做法:

南邮 SQL注入1 随笔 第2张

题目要求输入user,password,我们要避开密码的验证,可以构造语句,在输入user的时候把后面的password用#注释掉。

南邮 SQL注入1 随笔 第3张

输入 admin‘)# 

因为后面的语句被#注释了,要把源码原来的补上。

这里flag就拿到了

南邮 SQL注入1 随笔 第4张

 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() 函数移除字符串两侧的空白字符或其他预定义字符。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄