• Web安全Day1 - SQL注入、漏洞类型


    请添加图片描述

    1. SQL注入

    1.1 漏洞简介

    结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

    1.2 漏洞原理

    可以通过网站存在的查询语句进行构造,为此开发者对其伤透了脑筋,漏洞不光是查询,可能还存在与API、隐藏链接、http头数据、写入数据等。需要对数据包的结构和传递函数比较了解,建议学习的时候把数据库的日志打开,就可以查看到传递到数据库的语句是什么样子的了。 需要记住的information_schema数据库的SCHEMATA、TABLES、COLUMNS。 SCHEMATA表中存放所有数据库的名,字段名为SCHEMA_NAME。 关键函数database() 当前数据库名、version() 当前mysql版本、user()当前mysql用户.

    1.3 漏洞危害

    危害较高的漏洞,可以获取敏感信息,修改信息,脱裤,上传 webshell,执行命令。

    2. SQL漏洞类型

    2.1 区分数字和字符串

    数字上是不加单引号的如’2’+‘2’=‘22’而非’4’ 而2+2=4

    2.2 内联SQL注入

    sql注入主要是靠内联SQL来进行注入的 and or 与或非的判断来进行内联SQL注入,等于在原先的语句上扩展出来的语句

    2.3 报错注入

    报错注入顾名思义主要是利用数据库报错来进行判断是否存在注入点。如果不符合数据库语法规则就会产生错误。常用的特殊字符:’ \ ; %00 ) ( # "

    2.4 盲注
    2.4.1 常用函数

    1)函数length() 计算数据库长度

    id=1' and lengh(database())=8;
    
    • 1

    2)函数left(a)=b sql的left()函数如果式子成立返回1如果不成立返回0一般用来猜测库的名字 3)函数substr() substr()和substring()函数实现的功能是一样的,均为截取字符串。

    select left(database(),1)='r';
    
    • 1

    substring(string, start, length) substr(string, start, length) length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本

    select substr(database(),1,1)='a';
    
    • 1

    可进行单字符验证可进行全字符验证 4)函数mid() mid(string,start,length) string(必需)规定要返回其中一部分的字符串。 start(必需)规定开始位置(起始值是 1)。 length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本可进行单字符验证可进行全字符验证

    select mid(database(),1)='testt';
    
    • 1

    5)函数ascii() 返回字符串str的最左字符的数值。返回0,如果str为空字符串。返回NULL,如果str为NULL。ASCII()返回数值是从0到255; 只会返回最左边字符的可以配合substr()
    在这里插入图片描述
    6)ord函数 ORD() 函数返回字符串第一个字符的 ASCII 值。
    在这里插入图片描述
    7)函数updatexml()

    updatexml(XML_document, XPath_string, new_value);
    
    • 1

    第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string(Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。 第三个参数:new_value,String格式,替换查找到的符合条件的数据 在当前数据库中演示
    8)函数exp() exp是以e为底的指数函数。可能会存在溢出

    mysql> select exp(1);
    ±------------------+
    | exp(1) |
    ±------------------+
    | 2.718281828459045 |
    ±------------------+
    1 row in set (0.00 sec)

    由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错

    mysql> select exp(709);
    ±----------------------+
    | exp(709) |
    ±----------------------+
    | 8.218407461554972e307 |
    ±----------------------+
    1 row in set (0.00 sec)
    mysql> select exp(710);
    ERROR 1690 (22003): DOUBLE value is out of range in ‘exp(710)’

    2.4.2 布尔类型注入

    如果成功注入会正确显示内容,如果没成功会显示非正常内容。

    2.4.3 无报错回显注入

    没有任何报错显示,但是能根据页面是否正确显示来进行判断。如搜索注入没有内容,正常搜索应该是有内容的。

    2.4.4 时间注入

    如果exp1为true返回值为sleep,如果为假返回值为1。ps:前提是网络延迟较低的情况。。

    if(length(database())>1,sleep(5),1)
    
    • 1
    2.5 堆叠查询注入

    通过分号隔开执行多条语句。

    2.6 Union注入

    前面不存在才会执行后面的语句,一般配合的是布尔类型的盲注

    2.7 二次注入

    在存入数据库的时候做了过滤,但是取出来的时候没有做过滤,而产生的数据库注入。

    2.8宽字节注入

    数据库大多数为GBK才可以%df

    2.9 cookie注入

    cookie中的参数也有可能存在注入

    2.10 编码注入

    Base64

    2.11 XFF注入攻击

    X-Forwarded-for伪造客户端IP

    2.12 DNS_log

    dnslog

    2.13 组合注入

    通过上述所有的注入方式进行组合攻击,如union+盲注

  • 相关阅读:
    Lombok的hashCode方法
    电磁兼容试验数据的单位转换 笔记
    ShardingJDBC配置读写分离
    PyQt利用QScrollArea+QGridLayout制作一个滑动的Grid布局(QT Designer)
    栈和队列1——栈的实现及其oj(括号匹配问题)
    react跨域如何解决?
    vue中绑定class样式和条件渲染
    学习R语言第六天
    【Vue组件的样式绑定&事件监听和处理】
    PMP每日一练 | 考试不迷路-11.01(包含敏捷+多选)
  • 原文地址:https://blog.csdn.net/qq_52716296/article/details/127405998