当前位置: 首页 > news >正文

创建网站宝典做婚恋交友类网站

创建网站宝典,做婚恋交友类网站,个人博客怎么注册,英语翻译网站开发前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望…

前言:

        堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油

注意:

本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各位博主 师傅 大佬 勿喷,还希望大家指出错误

1.SQL语句参数直接动态拼接

常见的的执行语句为Statement执行SQL语句

例如下面这段代码:

<%  //驱动程序名   String driverName = "com.mysql.jdbc.Driver";  //数据库用户名   String userName = "root";  //密码   String userPasswd = "root";  //数据库名   String dbName = "javasqltest";  //表名   String ID = '1'//联结字符串   String url = "jdbc:mysql://localhost:3306/" + dbName + "?user="  + userName + "&password=" + userPasswd;  Class.forName("com.mysql.jdbc.Driver").newInstance();  Connection connection = DriverManager.getConnection(url);  Statement statement = connection.createStatement();  String sql = "SELECT * FROM  people where id = " +ID ;  ResultSet rs = statement.executeQuery(sql);  %>  

 打印出来的结果如图下所示

数据库数据:

我们发现 像这种情况就是由SQL语句参数直接动态拼接成的,这样的话参数ID可控并且可以执行sql语句的拼接,存在明显的SQL注入漏洞

String sql = "SELECT * FROM  people where id = " +ID ;  

我们测试验证 一下 传入参数为  

1 and 1= 1

果然存在漏洞,这样就有个严重 的问题 当输入1 or 1 = 1就会打印所有的表的数据 ,造成数据泄露

 1 or 1=1

2.预编译有误

首先预编译处理就是将一些灵活的参数值以占位符?的形式给代替掉,我们把参数值给抽取出来,把SQL语句进行模板化。让MySQL服务器执行相同的SQL语句时,不需要在校验、解析SQL语句上面花费重复的时间

public void test1() throws Exception {// 获取连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useServerPrepStmts=true", "root", "admin");String sql = "select * from user where id = ?";PreparedStatement ps = connection.prepareStatement(sql);ps.setInt(1, 1);// 执行查询,获取结果集ResultSet rs = ps.executeQuery();//遍历查询结果集while (rs.next()) {System.out.println(rs.getObject("id")+"---"+rs.getObject("username"));}rs.close();ps.close();}

那么预编译有误这个很好理解,就是使用错了编程方式,也就是采用了动态拼接

 

     上述代码就是典型的预编译错误编程方式,虽然id参数使用了PrepareStatement进行SQL查询,但是后面的usermame使用了SQL语句拼接的方式“sql += " and usermame like%”+username +.""%"";"",将username参数进行了拼接,这样导致了SQL注入漏洞的产
生。传入的username值为“"user% or T'=1"#""
 

3.order by 注入 

就是即使是标准的预编译处理也难以防止sql注入,因为某些情况下是不能使用预编译处理的,只能采用字符串拼接处理 像order by 注入

原理:

SQL中:ORDER BY执行排序后面需要指定列名,该列名是不能被引号包含的否则就会被认为是一个字符串。

所以进行ID拼接的时候就出现了 sql注入

4. %和_模糊查询

首先明白这两个通配符的作用

_:任意一个字符,
%:任意0或多个字符。

 下面举例 例如查询名字为root的用户 得到

我们填入r试试

 

查询不到 但是因为在java中预编译查询不会对%和_ 进行转义,而它们又是like查询的通配符,所以出现了漏洞,我们输入 

username=r%

能够得到root的全部信息

 

所以只能手动过滤_和% 

5.MyBatis中的#{}和${}

1、#{}表示一个占位符号 相当于 jdbc中的 ? 符号
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?

2、${}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select * from user where id= #{user_id},如果传入的值是11,那么解析成sql时的值为where id="11" ,

     就是说使用#{}方法更为安全 ${}方法不安全 ,因为在MyBatis中像order by 查询,like查询,in参数等都只能采用拼接方式 ,要确切的查询只能用到${},所以就会出现sql注入 ,所以得采用手动过滤的方法进行修复  

http://www.yayakq.cn/news/403258/

相关文章:

  • 新能源网站开发wordpress子域名设置
  • 高级网站开发培训价格杭州优化商务服务公司
  • 非寻服饰网站建设规划书wordpress怎么找到php文件
  • 网站开发全流程长沙 外贸网站建设公司
  • 上海史特网站建设网上营销策略有哪些
  • 记录网站建设的基本步骤礼品册兑换 网站建设
  • 接单做网站怎么开价格秀山网站建设端午节手抄报获奖
  • 做网站去哪里可以找高清的图片免费天眼查公司查询
  • 莆田网站建设解决方案北京平面设计培训
  • 网站平台是怎么做财务的找工作 招聘附近8小时双休
  • 江苏扬州建设局网站做网站心得体会
  • 孝感网站seowordpress 工作原理
  • 织梦怎么做手机网站wordpress聚合平台模板
  • 有服务器有域名如何做网站云服务器做网站视屏
  • 俄文网站引擎网站做微信小程序
  • 长沙h5手机网站制作如何建立网站做微商
  • 织梦模板国外网站制作网站需要哪些素材
  • 郑州网站开发培训班怎么查域名有没有备案
  • 建站模板工程造价西安警方通报: 西安
  • 个人网站备案介绍可信网站认证不在有用吗
  • 朔州网站设计公司东莞建设网住房保障
  • 国外网站推广平台有哪些?wordpress如何自己写页面
  • 成都工商注册流程汤阴县seo快速排名有哪家好
  • 网站建设开发综合实训小结长春网站公司哪家好
  • 做网站颜色黑色代码多少城乡建设局和住监局官网
  • 电子工程专辑网站电子商务有限公司怎么注册
  • 单位网站建设申请高端网站定制站
  • 2024装修图片100张福州网站建设优化
  • 广州比较好的网站建设专业的网站建设公司排名
  • 旅游网站logowordpress 导航栏 搜索