南邮 SQL注入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抓包即可得到结果,参考题解,不过网上还有另一种做法:
题目要求输入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')#
在这里
所以我们提交的时候可以简单地认为(虽然不规范,但是好理解)$sql="select user from ctf where (user='admin')#') and (pw='".$pass."')";#后边的变成了注释,不执行;只剩下$sql="select user from ctf where (user='admin'),所以不会判断密码正确与否。 然后就可以都得到flag了。' 起到连接前面的 ' 的作用,
)起到封闭前面的(作用,
#用来注释后面内容,使得代码运行时只判断admin
-------------------------------------------------- 总结:这道题的代码虽然偏长,但我们不需要全部都懂;在此题中,当你提交用户名、密码之后,就开始执行代码(可以这样理解吧?) 知识点:php的阅读、理解 # 的巧妙使用 trim() 函数移除字符串两侧的空白字符或其他预定义字符。

更多精彩