SQL注入的简单案例
文章目录
- 什么是SQL注入
- 使用数据库客户端工具查询用户表
- 访问ERP系统(对密码输入框进行SQL注入)
- SQL注入的原理
- 解决方案
- 重新注册一个管理员账号
- 使用sys账号登录ERP系统(输入正确的密码)
- 使用sys账号登录ERP系统(对密码输入框进行SQL注入)
- UserDAO类的完整代码
什么是SQL注入
SQL注入是现在普通使用的一种攻击手段,就是通过把非法的SQL命令插入到Web表单中或页面请求查询字符串中,最终达到欺骗服务器执行恶意的SQL语句的目的。SQL注入一旦成功,轻则直接绕开服务器验证,直接登录成功,重则将服务器端数据库中的内容一览无余,更有甚者,直接篡改数据库内容等。
使用数据库客户端工具查询用户表
该表中有1个用户,账号为admin,明文密码为123456
访问ERP系统(对密码输入框进行SQL注入)
1)用户名输入:随便输
2)密码输入:’ OR ‘1’='1
3)发现可以登录进来
SQL注入的原理
密码验证的接口根据输入的用户名和密码查询数据表,如果查到用户记录的话,则认证通过。
代码如下:
public boolean auth(String userName,String password) throws Exception{Connection conn = null;try {conn = DBUtil.getConnection();Statement state = conn.createStatement();//String sql = "SELECT * " +"FROM t_user "+"WHERE username='"+userName+"' " +"AND pwd='"+password+"'";/** 密码输入:* ' OR '1'='1* sql注入攻击* */System.out.println(sql);ResultSet rs = state.executeQuery(sql);//if(rs.next()){return true;}} catch (Exception e) {e.printStackTrace();} finally{if(conn != null){DBUtil.close(conn);}}return false;}
实际执行的sql语句如下:
SELECT * FROM t_user WHERE username='1qwerwterrt' AND pwd='' OR '1'='1';
因为’1’='1’永远成立,导致能够查询到所有的用户,所以登录认证通过。
解决方案
修改UserDAO类(使用shiro框架对输入的密码进行加密,然后再对数据库进行操作),具体步骤如下:
1)修改用户注册的接口
修改后,代码如下:
/*** 增加用户信息(注册时用)* @param u* @throws Exception*/public void save(User u)throws Exception{//设置盐巴String salt = new SecureRandomNumberGenerator().nextBytes().toString();//设置撒多少次盐巴int times = 2;//生成密文String encodedPassword = new SimpleHash("md5",u.getPwd(),salt,times).toString();Connection con = null;PreparedStatement pst = null;try{con = DBUtil.getConnection();pst = con.prepareStatement("insert into t_user(username,pwd,realname,gender,salt) values (?,?,?,?,?)");pst.setString(1,u.getUsername());pst.setString(2,encodedPassword);pst.setString(3,u.getName());pst.setString(4,u.getGender());pst.setString(5,salt);pst.executeUpdate();}catch(Exception e){e.printStackTrace();throw e;}finally{DBUtil.close(con);} }
2)修改登录认证的接口
修改后,代码如下:
/*** 登录认证* @param userName* @param password* @return* @throws Exception*/public boolean auth(String userName,String password) throws Exception{Connection conn = null;User user = findByUserName(userName);if(user==null){return false;}//得到密文String encodePassword = new SimpleHash("md5",password,user.getSalt(),2).toString();try {conn = DBUtil.getConnection();Statement state = conn.createStatement();//String sql = "SELECT * " +"FROM t_user "+"WHERE username='"+userName+"' " +"AND pwd='"+encodePassword+"'";//打印被执行的SQL语句System.out.println(sql);ResultSet rs = state.executeQuery(sql);//if(rs.next()){return true;}} catch (Exception e) {e.printStackTrace();} finally{if(conn != null){DBUtil.close(conn);}}return false;}
重新注册一个管理员账号
1)输入用户名:sys
2)输入密码:123456
3)数据表里面sys用户的密码为密文
使用sys账号登录ERP系统(输入正确的密码)
输入密码为:123456
使用sys账号登录ERP系统(对密码输入框进行SQL注入)
输入密码为:’ OR ‘1’='1
UserDAO类的完整代码
代码如下:
package com.myerp.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;
import com.myerp.model.User;
import com.myerp.utils.DBUtil;
/*** 针对用户表t_user的数据访问类* @author yangzc**/
public class UserDAO {/*** 按照username查询一个实体信息* 注册时用于检测用户名是否重复* 登录时用于检测用户名密码是否正确* @param userName* @return* @throws Exception*/public User findByUserName(String userName)throws Exception{User user = null;Connection conn = null;PreparedStatement pst = null;ResultSet rs = null;try{conn = DBUtil.getConnection();pst = conn.prepareStatement("select * from t_user where username=?");pst.setString(1, userName);rs = pst.executeQuery();while(rs.next()){user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPwd(rs.getString("pwd"));user.setName(rs.getString("realname"));user.setGender(rs.getString("gender")); user.setSalt(rs.getString("salt"));}}catch(Exception e){e.printStackTrace();throw e;}finally{DBUtil.close(conn);}return user;} /*** 增加用户信息(注册时用)* @param u* @throws Exception*/public void save(User u)throws Exception{//设置盐巴String salt = new SecureRandomNumberGenerator().nextBytes().toString();//设置撒多少次盐巴int times = 2;//生成密文String encodedPassword = new SimpleHash("md5",u.getPwd(),salt,times).toString();Connection con = null;PreparedStatement pst = null;try{con = DBUtil.getConnection();pst = con.prepareStatement("insert into t_user(username,pwd,realname,gender,salt) values (?,?,?,?,?)");pst.setString(1,u.getUsername());pst.setString(2,encodedPassword);pst.setString(3,u.getName());pst.setString(4,u.getGender());pst.setString(5,salt);pst.executeUpdate();}catch(Exception e){e.printStackTrace();throw e;}finally{DBUtil.close(con);} } /*** 登录认证* @param userName* @param password* @return* @throws Exception*/public boolean auth(String userName,String password) throws Exception{Connection conn = null;User user = findByUserName(userName);if(user==null){return false;}//得到密文String encodePassword = new SimpleHash("md5",password,user.getSalt(),2).toString();try {conn = DBUtil.getConnection();Statement state = conn.createStatement();//String sql = "SELECT * " +"FROM t_user "+"WHERE username='"+userName+"' " +"AND pwd='"+encodePassword+"'";//打印被执行的SQL语句System.out.println(sql);ResultSet rs = state.executeQuery(sql);//if(rs.next()){return true;}} catch (Exception e) {e.printStackTrace();} finally{if(conn != null){DBUtil.close(conn);}}return false;}
}
微信扫一扫关注公众号
点击链接加入群聊
https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105
SQL注入的简单案例相关推荐
- 菜鸟学SQL注入 --- 一个简单的教学案例
***的SQL***演示: 指的是***或恶意用户在应用程序不知道的情况下通过应用程序来对SQL 数据库执行恶意的代码,一旦***成功,可以做任何事情,如查看数据表中的信息,删除数据表的数据,到获得网 ...
- sql注入(最简单的注入)
1.加了引号报错,提示多了个引号,判断出是数字型,加了引号没出错,可判断出是字符型 2.and 1=1正确,1=2错误,说明我们添加的语句可被执行,结合第一步可判断出存在数字型注入 3.order b ...
- SQL注入详解和简单绕过原理
1.什么是SQL 结构化查询语言(Structured Query Language)简称SQL SQL使我们有能力访问数据库 2.什么是SQL注入 用户提交的数据可以被数据库解析执行 如果用户随随便 ...
- python sql注入脚本_python辅助sql手工注入猜解数据库案例分析
发现存在sql注入漏洞 简单一点可以直接用sqlmap工具暴库 但是如果想深入理解sql注入的原理,可以尝试手工注入,配合python脚本实现手工猜解数据库 首先hachbar开启 获取cms登录后的 ...
- 仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell
最近没事登登好几年前玩过的游戏看看,发现有人喊高价收号,这一看就是骗子,这等骗子还想骗我?我就来看看这逗逼是怎么骗人的,结果发现这人给了一个说是 5173平台交易的网站,叫我直接把号的信息填上去然后填 ...
- 视频教程-SQL注入与SQLmap工具-漏洞挖掘与利用
SQL注入与SQLmap工具 玄道,从混迹漏洞平台与SRC应急响应中心的白帽子到创业乙方的技术与运营 刘畅 ¥15.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 AP ...
- SQL 注入 OrderBy/0ctf simplesqlin
https://www.cnblogs.com/claricre/p/6187672.html http://www.w3school.com.cn/sql/sql_orderby.asp 1. s ...
- SQL注入是什么?如何防止?
SQL注入是一种注入攻击,可以执行恶意SQL语句.下面本篇文章就来带大家了解一下SQL注入,简单介绍一下防止SQL注入攻击的方法,希望对大家有所帮助. 什么是SQL注入? SQL注入(SQLi)是一种 ...
- mysql注入漏洞语句,web安全之sql注入漏洞
概念 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通俗地讲,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力 ...
最新文章
- BZOJ-2440 (莫比乌斯函数)
- 计算机怎么把硬盘分成几个,如何把电脑的一个盘的容量分给另外一个盘
- java utf8 简繁转换 类库_Java封装简体繁体(香港台湾)转换工具
- SpringMVC 框架系列之组件概述与配置详解
- Linux 该文件命令查看内容
- python机器学习库sklearn——神经网络
- andriod之配置文件保存与读取
- php中is_uploaded_file()函数的用法
- mac下8080端口到80端口的转发
- 北航2022软件工程第一次作业——阅读、思考、调研、实践
- Python每日一练-----快乐数
- Android实现键盘拨号
- PEST、5W2H、逻辑树、4P营销理论、用户行为分析
- 像呼吸空气一样呼吸创意
- 风影ASP.NET基础教学 10 DetilsView
- JS 中常见的转义字符串
- 九连环的递回算法(C战C++)
- php开发手册要看完吗,9个开发人员应该知道的PHP库
- 如何打造出让人欲罢不能的“爆款”产品,这5个秘籍你收好!
- 程序设计大作业:教务管理系统(C语言)