为何ASP.NET MVC 5中SQL Server注入无效?如何实现登录密码注入?
关于ASP.NET(Web Forms)中SQL注入失效及模拟注入的问题解答
先纠正个小细节:你贴的代码其实是ASP.NET Web Forms的实现,不是MVC5的哦,不过这不影响咱们分析SQL注入的核心问题~
问题1:为什么你觉得SQL注入无法生效?
其实你的这段代码存在严重的SQL注入风险,只是可能你用的payload不对,或者没注意到一些细节:
- Payload格式/优先级错误:SQL里
AND的优先级比OR高,如果直接输入' OR 1=1,拼接后的SQL会变成:
这时候select * from tblstudent where Email='' OR 1=1and Password='xxx'1=1and Password='xxx'会被当成一个整体,条件不一定成立。得用注释符把后面的密码部分彻底注释掉,比如payload写成' OR 1=1--(注意--后面要有空格,确保后面的'and Password='xxx'被完全注释)。 - 数据表无数据:如果
tblstudent表是空的,那不管怎么注入,dt.Rows.Count都会是0,自然不会触发登录跳转。 - 隐式编码的干扰:ASP.NET有时候会对控件输入做隐式HTML编码,但这种编码不会影响单引号,只要payload正确还是能生效。
问题2:如何在你的项目中模拟SQL注入?
如果是为了测试安全性、验证注入风险,按以下步骤就能成功:
1. 登录绕过Payload(基础版)
直接用这个payload测试:
- 用户名输入框填:
' OR 1=1--(单引号+空格+OR+1=1+--+空格) - 密码随便填,比如
123456
拼接后的SQL语句会变成:
select * from tblstudent where Email='' OR 1=1-- 'and Password='123456'
--会注释掉后面所有内容,OR 1=1让查询条件永远为真,只要tblstudent表里有数据,就会返回结果,从而绕过登录跳转到index.aspx。
2. 联合查询获取敏感数据(进阶版)
如果想看到注入的更严重危害,比如获取所有用户的密码,可以用联合查询payload(假设你的tblstudent表有Id、Email、Password三个字段):
- 用户名输入:
' UNION SELECT Id, Email, Password FROM tblstudent-- - 密码随便填
拼接后的SQL会返回原表的所有用户数据,虽然你的代码只判断行数,但如果后续有展示数据的逻辑,就能看到所有用户的敏感信息。
重要提醒:实际项目必须用参数化查询!
虽然你现在想模拟注入,但真实项目里绝对不能用字符串拼接的写法,必须用参数化查询彻底避免SQL注入。修改后的安全代码如下:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { // 使用using自动释放连接,避免资源泄漏 using(SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-G9SO8KA;Initial Catalog=coolege;Integrated Security=True")) { string qry = "select * from tblstudent where Email=@Email and Password=@Password"; SqlCommand cmd = new SqlCommand(qry, con); // 添加参数,用户输入会被当作参数值,而非SQL语句的一部分 cmd.Parameters.AddWithValue("@Email", Login1.UserName); cmd.Parameters.AddWithValue("@Password", Login1.Password); SqlDataAdapter adpt = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adpt.Fill(dt); if (dt.Rows.Count >= 1) { Response.Redirect("index.aspx"); } } }
参数化查询会把用户输入和SQL语句分开解析,从根源上杜绝了SQL注入的可能。
内容的提问来源于stack exchange,提问作者Yash Pastagiya
相关产品推荐
相关产品推荐

