数据库:一个Uid对应一个Upwd和一个Uname(目前只有两个账户)
一个老同事调戏菜鸟,在登陆界面的密码框里输入了一些不知道什么的东东(密码框有限制20个字符以内),然后我的网页就悲剧了,两个账户的Uname变成了同一个,求解释,求解决办法?
ps:登陆界面的sql语句:
String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
rs=st.executeQuery(sql);
if(rs.next()){
session.setAttribute("u_name",rs.getString("Uname"));
}
一个老同事调戏菜鸟,在登陆界面的密码框里输入了一些不知道什么的东东(密码框有限制20个字符以内),然后我的网页就悲剧了,两个账户的Uname变成了同一个,求解释,求解决办法?
ps:登陆界面的sql语句:
String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
rs=st.executeQuery(sql);
if(rs.next()){
session.setAttribute("u_name",rs.getString("Uname"));
}
你可以直接在密码框里输入' or 'a'='a 试试 结果肯定是你看到的那种用户名是一个
所以 不要用拼接 用?代替传入参数 然后用setstring什么的赋值
" Uid='"+username+"' " 这个应该是有错的, 是写错了, 还是写错了!!
session的会话周期看看, 如果没错的话, 应该是在同一浏览器中打开两个链接。 第一次的session值被覆盖了。
还想弱弱地问一句,能不能注入回来?
还想弱弱地问一句,能不能注入回来?
sql注入不会改变源码 只会改动数据库中的数据
既然只有两个用户你手动改下数据库中的数据就好了..
还想弱弱地问一句,能不能注入回来?
sql注入不会改变源码 只会改动数据库中的数据
既然只有两个用户你手动改下数据库中的数据就好了..
我查看了数据库,数据库的数据并没有任何更改?
还有注入之后能查出所有的用户信息 因为取第一条 所以所有的用户都是查出来的第一个 和数据库里面数据没有关系的 不会去改变的
还想弱弱地问一句,能不能注入回来?
sql注入不会改变源码 只会改动数据库中的数据
既然只有两个用户你手动改下数据库中的数据就好了..
我查看了数据库,数据库的数据并没有任何更改?
Uid和Uname都没变动么?
还想弱弱地问一句,能不能注入回来?
sql注入不会改变源码 只会改动数据库中的数据
既然只有两个用户你手动改下数据库中的数据就好了..
我查看了数据库,数据库的数据并没有任何更改?
Uid和Uname都没变动么?
嗯,没有任何改变
Thank you very much!
找到错误原因,就是sql注入问题。
我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
问完了告诉我一下啊...
//登录用户名是test1
String username = "test1";
//注入攻击 密码是 ' or 'a' ='a
String password = "' or 'a' ='a";
String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
//最后执行的sql应该就是 select * from userinfo where Uid='test1' and Upwd='' or 'a'='a' 执行这个查询的sql因为有 or 'a'='a' 这个永远为真的命题存在
//那么其实这个sql就等价于 select * from userinfo 查出所有记录 假设查出的记录是test2在第一个 那么程序中拿到第一条记录里面的就是用户名是test2的记录
//所以 不管你如何去写用户名 只要密码是那个那么拼出的sql就是等价于select * from userinfo 那么拿出的值也一直是第一条记录也就是test2
//所以和数据库里改数据是没有任何关系的 只是查询的时候一直取的第一条 那种让你看到变成一个用户只是一种错觉
你的sql不应该用字符串拼接的方式。
你这用写法在用户名和密码框里加上 or 1=1就进去了
//登录用户名是test1
String username = "test1";
//注入攻击 密码是 ' or 'a' ='a
String password = "' or 'a' ='a";
String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
//最后执行的sql应该就是 select * from userinfo where Uid='test1' and Upwd='' or 'a'='a' 执行这个查询的sql因为有 or 'a'='a' 这个永远为真的命题存在
//那么其实这个sql就等价于 select * from userinfo 查出所有记录 假设查出的记录是test2在第一个 那么程序中拿到第一条记录里面的就是用户名是test2的记录
//所以 不管你如何去写用户名 只要密码是那个那么拼出的sql就是等价于select * from userinfo 那么拿出的值也一直是第一条记录也就是test2
//所以和数据库里改数据是没有任何关系的 只是查询的时候一直取的第一条 那种让你看到变成一个用户只是一种错觉
0.0 涨姿势了....
不过LZ说重登陆也不行..难道LZ不是重新输入密码么?
我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
问完了告诉我一下啊...
应该28楼是正解,老同事只提醒我注意单引号问题
我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
问完了告诉我一下啊...
应该28楼是正解,老同事只提醒我注意单引号问题纳尼...你重登陆的时候只改动用户名 密码还是你老同事输入的密码么??还是用浏览器保存密码了..