文章目录

  • 什么是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注入的简单案例相关推荐

  1. 菜鸟学SQL注入 --- 一个简单的教学案例

    ***的SQL***演示: 指的是***或恶意用户在应用程序不知道的情况下通过应用程序来对SQL 数据库执行恶意的代码,一旦***成功,可以做任何事情,如查看数据表中的信息,删除数据表的数据,到获得网 ...

  2. sql注入(最简单的注入)

    1.加了引号报错,提示多了个引号,判断出是数字型,加了引号没出错,可判断出是字符型 2.and 1=1正确,1=2错误,说明我们添加的语句可被执行,结合第一步可判断出存在数字型注入 3.order b ...

  3. SQL注入详解和简单绕过原理

    1.什么是SQL 结构化查询语言(Structured Query Language)简称SQL SQL使我们有能力访问数据库 2.什么是SQL注入 用户提交的数据可以被数据库解析执行 如果用户随随便 ...

  4. python sql注入脚本_python辅助sql手工注入猜解数据库案例分析

    发现存在sql注入漏洞 简单一点可以直接用sqlmap工具暴库 但是如果想深入理解sql注入的原理,可以尝试手工注入,配合python脚本实现手工猜解数据库 首先hachbar开启 获取cms登录后的 ...

  5. 仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell

    最近没事登登好几年前玩过的游戏看看,发现有人喊高价收号,这一看就是骗子,这等骗子还想骗我?我就来看看这逗逼是怎么骗人的,结果发现这人给了一个说是 5173平台交易的网站,叫我直接把号的信息填上去然后填 ...

  6. 视频教程-SQL注入与SQLmap工具-漏洞挖掘与利用

    SQL注入与SQLmap工具 玄道,从混迹漏洞平台与SRC应急响应中心的白帽子到创业乙方的技术与运营 刘畅 ¥15.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 AP ...

  7. SQL 注入 OrderBy/0ctf simplesqlin

    https://www.cnblogs.com/claricre/p/6187672.html http://www.w3school.com.cn/sql/sql_orderby.asp 1.  s ...

  8. SQL注入是什么?如何防止?

    SQL注入是一种注入攻击,可以执行恶意SQL语句.下面本篇文章就来带大家了解一下SQL注入,简单介绍一下防止SQL注入攻击的方法,希望对大家有所帮助. 什么是SQL注入? SQL注入(SQLi)是一种 ...

  9. mysql注入漏洞语句,web安全之sql注入漏洞

    概念 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通俗地讲,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力 ...

最新文章

  1. BZOJ-2440 (莫比乌斯函数)
  2. 计算机怎么把硬盘分成几个,如何把电脑的一个盘的容量分给另外一个盘
  3. java utf8 简繁转换 类库_Java封装简体繁体(香港台湾)转换工具
  4. SpringMVC 框架系列之组件概述与配置详解
  5. Linux 该文件命令查看内容
  6. python机器学习库sklearn——神经网络
  7. andriod之配置文件保存与读取
  8. php中is_uploaded_file()函数的用法
  9. mac下8080端口到80端口的转发
  10. 北航2022软件工程第一次作业——阅读、思考、调研、实践
  11. Python每日一练-----快乐数
  12. Android实现键盘拨号
  13. PEST、5W2H、逻辑树、4P营销理论、用户行为分析
  14. 像呼吸空气一样呼吸创意
  15. 风影ASP.NET基础教学 10 DetilsView
  16. JS 中常见的转义字符串
  17. 九连环的递回算法(C战C++)
  18. php开发手册要看完吗,9个开发人员应该知道的PHP库
  19. 如何打造出让人欲罢不能的“爆款”产品,这5个秘籍你收好!
  20. 程序设计大作业:教务管理系统(C语言)

热门文章

  1. ajax 多人聊天吧,基于Nodejs利用socket.io实现多人聊天室
  2. 剪辑多个视频合并,并添加音频、文案
  3. Python代码导入出EXCEL数据
  4. i++ 和 ++i 详解
  5. 活动回顾 | 波兰大会展现出BSV区块链上的全新商业机会
  6. eclipse添加桌面快捷方式
  7. 潜流式人工湿地计算_人工湿地计算书
  8. 机器视觉检测丨圆顶光源工作原理及打光案例
  9. linux设置时间和日期,Linux修改日期和时间
  10. 哈希值的计算方式及一些相关概念