SQL注入-SQL注入基础

    xiaoxiao2022-07-02  108

    SQL注入原理 语言分类:解释型语言和编译型语言。解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。而编译型语言是代码在生成时转换为机器指令,然后在运行时直接由使用该语言的计算机执行这些指令。 在解释型语言中,如果程序与用户进行交互。用户就可以构造特殊的输入来拼接到程序中执行,从而使得程序依据用户输入执行有可能存在恶意行为的代码。 例如:在与用户交互的程序中,用户的输入拼接到SQL语句中,执行了与原定计划不同的行为,从而产生了SQl注入漏洞。 例如:某登陆SQL语句:select * from admin where username=‘用户名’ and password=‘用户密码’ 用户输入的内容可有用户自行控制,例如可以输入’or 1=1 --空格 此时在后台执行程序没有对用户输入进行安全验证的情况下就会执行拼接后的SQL语句: select * from admin where username=’'or 1=1 – 'and password=‘用户密码’ 其中or 1=1永远为真,–注释后边内容不再执行,因此SQL语句执行返回admin表中的所有内容。

    SQL注入验证: 1、目标搜集:

    无特定目标: 搜索引擎查找–inusr:.php?id=

    有特定目标: inurl:.php?id=site:target.com

    工具爬取: spider,对搜索引擎和目标网站的链接进行爬取 2. 注入识别: 手工简单识别: ’ and 1=1 / and 1=2 and ‘1’='1 / and ‘1’='2 and 1 like 1 / and 1 like 2

    工具识别: sqlmap -m filename (filename中保存检测目标) sqlmap --crawl (sqlmap对目标网站进行爬取,然后一次进行测试)

    高级识别: 扩展识别广度和深度: sqlmap --level增加测试级别,对headedr中相关参数也进行测试 sqlmap -r filename (filename中为网站请求数据)

    利用工具提高识别效率: BurpSuite + SqlMap BurpSuite拦截所有浏览器访问提交的数据 BurpSuite扩展插件,直接调用SqlMap进行测试

    一些Tips: 可以在参数后面添加’*'号使得其成为一个测试点 可能出现注入的点: 新闻、登录、搜索、留言… 站在开发的角度去寻找

    代码审计: 搜索关键代码和函数 梳理业务流程

    举例: 强网杯WEB: “Python is the best language” 如果页面中Mysql报错,证明该页面存在SQl注入漏洞。

    MySQL注入相关知识 在Mysql 5.0以上的版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息。其中具有表schemata(数据库名)、tables(表名)、columns(列名或字段名)。 在schemata表中,schema_name字段用来存储数据库名。 在tables表中,table_schema和table_name分别用来存储数据库名和表名。 在columns表中,table_schema(数据库名)、table_name(表名)、columns_name(字段名)

    SQL语句增删改查 SELECT 列名称 FROM 表名称 WHERE 字段1=‘条件1’ AND 字段2=‘条件2’ INSERT INTO table_name(列1,列2…) VALUES(值1, 值2,…) UPDATE 表名称 SET 列名称=新值 WHERE 列名称=某值 DELETE FROM 表名称 WHERE 列名称=值

    MySQL注入方法逻辑运算及常用函数 system_user() 系统用户名 user() 用户名 current_user() 当前用户 session_user() 连接数据库的用户名 database() 数据库名 version() 数据库的版本 @@datadir 数据库路径 @@basedir 数据库安装路径 @@version_compile_os 操作系统 limit关键字 limit m,n从m行开始,到m+n行。 count() 返回执行结果数量 concat() 没有分隔符地连接字符串 concat_ws() 含有分隔符地连接字符串 group_concat() 连接一个组的所有字符串,并以逗号分隔每一条记录 load_file() 读取本地文件 into outfile 写文件 ascii() 字符串的ASCII代码值 ord() 返回字符串第一个字符的ASCII值 mid() 返回一个字符串的一部分 substr() 返回一个字符串的一部分 length() 返回字符串的长度 left() 返回字符串最左边的几个字符 floor() 返回小于或等于x的最大整数 rand() 返回0和1之间的一个随机数 extractvalue 第一个参数:XML_document是String格式,为XML文档对象的名称文中为Doc;第二个参数:XPath_string(Xpath格式的字符串),作用:从目标XML中返回包含所查值的字符串。 updatexml() 第一个参数:XML_document是String格式,为XML文档对象的名称。文中为Doc;第二个参数:XPath_string (Xpath格式的字符串) ;第三个参数: new value, String格式,替换查找到的符合条件的数据。作用: 改变文档中符合条件的节点的值 sleep() 让此语句运行N秒钟 if() > select if(1>2,2,3); -->3 clar() 返回整数ASCII代码字符组成的字符串 STRCMP() 比较字符串的内容 ifnull() 假如参数1补位null, 则返回值为参数1, 否则返回参数二的值 exp() 返回e的x次方

    SQL注入流程 1.信息搜集: 数据库类型 |(check the manual that corresponds to your MySQL server version for the right syntax.) 报错信息 |(Microsoft JET Database Engine 错误‘80040e14’) 特有语句 数据库版本 |(函数:version() @@version v$version) 数据库用户 |(user() SYSTEM_USER) 判断数据库权限 |(super_priv IS_SRVROLEMEMBER)

    2.数据获取:(通过语句查询;通过暴力破解) 获取数据库信息 获取当前库 获取所有库 获取表信息 获取列信息 获取数据

    3.提权: 根据数据库权限 执行系统命令->直接提权 |(SQLServer sa权限) 读文件 读数据库配置文件,尝试远程连接 读系统配置文件,搜索信息 写问件->写webshell到网站目录

    SQL手工注入方法 01 MySQL数据库结构 存储引擎层: 磁盘,内存,网络,实现了数据的存储和读取 SQL层:解析器|查询执行|授权|查询高速缓存|优化器|查询日志记录 SQL层的功能: 1. 判断语法、语句、语义 2. 数据库对象授权情况判断,授权失败不继续 3. 解析(解析器):将sql语句解析成执行计划,运行执行计划, 生成找数据库的方式。 4,优化(优化器):运行执行计划,基于算法,从执行计划中选择代价 最小的交给”执行器“。 5,执行(执行器):运行执行计划,最终生产如何去磁盘找数据方式。 6,将取数据的方式,交由下层(存储引擎)进行处理。 7,最终将取出的数据抽象成管理员或用户能看懂的方式(表),展现。 8,查询缓存:缓存之前查询的数据。 连接层:通讯协议|线程|身份权限验证

    MySQL内置库(>=5.7): mysql: 保存有账户信息,权限信息,存储过程,event,时区等信息。 sys: 包含了一系列的存储过程、自定义函数以及试图来帮助我们快速的了解 系统的元数据信息。(元数据是关于数据的数据,如数据库名或表明 列的数据类型,或访问权限等) performance_schema: 用于收集数据库服务器性能参数 information_schema: 它提供了访问数据库元数据的方式。 其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据 库名,数据库的表,表的数据类型与访问权限等。

    02 MySQL手工注入方法 核心原理: MySql内置的information_schema库,它功能强大,是我们进行MySql注入 的基石! 通过information_schema我们可以窥透整个MySQL的运行情况,也可以查 看到数据库中的数据信息。

    查询数据核心语法: 查库:select schema_name from information_schema.schemata 查表;select table_name from information_schema.tables where table _schema=库名 查列:select column_name from information_schema.columns where table_name=表名 查数据:select 列名 from 库名.表名

    tips: 1. 所有类型的sql注入,都是基于查库、表、列的语句 2. 如果数据太多,可能导致无法返回查询结果: 查询场景:可以利用limit限定返回的数量及位置,依次查询 回显数据的场景:concat连接多个数据成为一条返回结果。 3. 在一些场景下,想要快速获取数据,需要借助工具,如: BurpSuite

    最新回复(0)