zoukankan      html  css  js  c++  java
  • sql注入原理+mysql相关知识点

    什么是SQL注入

      sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

      举个MYSQL简单的例子,数据库中有张users表

      当和数据库交互的时候,我们设和前端交互的语句是

    select * from users where username='$user' and password='$passwd';

      当正常输入的账号密码,此sql语句变成了

    select * from users where username='admin' and password='e10adc3949ba59abbe56e057f20f88383e';

       但九年义务教育总会出现那么几股泥石流,假设输入的admin' or 1=1 #,那么此时的SQL语句变成了

    select * from users where username='admin' or 1=1 #' and password='e10adc3949ba59abbe56e057f206e057f20f883e';

      这样就造成了SQL注入

     

    SQL注入分类 

      上述是一个简单的注入事例,实际中,还分不同种类的SQL注入 https://baijiahao.baidu.com/s?id=1653173591310148806&wfr=spider&for=pc

      1、参数类型分类

        数字型注入:输入参数为整型时,如Id、年龄和页码等;

        字符型注入:输入参数为字符串型时,如姓名、职业、住址等; 

      2、注入位置分类

        GET注入:注入字符在URL参数中;

        POST注入:注入字段在POSt提交的数据中;

        Cookie注入:注入字段在Cookie数据中,网站使用通用的防注入程序,会对GET、POST提交的数据进行过滤,却往往遗漏Cookie中的数据进行过滤。

        其他注入:HTTP请求的其他内容触发的SQL注入漏洞;  

      3、结果反馈分类

        盲注入:盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,注入方式主要有两种:基于布尔值与基于时间。

        3.1、基于布尔值

          如在MySQL中判断数据名长度的输入为1' and length(database()) = 10 #,通过相应的正确与否判断数据名的长度是否为10,猜测数据库中数据的具体内容时,可以借助书本上SUBSTR、LIMIT、ASCII等一些特殊的命令及函数进行猜测;

        3.2、基于时间

          基于时间的SQL盲注入方式通常是在SQL语句中添加延时函数,依据相应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep、repeat等。

       4、其他类型

        延时注入:使用延时函数方式;

        搜索注入:注入点在搜索框中;

        编码注入:将输入的字符串进行编码,如base64编码;

        堆查询注入:同时执行多条语句;

        联合查询注入:使用union操作码合并两条或多条SQL语句;

        多阶注入:由多个HTTP请求响应共同完成的注入;

      (后续会在sqli-libs里详细介绍这些注入类型的利用,这次绝对不咕)

     SLQ注入防范

      1、永远不要相信用户输入的数据

      2、检查变量数据类型和格式

      3、过滤特殊符号

      4、绑定变量,使用预编译语句

    MySQL相关知识点

      这里只先介绍一些注入简单的MySQL知识,MySQL的详细具体在后续的更新中会出一个分类(唱戏台上老将军,浑身flag。不会咕的,不会咕的,这次真的不会咕)

      MySQL是不区分大小写

      常用函数

      1. version()——MySQL版本
      2. user()——数据库用户名
      3. database()——数据库名
      4. @@datadir——数据库路径
      5. @@version_compile_os——操作系统版本 

      注释符

      1、#.

      2、--  

      3、/*内联注释*/ 

      逻辑运算

        and 、&& 和运算,要所有条件成立才能执行

        

      or  、 || 或运算,只要一个条件成立

     

      order by 字段数查询

      

       union操作符的介绍

        UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 

      SQL UNION 语法

        SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 

      例如flag表里有两个字段

    select 1,2 from users union select * from flag;

     

      注意,这里只有在查询字段数相同的情况下才能执行union联合查询,当查询的字段数不一致时会报错

     

       information_schema

          Mysql有一个系统数据库information_schema,存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入。以下为一般的流程。

        猜数据库   

    select schema_name from information_schema.schemata

        猜某库的数据表

    select table_name from information_schema.tables where table_schema='数据库名'

        猜某表的所有列

    Select column_name from information_schema.columns where table_name='数据表名'

        获取某列的内容

    Select  字段名 from 数据表

    参考链接

      https://www.cnblogs.com/lcamry/p/5763154.html

    如有错误和不足请指点,谢谢

  • 相关阅读:
    2015年工作中遇到的问题:21-30(这10个问题很有价值)
    简要总结最近遇到的5个问题
    简要总结最近遇到的5个问题
    我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)
    我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)
    IT咨询服务-客户案例(四):根据图片等素材,动态生成个性化图片
    IT咨询服务-客户案例(四):根据图片等素材,动态生成个性化图片
    分布式系统若干经验总结
    分布式系统若干经验总结
    最近遇到的若干技术问题
  • 原文地址:https://www.cnblogs.com/Lee-404/p/12795193.html
Copyright © 2011-2022 走看看