范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

网络安全信息安全渗透必学SQL注入技巧

  1.1.Sql注入攻击原理
  SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,首先我们要学习它的原理。
  针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的:
  程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句。未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。
  注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件:用户能够控制输入。
  原本程序要执行的代码,拼接了用户输入的数据。  1.2.Sql审计方法
  手动找的话,可以直接找到sqlmapper.xml文件或者直接搜索 select、update、delete、insert "String sql="等关键词,定位SQL xml配置文件。
  如果 sql 语句中有出现 $ 进行参数拼接,则存在SQL注入风险。
  当找到某个变量关键词有 SQL 注入风险时,可以再根据调用链找到该存在注入风险的业务逻辑代码,查看参数来源是否安全、是否有配置SQL危险参数过滤的过滤器,最终确认是否存在SQL注入。以下给出可能造成sql注入攻击的关键字,审计时可根据实际情况进项查找
  常见SQL语句关键词
  关键词
  解释
  ResultSet
  数据库结果集的数据表,通常通过执行查询数据库的语句生成。
  executeQuery
  执行查询
  select
  数据库中的查询关键字
  insert
  数据库中的插入关键字
  update
  数据库中的修改关键字
  delete
  数据库中的删除关键字
  where
  数据库中的条件关键字
  union
  数据库中的联合查询关键字
  drop
  数据库中的删除数据库关键字
  create
  数据库中的创建数据库关键字
  count
  数据库中的返回匹配行数关键字
  java.sql.Connection
  与特定数据库的连接类
  Statement
  是 Java 执行数据库操作的重要接口
  jdbcTemplate
  最基本的Spring JDBC模板
  PreparedStatement
  预编译的 SQL 语句的对象
  queryForInt
  数据库查询方法关键字
  queryForObject
  数据库查询方法关键字
  queryForMap
  数据库查询方法关键字
  getConnection
  获取sql连接
  outfile
  数据库中把表数据导出关键字
  load_file
  数据库中导入数据的关键字
  【一一帮助安全学习,以下都是免费获取,文末有领取方式~一一】
  ①网络安全学习路线
  ②20份渗透测试电子书
  ③安全攻防357页笔记
  ④50份安全攻防面试指南
  ⑤安全红队渗透工具包
  ⑥网络安全必备书籍
  ⑦100个漏洞实战案例
  ⑧安全大厂内部教程1.3Sql注入漏洞危害
  1 、 攻击者可以做到 业务运营的所有数据被攻击 对当前数据库用户拥有的所有表数据进行增、删、改、查等操作 若当前数据库用户拥有file_priv权限,攻击者可通过植入木马的方式进一步控制DB所在服务器 若当前数据库用户为高权限用户,攻击者甚至可以直接执行服务器命令从而通过该漏洞直接威胁整个内网系统
  2、可能对业务造成的影响
  ① 用户信息被篡改
  ② 攻击者偷取代码和用户数据恶意获取
  线上代码被非法篡改,并造成为恶意攻击者输送流量或其他利益的影响 1.4Sql注入漏洞代码示例Java 代码动态构建 SQLStatement stmt = null;  ResultSet rs = null;  try{  String userName = ctx.getAuthenticatedUserName(); //this is a constant  String sqlString = "SELECT * FROM t_item WHERE owner="" + userName + "" AND itemName="" + request.getParameter("itemName") + """;  stmt = connection.createStatement();  rs = stmt.executeQuery(sqlString);  // ... result set handling  }  catch (SQLException se){  // ... logging and error handling  }
  这里将查询字符串常量与用户输入进行拼接来动态构建SQL查询命令。仅当itemName不包含单引号时,这条查询语句的行为才会是正确的。如果一个攻击者以用户名wiley发起一个请求,并使用以下条目名称参数进行查询: name" OR "a" = "a
  那么这个查询将变成: SELECT * FROM t_item WHERE owner = "wiley" AND itemname = "name" OR "a"="a";
  此处,额外的OR ‘a’="a’条件导致整个WHERE子句的值总为真。那么,这个查询便等价于如下非常简单的查询: SELECT * FROM t_item
  这个简化的查询使得攻击者能够绕过原有的条件限制:这个查询会返回items表中所有储存的条目,而不管它们的所有者是谁,而原本应该只返回属于当前已认证用户的条目。
  在存储过程中动态构建SQL
  Java代码: CallableStatement = null  ResultSet results = null;  try  {  String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  cs = connection.prepareCall("{call sp_queryItem(?,?)}");  cs.setString(1, userName);  cs.setString(2, itemName);  results = cs.executeQuery();  // ... result set handling  }  catch (SQLException se)  {  // ... logging and error handling  }  SQL Server存储过程:  CREATE PROCEDURE sp_queryItem  @userName varchar(50),  @itemName varchar(50)  AS  BEGIN  DECLARE @sql nvarchar(500);  SET @sql = "SELECT * FROM t_item  WHERE owner = """ + @userName + """  AND itemName = """ + @itemName + """";  EXEC(@sql);  END  GO
  在存储过程中,通过拼接参数值来构建查询字符串,和在应用程序代码中拼接参数一样,同样是有SQL注入风险的。 Hibernate 动态构建 SQL/HQL
  原生SQL查询: String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  Query sqlQuery = session.createSQLQuery("select * from t_item where owner = "" + userName + "" and itemName = "" + itemName + """);  List rs = (List) sqlQuery.list();
  HQL查询: String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  Query hqlQuery = session.createQuery("from Item as item where item.owner = "" + userName + "" and item.itemName = "" + itemName + """);  List hrs = (List) hqlQuery.list();
  即使是使用Hibernate,如果在动态构建SQL/HQL查询时包含了不可信输入,同样也会面临SQL/HQL注入的问题。
  HQL代码中,session.createQuery使用HQL语句将查询到的数据存到到list集合中,需要时在拿出来使用。而参数中itemName是通过request.getParameter直接获取。攻击者若在此处写入恶意语句,程序将恶意语句查询出来的数据存放在list集合中,再通过某处调用成功将数据显示在前台。 Mybatis注入分析
  Mybatis框架下易产生SQL注入漏洞的情况主要分为以下三种:
  1)模糊查询like
  例如对人员姓名检索进行模糊查询,如果考虑安全编码规范问题,其对应的SQL语句如下: Select * from user where name like "%#{name}%"
  但由于这样写程序会报错,研发人员将SQL查询语句修改如下: Select * from user where name like "%${name}%"
  在这种情况下我们发现程序不再报错,但是此时产生了SQL语句拼接问题,如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。
  2)in之后的参数
  例如对人员姓名进行同条件多值检索的时候,如当用户输入001,002,003…时,如果考虑安全编码规范问题,其对应的SQL语句如下: Select * from name where id in (#{id})
  但由于这样写程序会报错,研发人员将SQL查询语句修改如下: Select * from name where id in (${id})
  修改SQL语句之后,程序停止报错,但是却引入了SQL语句拼接的问题,如果没有对用户输入的内容做过滤,势必会产生SQL注入漏洞。
  3)order by之后(重点和区分点)
  当根据姓名、id序号等信息用户进行排序的时候,如果考虑安全编码规范问题,其对应的SQL语句如下: Select * from user where name = "qihoo" order by #{id} desc
  但由于发布时间id不是用户输入的参数,无法使用预编译。研发人员将SQL查询语句修改如下: Select * from user where name = "qihoo" order by ${id} desc
  修改之后,程序未通过预编译,但是产生了SQL语句拼接问题,极有可能引发SQL注入漏洞。 1.5.实战案例-OFCMS SQL注入漏洞分析
  本文中使用ofcms进行SQL注入漏洞讲解,此CMS算是对新手学习代码审计比较友好的CMS。
  上述为安装成功页面,如何安装CMS本章不在赘述。
  后台页面: http://localhost:8080/ofcms-admin/admin/index.html
  漏洞点: ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGeneratrController.java  create方法  |   /**  * 创建表  */  public void create() {  try {  String sql = getPara("sql");  Db.update(sql);  rendSuccessJson();  } catch (Exception e) {  e.printStackTrace();  rendFailedJson(ErrorCode.get("9999"), e.getMessage());  }  }
  上述代码中使用getpara获取sql的参数值,并update,跟进一下getpara和update方法。
  跳转至  jfinal-3.2.jar/com/jfinal/core/controller.class  public String getPara(String name) {  return this.request.getParameter(name);  }
  上述代码无特殊用意,就是获取参数值,继续跟进 Db.update 方法。
  跳转至  jfinal-3.2.jar/com/jfinal/plugin/activerecord/Db.class  public static int update(String sql) {  return MAIN.update(sql);  }
  发现调用 MAIN.update , 继续跟进。
  跳转至  jfinal-3.2.jar/com/jfinal/plugin/activerecord/DbPro.class  public int update(String sql) {  return this.update(sql, DbKit.NULL_PARA_ARRAY);  }
  继续跟进到最后,发现华点。 public int update(String sql, Object... paras) {  Connection conn = null;  int var4;  try {  conn = this.config.getConnection();//连接  var4 = this.update(this.config, conn, sql, paras);//调用update更新  } catch (Exception var8) {  throw new ActiveRecordException(var8);  } finally {  this.config.close(conn);  }  return var4;  }
  重点:Object…
  Object是所有类的基类,而 Object… 是不确定方法参数情况下的一种多态表现形式(可以传递多个参数)。
  再继续跟进 update ,同文件代码 int update(Config config, Connection conn, String sql, Object... paras) throws SQLException {  PreparedStatement pst = conn.prepareStatement(sql);  config.dialect.fillStatement(pst, paras);  int result = pst.executeUpdate();  DbKit.close(pst);  return result;  }
  上述代码执行SQL语句,并返回结果。
  至此,整个功能流程结束,在我们跟进的过程中,代码中无任何过滤语句,获取参数值,调用update方法更新,更新成功后返回结果。 漏洞验证
  漏洞点打上断点,网页中输入poc进行验证 update of_cms_topic set topic_url=updatexml(1,concat(0x7e,(user())),0) where topic_id = 1
  根据如上截图可看出我们传入的SQL语句是被完整的接收,并未做任何过滤直接带入数据库执行,所以此处直接写入漏洞代码爆出当前数据库账户为 root。
  上述为sqlmap工具跑出来的注入点。 1.6漏洞修复方法添加全局过滤器,过滤特殊字符
  SQLFilter.java中:
  PreparedStatement 参数化
  如果使用参数化查询,则在SQL语句中使用占位符表示需在运行时确定的参数值。参数化查询使得SQL查询的语义逻辑被预先定义,而实际的查询参数值则等到程序运行时再确定。参数化查询使得数据库能够区分SQL语句中语义逻辑和数据参数,以确保用户输入无法改变预期的SQL查询语义逻辑。
  在Java中,可以使用java.sql.PreparedStatement来对数据库发起参数化查询。在这个正确示例中,如果一个攻击者将itemName输入为name’ OR ‘a’ = ‘a,这个参数化查询将免受攻击,而是会查找一个itemName匹配name’ OR ‘a’ = "a这个字符串的条目。 PreparedStatement stmt = null  ResultSet rs = null  try  {  String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  // ...Ensure that the length of userName and itemName is legitimate  // ...  String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName=?";  stmt = connection.prepareStatement(sqlString);  stmt.setString(1, userName);  stmt.setString(2, itemName);  rs = stmt.executeQuery();  // ... result set handling  }  catch (SQLException se)  {  // ... logging and error handling  } 存储过程参数化
  这个存储过程使用参数化查询,而未包含不安全的动态SQL构建。数据库编译此存储过程时,会生成一个SELECT查询的执行计划,只允许原始的SQL语义被执行。任何参数值,即使是被注入的SQL语句也不会被执行,因为它们不是执行计划的一部分。 CallableStatement = null  ResultSet results = null;  try  {  String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  // ... Ensure that the length of userName and itemName is legitimate  // ...  cs = connection.prepareCall("{call sp_queryItem(?,?)}");  cs.setString(1, userName);  cs.setString(2, itemName);  results = cs.executeQuery();  // ... result set handling  }  catch (SQLException se)  {  // ... logging and error handling  } Hibernate 参数化查询
  Hibernate支持SQL/HQL参数化查询。为了防止SQL注入以及改善性能,以上这些示例使用了参数化绑定 的方式来设置查询参数。 String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  Query hqlQuery = session.createQuery("from Item as item where item.owner = ? and item.itemName = ?");  hqlQuery.setString(1, userName);  hqlQuery.setString(2, itemName);  List rs = (List) hqlQuery.list();
  HQL基于名称的参数化查询 String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  Query hqlQuery = session.createQuery("from Item as item where item.owner = :owner and item.itemName = :itemName");  hqlQuery.setString("owner", userName);  hqlQuery.setString("itemName", itemName);  List rs = (List) hqlQuery.list();
  原生参数化查询 String userName = ctx.getAuthenticatedUserName(); //this is a constant  String itemName = request.getParameter("itemName");  Query sqlQuery = session.createSQLQuery("select * from t_item where owner = ? and itemName = ?");  sqlQuery.setString(0, owner);  sqlQuery.setString(1, itemName);  List rs = (List) sqlQuery.list(); MyBatis框架的修复方案
  尽量使用#描述参数,如果一定要使用$,则需要自己过滤用户输入
  模糊查询like SQL注入修复建议
  按照新闻标题对新闻进行模糊查询,可将SQL查询语句设计如下: select * from news where name like concat(‘%’,#{name }, ‘%’)
  采用预编译机制,避免了SQL语句拼接的问题,从根源上防止了SQL注入漏洞的产生。
  in之后的参数SQL注入修复建议
  在对新闻进行同条件多值查询的时候,可使用Mybatis自带循环指令解决SQL语句动态拼接的问题: select * from news where id in#{item} 
  order by SQL注入修复建议
  在Java层面做映射预编译机制只能处理查询参数,其他地方还需要研发人员根据具体情况来解决。如前面提到的排序情景: Select * from news where title =‘淘宝’ order by #{time} asc,
  这里time不是查询参数,无法使用预编译机制,只能这样拼接: Select * from news where title =‘淘宝’ order by ${time} asc
  针对这种情况研发人员可以在java层面做映射来进行解决。如当存在发布时间time和点击量click两种排序选择时,我们可以限制用户只能输入1和2。
  当用户输入1时,我们在代码层面将其映射为time,当用户输入2时,将其映射为click。而当用户输入1和2之外的其他内容时,我们可以将其转换为默认排序选择time(或者click)。

家境优越,儿女孝顺,84岁的祝希娟,为何住进养老院?文思琦晚年祝希娟提及祝希娟,熟悉的朋友应该不多了。如今,这位老戏骨已经84岁,苍颜白发,皱纹里写满了故事。在刘晓庆斯琴高娃陈冲等著名花旦之前,祝希娟是我国首位百花影后得主,演艺生涯省政务服务大厅强作风打造清廉大厅优服务擦亮为民底色省政府政务服务中心认真贯彻关于开展全省清廉大厅建设专项检查的通知精神,组织专题学习。红网时刻新闻记者李璐长沙报道推动清廉大厅建设,不仅有利于畅通服务群众最后一公里,更是优化营商环境暴雨黄色预警继续!8省区将现大到暴雨福建广东局地大暴雨中国天气网讯中央气象台6月13日18时继续发布暴雨黄色预警预计,6月13日20时至14日20时,福建大部江西南部广东大部广西东部和南部云南中东部以及辽宁西部河北东北部山东半岛等地的同心协力谋发展一线调研多方合力为数千家汽配企业补链畅链央视网消息汽车制造业是浙江台州的支柱产业,眼下,受疫情影响,当地6000多家汽配企业不同程度面临着订单下滑供应链紧张等难题。如何帮助企业稳住发展基本面?今天一线调研关注台州的上千名今天全世界都在看的新闻2022。6。13中国前驻美大使美国正偏离对台政策中国前驻美大使崔天凯6月12日在香格里拉对话会场边接受新加坡媒体采访时指出,华盛顿似乎偏离了在台湾问题上的政治承诺,包括对台军售及试图升级美国和台北深圳富人与唐山富人,没有对比就没有伤害一个伟大的城市不但有钱,而且有勇气,有正气,有向善之心,有锄霸救弱的力量,这才是我们心目中的优秀城市理想城市。作者今纶网上有个段子说唐山和深圳,真是没有对比就没有伤害。听说唐山大兄初到中央工作的华国锋(下)文李海文1976年,华国锋和开滦煤矿吕家坨矿工人亲切交谈周恩来为华国锋开了22个省市的单子,华国锋到6省市调查,向中央建议落实按劳分配等政策1971年3月28日大会结束后,周恩来将海贼王大将绿牛登场第1052话崭新的早晨在最新一话中,让大家期待已久的大将绿牛登场了,虽然没有正脸,但却展现了可以在空中飞的能力,也是第二个能在天空飞的大将,第一个是藤虎。在这场战斗中,大妈和凯多被蔡鄂生被提起公诉,涉3项罪名!退休8年后被查,中纪委通报称严重污染金融领域政治生态!点蓝字关注,不迷路据高检网6月13日通报,原中国银行业监督管理委员会党委委员副主席蔡鄂生涉嫌受贿利用影响力受贿滥用职权案,由国家监察委员会调查终结,经最高人民检察院指定,由江苏省镇这10位男星表面是男神,一看身材全垮掉,头大肩窄,驼背大肚腩娱乐圈中从不缺高颜值男神,但有些男星表面看似是男神个个颜值都在线,可是一看身材就比较拉胯了,让人不禁感叹空有一副好皮囊!1张若昀张若昀的长相虽不是传统类型的大帅哥,但他颇有一种清爽女子误诊脂肪瘤,确诊后1个月去世,医生无奈发病率低的转移癌老公,快过来看看,怎么流血了!正在洗澡的王女士突然觉得一阵刺痛,然后发现后背部有鲜血流了出来。听到尖叫声,老公赶忙冲进浴室。小题大做,吓我一跳!你后背的一个小疙瘩被你抓破了。丈夫看
2000元买处理器,新酷睿i5性能更强,为何还推荐老锐龙7?Intel12代酷睿的产品表现自然很优秀,i512600K就可以捶R75800X了,对性能追求比较高的用户,不用说也会去选择12代酷睿处理器,但是很多用户还是会选择AMD,至于原因随州楼市11月最新房价出炉,抄底的时候到了么?首先什么是抄底,所谓的楼市抄底不是说房价下跌了,跌到几年前水平了去买房就是抄底。楼市抄底是指房价低迷但即将有利好开始上涨的时候果断买进称为抄底。一般说楼市抄底需要几个条件支持,从当四线城市辽宁丹东有60平学区房,现在房价下降严重,是留还是卖?当然卖了,丹东每年人口都净流出,房价会有支撑吗?并且新政策下拆迁也变得很困难。双减政策出台以后,很多娃不着急上学的家长买房也开始观望了,就算想卖房也不是一下子就卖的掉的,所以要提前消息称,郑州今年春节期间不挂彩灯,你知道郑州有年味的地方吗?许多人都说现在过年的年味越来越少了,据消息称,郑州今年春节期间不挂彩灯,你知道郑州有年味的地方吗?我去年就是到洛阳开封寻找年味,感觉洛阳开封春节直的委热闹,年味特别足。前几年,郑州虾仁怎么处理,颜色洁白?饭店里很多虾仁菜,如水晶虾仁,龙井虾仁等,那些虾仁都是晶莹剔透粉嫩圆润,光是看颜色就让人胃口大开。其实,那是因为虾仁在下锅之前,需要经过一段特殊的腌制。腌制之后,不仅能让虾仁更加入你生活的地方早点吃什么?我是北京的,在过去的老北京,一般专门卖早点的叫粥铺或者烧饼铺,一般你买个烧饼或者油条,老板就送你一碗粥和咸菜,吃的暖暖的,饱饱的,过去早点铺最热闹,大爷大叔大哥大姐们都会去店里吃个女神王丽坤最迷人的地方,你们认为是哪里?气质,美得特别高级,美艳不可方物说的应该就是她这样的女神了!王丽坤作为我们国内特别知名的一位女演员,大家对她和她的作品应该都特别熟悉,毕竟她在出道的这么多年来一直备受大家的关注,而张家口比较出名的美食有哪些?感谢邀请,首先说一下我是张家口蔚县的,我只说一下我大蔚县的美食吧饸饹,早餐必选啊,就和北京人爱吃豆浆油条一个理,不吃就想啊,大人孩子都喜欢苦荞饸饹,贼啦爽口,和辣椒油更配哦豆腐干,在乒乓球比赛中,主动进攻能力强和相持能力强哪个好处更大?在乒乓球比赛中,主动进攻能力强和相持能力强哪个好处更大?应该懂得,主动进攻与相持打法是相比较而言的两个概念。也是乒乓球比赛中经常运用的策略,它是根据对手的强弱而制定的。对手弱自然没中国的四大直辖市在国外的知名度如何?中国的四大直辖市在国外的知名度如何?我没有具体的数字,也没有科学的统计数据,但是可以凭我了解的相关情况和大家做一个探讨,希望是仁者见仁,智者见智,我想大家的讨论,也是一种提高四大直有没有那种综合实力不输于985211但因种种原因名气不大,就业形势前景好的学校?中央党校牛叉的一塌糊涂1上海电力大学相信人们都知道,一线城市的二本院校要比其他城市的二本院校占有更大的优势,而上海电力大学位于经济发达的上海市,学校的录取分数还是很高的,高考分数线