网络安全-Mysql注入知识点

    科技2025-09-04  19

    目录

    注释

    SQL语句

    查询语句

    UNION

    LIMIT

    ORDER BY

    information_schema

    SCHEMATA

    TABLES

    COLUMNS 

    常用函数

    基本函数

    盲注(字符串处理函数)

    报错注入

    时间盲注


    本篇文章介绍sql注入时数据库是Mysql时需要掌握的知识点。以Navicat、mysql 5.7.4为例。

    注释

    #或--空格是单行注释

    /**/是内联注释

    SQL语句

    查询语句

    SELECT〈目标列组〉      FROM〈数据源〉      [WHERE〈元组选择条件〉]      [GROUP BY〈分列组〉[HAVING 〈组选择条件〉]]      [ORDER BY〈排序列1〉〈排序要求1〉 [,…n]];

    UNION

    用于union注入攻击

    UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];

    参数:

    expression1, expression2, ... expression_n: 表达式,sql注入时通常是database()函数等我们需要的信息。tables: 要检索的数据表。WHERE conditions: 可选, 检索条件。DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。ALL: 可选,返回所有结果集,包含重复数据。

    LIMIT

    语法:

    limit m,n

    从m位置开始,取n条记录

    ORDER BY

    order by 后面可以加列名,也可以加数字,数字应是小于等于查询结果的列数,所以可以慢慢增加,当出错时,查询结果就是出错时的数字-1。

    information_schema

    mysql 5.0之后有这个数据库,包含数据库的很多信息,常用表SCHEMATA、TABLES、COLUMNS。

    SCHEMATA

    SCHEMATA表存储数据库名,字段为SCHEMA_NAME

    SCHEMATA表

    sql语句

    SELECT schema_name FROM information_schema.schemata

     

    查询结果

    TABLES

    TABLES表存储表名及表所属数据库,字段为TABLE_NAME、TABLE_SCHEMA

    TABLES表

     一般是查询当前数据库或者从上面得到的数据库中指定一个。

    查询当前数据库sql语句

    SELECT table_name FROM information_schema.`TABLES` WHERE table_schema=database()

     

    当前数据库的表

     指定数据库sql语句,以pikachu为例

    SELECT table_name FROM information_schema.`TABLES` WHERE table_schema='pikachu' 结果

    COLUMNS 

    COLUMNS表存储列名及所属数据库名、所属表名,字段为COLUMN_NAME、TABLE_SCHEMA、TABLE_NAME

    COLUMNS表

    查询当前表的列,sql语句

    SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name=table_name 结果

    查询指定表的列,通过上面,我们已经知道pikachu数据库有表users,以这个为例。

    sql语句

    SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema='pikachu' AND table_name='users'

     

    结果

    字段值

    通过利用这个数据库我们已经知道了所有的数据库、表、列,接下来我们就可以得到想要的数据了。以数据库pikachu的users表的username和password为例。

    sql语句

    SELECT username,password FROM pikachu.users

     结果:

    结果

    当然,实际的sql注入没有这么简单,本篇文章列出所有知识点,接下来的文章以本地靶机讲解几种注入技术,然后再分析dvwa的过滤代码以及绕过,都学完后差不多就可以解决中低级的sql注入问题,然后可以去一些CTF在线靶场来进一步提高了。

    常用函数

    在上面的Sql语句中,我们提到了databse(),这是mysql的函数,接下来我们就看看在sql注入时常用到的函数。

    基本函数

    1.返回当前使用数据库的用户 user()/system_user()/current_user()/session_user() 2. 返回当前数据库的版本 version()/@@version3. 返回当前使用的数据库 database() 4. 返回当前数据库所在位置 @@datadir 5. 返回当前操作系统版本 @@version_compile_os6.将多个字符串连接成一个字符串

    concat(s1,s2...sn)7.将多行字符串拼接成一行 group_concat()语法如下:

    group_concat(

    [DISTINCT] 要连接的字段

    [Order BY 排序字段 ASC/DESC]

    [Separator ‘分隔符’]

    )

    主要用来处理一对多的查询结果,通常会结合GROUP BY一起使用。 

    盲注(字符串处理函数)

    length(s) :返回目标字符串的长度 常用于盲注时数据库等信息的判断,sql语句

    select length(database()); 结果

     

    substr(),substring(),mid():用法基本相同,截取字符串的一部分,会一个就可以了

    SUBSTR(s, start, length)

    SUBSTRING(s, start, length)

    MID(s, start, length)

    从字符串s的start(包含且>=1)位置开始截取length个字符。

    常用于盲注时截取字符串的某一个字符,判断是什么,例如使用substr(database(),1,1)获取数据库的第一个字符进行判断,再结合length函数,最后拼接成整个数据库名。ascii(s)/ord(s):返回字符串s的第一个字符对应的ASCII码,记一个就可以了

    常用于盲注,结合substr函数

    sql语句

    SELECT ascii(substr(database(),1,1)) 结果

    再查询ascii码表就知道105对应的是字符i。

    char(num):返回ASCII码对应的字符

    上面函数的逆函数 sql语句

    SELECT char(97)

    97对应的是字符a

    结果

    hex():将目标字符串装换成16进制格式的数据 select hex(“dvwa”) 返回结果:70696B61636875unhex():将16进制格式的数据装换成原字符串 语句:unhex(64767761) 解释:返回结果:dvwa

    left()/right() :从规定字符串的左边/右边开始截取字符串 LEFT(s,n) 、RIGHT(s,n) 从字符串s左/右边开始截取n位字符串

    报错注入

    UPDATEXML函数

    UPDATEXML (XML_document, XPath_string, new_value);  第一个参数:XML_document是String格式,为XML文档对象的名称,一般写1就可以了 第二个参数:XPath_string (Xpath格式的字符串) ,不必了解Xpath语法,我们一般是写sql语句查询表名等,通过报错信息显示出来。 第三个参数:new_value,String格式,替换查找到的符合条件的数据,一般写1就可以了 作用:改变文档中符合条件的节点的值

    还有floor、extractvalue等函数也可以用于报错注入

    时间盲注

    sleep(N)函数

    运行N秒。

    IF(expr,v1,v2)函数

    如果表达式expr成立,返回v1,否则返回v2。与sleep函数结合通过网页多久后返回来判断结果。

    sql语句

    SELECT ascii(substr(database(),1,1)) and if(length(database())>17,sleep(2),1)

     等待2秒后,返回0

    2秒后返回 SELECT ascii(substr(database(),1,1)) and if(length(database())>18,sleep(2),1) 立刻返回

     数据库长度>17但不>18,即数据库长度为18。

    更多内容查看:网络安全-自学笔记

    喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

     

    Processed: 0.011, SQL: 8